When the two operands of an icmp are equal, there are five possible predicates
authorNick Lewycky <nicholas@mxc.ca>
Thu, 6 Sep 2007 01:10:22 +0000 (01:10 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 6 Sep 2007 01:10:22 +0000 (01:10 +0000)
that would make the icmp true. Fixes PR1637.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41740 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/2007-09-05-EqualGEP.ll [new file with mode: 0644]

index 9db10340a1298a4f836bf7b8cf49b78972a1cf06..58eb3bc2750f82980bfb9c9cb1a5b4d9ec1f3eee 100644 (file)
@@ -4563,7 +4563,9 @@ Instruction *InstCombiner::FoldGEPICmp(User *GEPLHS, Value *RHS,
       if (NumDifferences == 0)   // SAME GEP?
         return ReplaceInstUsesWith(I, // No comparison is needed here.
                                    ConstantInt::get(Type::Int1Ty, 
-                                                    Cond == ICmpInst::ICMP_EQ));
+                                                    Cond == ICmpInst::ICMP_EQ ||
+                     Cond == ICmpInst::ICMP_ULE || Cond == ICmpInst::ICMP_UGE ||
+                     Cond == ICmpInst::ICMP_SLE || Cond == ICmpInst::ICMP_SGE));
       else if (NumDifferences == 1) {
         Value *LHSV = GEPLHS->getOperand(DiffOperand);
         Value *RHSV = GEPRHS->getOperand(DiffOperand);
diff --git a/test/Transforms/InstCombine/2007-09-05-EqualGEP.ll b/test/Transforms/InstCombine/2007-09-05-EqualGEP.ll
new file mode 100644 (file)
index 0000000..77bae78
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i1 true}
+; PR1637
+
+define i1 @f(i8* %arr) {
+        %X = getelementptr i8* %arr, i32 1
+        %Y = getelementptr i8* %arr, i32 1
+        %test = icmp uge i8* %X, %Y
+        ret i1 %test
+}
+