From: Roman Lebedev Date: Mon, 1 Jul 2019 13:31:06 +0000 (+0000) Subject: [NFC][InstCombine] Improve test coverage for ((~x) + y) + 1 -> y - x fold fold ... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e93a6479cb4563f363b2ce35d4dbe033bd006c2e;p=llvm [NFC][InstCombine] Improve test coverage for ((~x) + y) + 1 -> y - x fold fold (PR42459) So we indeed to have this fold, but only if +1 is not the last operation.. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364764 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Transforms/InstCombine/fold-inc-of-add-of-not-x-and-y-to-sub-x-from-y.ll b/test/Transforms/InstCombine/fold-inc-of-add-of-not-x-and-y-to-sub-x-from-y.ll index 54e3b87df8b..b47863650c3 100644 --- a/test/Transforms/InstCombine/fold-inc-of-add-of-not-x-and-y-to-sub-x-from-y.ll +++ b/test/Transforms/InstCombine/fold-inc-of-add-of-not-x-and-y-to-sub-x-from-y.ll @@ -138,27 +138,67 @@ define i32 @t7(i32 %x, i32 %y) { declare i32 @gen32() -define i32 @t8_commutative(i32 %x) { -; CHECK-LABEL: @t8_commutative( +define i32 @t8_commutative0(i32 %x) { +; CHECK-LABEL: @t8_commutative0( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() ; CHECK-NEXT: [[T0:%.*]] = xor i32 [[X:%.*]], -1 +; CHECK-NEXT: call void @use32(i32 [[T0]]) ; CHECK-NEXT: [[T1:%.*]] = add i32 [[Y]], [[T0]] +; CHECK-NEXT: call void @use32(i32 [[T1]]) ; CHECK-NEXT: [[T2:%.*]] = add i32 [[T1]], 1 ; CHECK-NEXT: ret i32 [[T2]] ; %y = call i32 @gen32() %t0 = xor i32 %x, -1 + call void @use32(i32 %t0) %t1 = add i32 %y, %t0 ; swapped + call void @use32(i32 %t1) %t2 = add i32 %t1, 1 ret i32 %t2 } +define i32 @t9_commutative1(i32 %x, i32 %y) { +; CHECK-LABEL: @t9_commutative1( +; CHECK-NEXT: [[T0:%.*]] = xor i32 [[X:%.*]], -1 +; CHECK-NEXT: call void @use32(i32 [[T0]]) +; CHECK-NEXT: [[T1:%.*]] = sub i32 0, [[X]] +; CHECK-NEXT: call void @use32(i32 [[T1]]) +; CHECK-NEXT: [[T2:%.*]] = sub i32 [[Y:%.*]], [[X]] +; CHECK-NEXT: ret i32 [[T2]] +; + %t0 = xor i32 %x, -1 + call void @use32(i32 %t0) + %t1 = add i32 %t0, 1 ; +1 is not last + call void @use32(i32 %t1) + %t2 = add i32 %t1, %y ; + ret i32 %t2 +} + +define i32 @t10_commutative2(i32 %x) { +; CHECK-LABEL: @t10_commutative2( +; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() +; CHECK-NEXT: [[T0:%.*]] = xor i32 [[X:%.*]], -1 +; CHECK-NEXT: call void @use32(i32 [[T0]]) +; CHECK-NEXT: [[T1:%.*]] = sub i32 0, [[X]] +; CHECK-NEXT: call void @use32(i32 [[T1]]) +; CHECK-NEXT: [[T2:%.*]] = sub i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[T2]] +; + %y = call i32 @gen32() + %t0 = xor i32 %x, -1 + call void @use32(i32 %t0) + %t1 = add i32 %t0, 1 ; +1 is not last + call void @use32(i32 %t1) + %t2 = add i32 %y, %t1 ; swapped + ret i32 %t2 +} + ;------------------------------------------------------------------------------; ; Basic negative tests ;------------------------------------------------------------------------------; -define i32 @n9(i32 %x, i32 %y) { -; CHECK-LABEL: @n9( +define i32 @n11(i32 %x, i32 %y) { +; CHECK-LABEL: @n11( ; CHECK-NEXT: [[T0:%.*]] = xor i32 [[X:%.*]], 2147483647 ; CHECK-NEXT: [[T1:%.*]] = add i32 [[T0]], [[Y:%.*]] ; CHECK-NEXT: [[T2:%.*]] = add i32 [[T1]], 1 @@ -170,8 +210,8 @@ define i32 @n9(i32 %x, i32 %y) { ret i32 %t2 } -define i32 @n10(i32 %x, i32 %y) { -; CHECK-LABEL: @n10( +define i32 @n12(i32 %x, i32 %y) { +; CHECK-LABEL: @n12( ; CHECK-NEXT: [[T0:%.*]] = xor i32 [[X:%.*]], -1 ; CHECK-NEXT: [[T1:%.*]] = add i32 [[T0]], [[Y:%.*]] ; CHECK-NEXT: [[T2:%.*]] = add i32 [[T1]], 2