Expand this test to handle more cases (remainder and shifts) of zero.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73839 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2009-06-21 01:56:41 +00:00
parent 5b038b793c
commit e47f59db44
2 changed files with 26 additions and 8 deletions

View File

@ -629,7 +629,7 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
}
}
// Handle simplifications of the RHS when a constant int.
// Handle simplifications when the RHS is a constant int.
if (const ConstantInt *CI2 = dyn_cast<ConstantInt>(C2)) {
switch (Opcode) {
case Instruction::Add:
@ -773,13 +773,20 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
}
}
}
// 0 / x -> 0.
if ((Opcode == Instruction::UDiv ||
Opcode == Instruction::SDiv) &&
CI1->isZero())
return const_cast<Constant*>(C1);
switch (Opcode) {
case Instruction::SDiv:
case Instruction::UDiv:
case Instruction::URem:
case Instruction::SRem:
case Instruction::LShr:
case Instruction::AShr:
case Instruction::Shl:
if (CI1->equalsInt(0)) return const_cast<Constant*>(C1);
break;
default:
break;
}
} else if (const ConstantFP *CFP1 = dyn_cast<ConstantFP>(C1)) {
if (const ConstantFP *CFP2 = dyn_cast<ConstantFP>(C2)) {
APFloat C1V = CFP1->getValueAPF();

View File

@ -0,0 +1,11 @@
; RUN: llvm-as < %s | llvm-dis | not grep ptrtoint
; PR4424
@G = external global i32
@test1 = constant i32 sdiv (i32 0, i32 ptrtoint (i32* @G to i32))
@test2 = constant i32 udiv (i32 0, i32 ptrtoint (i32* @G to i32))
@test3 = constant i32 srem (i32 0, i32 ptrtoint (i32* @G to i32))
@test4 = constant i32 urem (i32 0, i32 ptrtoint (i32* @G to i32))
@test5 = constant i32 lshr (i32 0, i32 ptrtoint (i32* @G to i32))
@test6 = constant i32 ashr (i32 0, i32 ptrtoint (i32* @G to i32))
@test7 = constant i32 shl (i32 0, i32 ptrtoint (i32* @G to i32))