Fix Transforms/InstCombine/2007-01-13-ExtCompareMiscompile.ll, which is part
authorChris Lattner <sabre@nondot.org>
Sat, 13 Jan 2007 23:11:38 +0000 (23:11 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 13 Jan 2007 23:11:38 +0000 (23:11 +0000)
of PR1107

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

lib/Transforms/Scalar/InstructionCombining.cpp

index aecc9a93ef1aa6ad401899dd3bb6c6caf93dc8a5..743502240d47d7672aaac456659df8591e607ec6 100644 (file)
@@ -5263,9 +5263,19 @@ Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) {
     RHSCIOp = CI->getOperand(0);
     if (RHSCIOp->getType() != LHSCIOp->getType()) 
       return 0;
-    else
-      // Okay, just insert a compare of the reduced operands now!
-      return new ICmpInst(ICI.getPredicate(), LHSCIOp, RHSCIOp);
+    
+    // If the signedness of the two compares doesn't agree (i.e. one is a sext
+    // and the other is a zext), then we can't handle this.
+    if (CI->getOpcode() != LHSCI->getOpcode())
+      return 0;
+
+    // Likewise, if the signedness of the [sz]exts and the compare don't match, 
+    // then we can't handle this.
+    if (isSignedExt != isSignedCmp && !ICI.isEquality())
+      return 0;
+    
+    // Okay, just insert a compare of the reduced operands now!
+    return new ICmpInst(ICI.getPredicate(), LHSCIOp, RHSCIOp);
   }
 
   // If we aren't dealing with a constant on the RHS, exit early