diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2009-06-21 01:56:41 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2009-06-21 01:56:41 +0000 |
commit | e47f59db448fd468bb32ade37a1fa7ee8a9bff20 (patch) | |
tree | d98d824b8a00c4d6c0a454f1e862f3d808822c1a | |
parent | 5b038b793cef0ad0697209c64621fd80f507bb0b (diff) |
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
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 23 | ||||
-rw-r--r-- | test/Transforms/ConstProp/2009-06-20-constexpr-zero-lhs.ll | 11 |
2 files changed, 26 insertions, 8 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index dc8fb39f17..3aab0cce37 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -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(); diff --git a/test/Transforms/ConstProp/2009-06-20-constexpr-zero-lhs.ll b/test/Transforms/ConstProp/2009-06-20-constexpr-zero-lhs.ll new file mode 100644 index 0000000000..332260590a --- /dev/null +++ b/test/Transforms/ConstProp/2009-06-20-constexpr-zero-lhs.ll @@ -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)) + |