Fix an incorrect logic causing instcombine to miss some _chk -> non-chk transformations.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 23 Mar 2010 06:06:09 +0000 (06:06 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 23 Mar 2010 06:06:09 +0000 (06:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99263 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCalls.cpp
test/Transforms/InstCombine/objsize.ll

index 65f2e15d2780b958456d5b825204966a3c38790e..76c815da862881eb269d3cacbfcdfa0e9d06a5d5 100644 (file)
@@ -766,7 +766,7 @@ protected:
         return SizeCI->getZExtValue() >=
                GetStringLength(CI->getOperand(SizeArgOp));
       if (ConstantInt *Arg = dyn_cast<ConstantInt>(CI->getOperand(SizeArgOp)))
-        return SizeCI->getZExtValue() <= Arg->getZExtValue();
+        return SizeCI->getZExtValue() >= Arg->getZExtValue();
     }
     return false;
   }
index cd7b7c80679b9ac913a2087eadc91338b36383df..f8b2ffca01ede7fcd01e943351b54e02657d8d8a 100644 (file)
@@ -118,6 +118,7 @@ entry:
   ret i32 0
 }
 
+; rdar://7782496
 @s = external global i8*
 
 define void @test5(i32 %n) nounwind ssp {
@@ -127,11 +128,23 @@ entry:
   %1 = tail call i32 @llvm.objectsize.i32(i8* %0, i1 false)
   %2 = load i8** @s, align 8
 ; CHECK-NOT: @llvm.objectsize
-; CHECK: @__memcpy_chk(i8* %0, i8* %1, i32 10, i32 20)
+; CHECK: @llvm.memcpy.i32(i8* %0, i8* %1, i32 10, i32 1)
   %3 = tail call i8* @__memcpy_chk(i8* %0, i8* %2, i32 10, i32 %1) nounwind
   ret void
 }
 
+define void @test6(i32 %n) nounwind ssp {
+; CHECK: @test6
+entry:
+  %0 = tail call noalias i8* @malloc(i32 20) nounwind
+  %1 = tail call i32 @llvm.objectsize.i32(i8* %0, i1 false)
+  %2 = load i8** @s, align 8
+; CHECK-NOT: @llvm.objectsize
+; CHECK: @__memcpy_chk(i8* %0, i8* %1, i32 30, i32 20)
+  %3 = tail call i8* @__memcpy_chk(i8* %0, i8* %2, i32 30, i32 %1) nounwind
+  ret void
+}
+
 declare i8* @__memset_chk(i8*, i32, i64, i64) nounwind
 
 declare noalias i8* @malloc(i32) nounwind