implement PR4424: 0/x is always 0 for integer division.
authorChris Lattner <sabre@nondot.org>
Sun, 21 Jun 2009 01:15:55 +0000 (01:15 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 21 Jun 2009 01:15:55 +0000 (01:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73835 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstantFold.cpp
test/Transforms/ConstProp/div-zero.ll [new file with mode: 0644]

index 6c392145a504b671a5e7cbfb119c52ccd82ac27f..dc8fb39f1731c9fa2e996dd8b39a9a45686eac6d 100644 (file)
@@ -773,6 +773,13 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
       }
       }
     }
+    
+    // 0 / x -> 0.
+    if ((Opcode == Instruction::UDiv ||
+         Opcode == Instruction::SDiv) &&
+        CI1->isZero())
+      return const_cast<Constant*>(C1);
+    
   } 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/div-zero.ll b/test/Transforms/ConstProp/div-zero.ll
new file mode 100644 (file)
index 0000000..166c643
--- /dev/null
@@ -0,0 +1,12 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 0}
+; PR4424
+declare void @ext()
+
+define i32 @foo(i32 %ptr) {
+entry:
+        %zero = sub i32 %ptr, %ptr              ; <i32> [#uses=1]
+        %div_zero = sdiv i32 %zero, ptrtoint (i32* getelementptr (i32* null,
+i32 1) to i32)             ; <i32> [#uses=1]
+        ret i32 %div_zero
+}
+