From c22a4eeec6967454c73d1430398298259e468b92 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 29 Jun 2013 10:28:04 +0000 Subject: InstCombine: FoldGEPICmp shouldn't change sign of base pointer comparison Changing the sign when comparing the base pointer would introduce all sorts of unexpected things like: %gep.i = getelementptr inbounds [1 x i8]* %a, i32 0, i32 0 %gep2.i = getelementptr inbounds [1 x i8]* %b, i32 0, i32 0 %cmp.i = icmp ult i8* %gep.i, %gep2.i %cmp.i1 = icmp ult [1 x i8]* %a, %b %cmp = icmp ne i1 %cmp.i, %cmp.i1 ret i1 %cmp into: %cmp.i = icmp slt [1 x i8]* %a, %b %cmp.i1 = icmp ult [1 x i8]* %a, %b %cmp = xor i1 %cmp.i, %cmp.i1 ret i1 %cmp By preserving the original sign, we now get: ret i1 false This fixes PR16483. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185259 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/getelementptr.ll | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'test/Transforms/InstCombine/getelementptr.ll') diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll index bb07736ef8..844678a674 100644 --- a/test/Transforms/InstCombine/getelementptr.ll +++ b/test/Transforms/InstCombine/getelementptr.ll @@ -509,4 +509,14 @@ define void @test39(%struct.ham* %arg, i8 %arg1) nounwind { ; CHECK: getelementptr inbounds i8* %tmp3, i64 -8 } +define i1 @pr16483([1 x i8]* %a, [1 x i8]* %b) { + %c = getelementptr [1 x i8]* %a, i32 0, i32 0 + %d = getelementptr [1 x i8]* %b, i32 0, i32 0 + %cmp = icmp ult i8* %c, %d + ret i1 %cmp + +; CHECK: @pr16483 +; CHECK-NEXT: icmp ult [1 x i8]* %a, %b +} + ; CHECK: attributes [[NUW]] = { nounwind } -- cgit v1.2.3