diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2018-05-23 17:47:52 +0000 |
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2018-05-23 17:47:52 +0000 |
| commit | 6b6c553bb895c2b8fe85a555010d5ae39fffa7dc (patch) | |
| tree | b368c372d3f2954a5d9541679226ee5793f1f98d /llvm/test/Transforms | |
| parent | 356d60683bafd8302675514b0dacb987a51a2db0 (diff) | |
| download | bcm5719-llvm-6b6c553bb895c2b8fe85a555010d5ae39fffa7dc.tar.gz bcm5719-llvm-6b6c553bb895c2b8fe85a555010d5ae39fffa7dc.zip | |
[InstCombine] Fold unfolded masked merge pattern with variable mask!
Summary:
Finally fixes [[ https://bugs.llvm.org/show_bug.cgi?id=6773 | PR6773 ]].
Now that the backend is all done, we can finally fold it!
The canonical unfolded masked merge pattern is
```(x & m) | (y & ~m)```
There is a second, equivalent variant:
```(x | ~m) & (y | m)```
Only one of them (the or-of-and's i think) is canonical.
And if the mask is not a constant, we should fold it to:
```((x ^ y) & M) ^ y```
https://rise4fun.com/Alive/ndQw
Reviewers: spatel, craig.topper
Reviewed By: spatel
Subscribers: nicholas, RKSimon, llvm-commits
Differential Revision: https://reviews.llvm.org/D46814
llvm-svn: 333106
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/and-or-not.ll | 7 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/masked-merge-add.ll | 70 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/masked-merge-and-of-ors.ll | 76 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/masked-merge-or.ll | 70 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/masked-merge-xor.ll | 70 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/vec_sext.ll | 14 |
6 files changed, 132 insertions, 175 deletions
diff --git a/llvm/test/Transforms/InstCombine/and-or-not.ll b/llvm/test/Transforms/InstCombine/and-or-not.ll index 7bd4ad7b3bb..b55a53d72ba 100644 --- a/llvm/test/Transforms/InstCombine/and-or-not.ll +++ b/llvm/test/Transforms/InstCombine/and-or-not.ll @@ -502,11 +502,10 @@ define i32 @xor_to_xor12(float %fa, float %fb) { define i64 @PR32830(i64 %a, i64 %b, i64 %c) { ; CHECK-LABEL: @PR32830( -; CHECK-NEXT: [[NOTA:%.*]] = xor i64 [[A:%.*]], -1 ; CHECK-NEXT: [[NOTB:%.*]] = xor i64 [[B:%.*]], -1 -; CHECK-NEXT: [[OR1:%.*]] = or i64 [[NOTB]], [[A]] -; CHECK-NEXT: [[OR2:%.*]] = or i64 [[NOTA]], [[C:%.*]] -; CHECK-NEXT: [[AND:%.*]] = and i64 [[OR1]], [[OR2]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i64 [[NOTB]], [[C:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i64 [[TMP1]], [[A:%.*]] +; CHECK-NEXT: [[AND:%.*]] = xor i64 [[TMP2]], [[NOTB]] ; CHECK-NEXT: ret i64 [[AND]] ; %nota = xor i64 %a, -1 diff --git a/llvm/test/Transforms/InstCombine/masked-merge-add.ll b/llvm/test/Transforms/InstCombine/masked-merge-add.ll index 40ee8952fbf..d64745674b3 100644 --- a/llvm/test/Transforms/InstCombine/masked-merge-add.ll +++ b/llvm/test/Transforms/InstCombine/masked-merge-add.ll @@ -18,10 +18,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %x, %m @@ -33,10 +32,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { ; CHECK-LABEL: @p_splatvec( -; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[M]], <i32 -1, i32 -1> -; CHECK-NEXT: [[AND1:%.*]] = and <2 x i32> [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or <2 x i32> [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <2 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <2 x i32> [[RET]] ; %and = and <2 x i32> %x, %m @@ -48,10 +46,9 @@ define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { define <3 x i32> @p_vec_undef(<3 x i32> %x, <3 x i32> %y, <3 x i32> %m) { ; CHECK-LABEL: @p_vec_undef( -; CHECK-NEXT: [[AND:%.*]] = and <3 x i32> [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor <3 x i32> [[M]], <i32 -1, i32 undef, i32 -1> -; CHECK-NEXT: [[AND1:%.*]] = and <3 x i32> [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or <3 x i32> [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <3 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <3 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <3 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <3 x i32> [[RET]] ; %and = and <3 x i32> %x, %m @@ -182,10 +179,9 @@ declare i32 @gen32() define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative0( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %m, %x ; swapped order @@ -198,10 +194,9 @@ define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative1(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative1( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -214,10 +209,9 @@ define i32 @p_commutative1(i32 %x, i32 %m) { define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative2( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %x, %m @@ -230,10 +224,9 @@ define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative3(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative3( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -246,10 +239,9 @@ define i32 @p_commutative3(i32 %x, i32 %m) { define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative4( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %m, %x ; swapped order @@ -262,10 +254,9 @@ define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative5(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative5( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -279,10 +270,9 @@ define i32 @p_commutative5(i32 %x, i32 %m) { define i32 @p_commutative6(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative6( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() diff --git a/llvm/test/Transforms/InstCombine/masked-merge-and-of-ors.ll b/llvm/test/Transforms/InstCombine/masked-merge-and-of-ors.ll index 48346ad6505..97ca3df709d 100644 --- a/llvm/test/Transforms/InstCombine/masked-merge-and-of-ors.ll +++ b/llvm/test/Transforms/InstCombine/masked-merge-and-of-ors.ll @@ -16,10 +16,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p( -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %neg = xor i32 %m, -1 @@ -31,10 +30,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { ; CHECK-LABEL: @p_splatvec( -; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[M:%.*]], <i32 -1, i32 -1> -; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or <2 x i32> [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and <2 x i32> [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <2 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <2 x i32> [[RET]] ; %neg = xor <2 x i32> %m, <i32 -1, i32 -1> @@ -46,10 +44,9 @@ define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { define <3 x i32> @p_vec_undef(<3 x i32> %x, <3 x i32> %y, <3 x i32> %m) { ; CHECK-LABEL: @p_vec_undef( -; CHECK-NEXT: [[NEG:%.*]] = xor <3 x i32> [[M:%.*]], <i32 -1, i32 undef, i32 -1> -; CHECK-NEXT: [[OR:%.*]] = or <3 x i32> [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or <3 x i32> [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and <3 x i32> [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <3 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <3 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <3 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <3 x i32> [[RET]] ; %neg = xor <3 x i32> %m, <i32 -1, i32 undef, i32 -1> @@ -124,10 +121,9 @@ declare i32 @gen32() define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative0( -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %neg = xor i32 %m, -1 @@ -140,10 +136,9 @@ define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative1(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative1( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -156,10 +151,9 @@ define i32 @p_commutative1(i32 %x, i32 %m) { define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative2( -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR1]], [[OR]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %neg = xor i32 %m, -1 @@ -172,10 +166,9 @@ define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative3(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative3( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -188,10 +181,9 @@ define i32 @p_commutative3(i32 %x, i32 %m) { define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative4( -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR1]], [[OR]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %neg = xor i32 %m, -1 @@ -204,10 +196,9 @@ define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative5(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative5( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR1]], [[OR]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -221,10 +212,9 @@ define i32 @p_commutative5(i32 %x, i32 %m) { define i32 @p_commutative6(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative6( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR1]], [[OR]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -259,9 +249,9 @@ declare void @use32(i32) define i32 @n0_oneuse_of_neg_is_ok_0(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @n0_oneuse_of_neg_is_ok_0( ; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M:%.*]], -1 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[NEG]], [[X:%.*]] -; CHECK-NEXT: [[OR1:%.*]] = or i32 [[Y:%.*]], [[M]] -; CHECK-NEXT: [[RET:%.*]] = and i32 [[OR]], [[OR1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: call void @use32(i32 [[NEG]]) ; CHECK-NEXT: ret i32 [[RET]] ; diff --git a/llvm/test/Transforms/InstCombine/masked-merge-or.ll b/llvm/test/Transforms/InstCombine/masked-merge-or.ll index 377d4325204..b6c67e28267 100644 --- a/llvm/test/Transforms/InstCombine/masked-merge-or.ll +++ b/llvm/test/Transforms/InstCombine/masked-merge-or.ll @@ -18,10 +18,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %x, %m @@ -33,10 +32,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { ; CHECK-LABEL: @p_splatvec( -; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[M]], <i32 -1, i32 -1> -; CHECK-NEXT: [[AND1:%.*]] = and <2 x i32> [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or <2 x i32> [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <2 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <2 x i32> [[RET]] ; %and = and <2 x i32> %x, %m @@ -48,10 +46,9 @@ define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { define <3 x i32> @p_vec_undef(<3 x i32> %x, <3 x i32> %y, <3 x i32> %m) { ; CHECK-LABEL: @p_vec_undef( -; CHECK-NEXT: [[AND:%.*]] = and <3 x i32> [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor <3 x i32> [[M]], <i32 -1, i32 undef, i32 -1> -; CHECK-NEXT: [[AND1:%.*]] = and <3 x i32> [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or <3 x i32> [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <3 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <3 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <3 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <3 x i32> [[RET]] ; %and = and <3 x i32> %x, %m @@ -182,10 +179,9 @@ declare i32 @gen32() define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative0( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %m, %x ; swapped order @@ -198,10 +194,9 @@ define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative1(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative1( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -214,10 +209,9 @@ define i32 @p_commutative1(i32 %x, i32 %m) { define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative2( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %x, %m @@ -230,10 +224,9 @@ define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative3(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative3( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -246,10 +239,9 @@ define i32 @p_commutative3(i32 %x, i32 %m) { define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative4( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %m, %x ; swapped order @@ -262,10 +254,9 @@ define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative5(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative5( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -279,10 +270,9 @@ define i32 @p_commutative5(i32 %x, i32 %m) { define i32 @p_commutative6(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative6( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() diff --git a/llvm/test/Transforms/InstCombine/masked-merge-xor.ll b/llvm/test/Transforms/InstCombine/masked-merge-xor.ll index 6a3e9178ac9..7789ba90046 100644 --- a/llvm/test/Transforms/InstCombine/masked-merge-xor.ll +++ b/llvm/test/Transforms/InstCombine/masked-merge-xor.ll @@ -18,10 +18,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %x, %m @@ -33,10 +32,9 @@ define i32 @p(i32 %x, i32 %y, i32 %m) { define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { ; CHECK-LABEL: @p_splatvec( -; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[M]], <i32 -1, i32 -1> -; CHECK-NEXT: [[AND1:%.*]] = and <2 x i32> [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or <2 x i32> [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <2 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <2 x i32> [[RET]] ; %and = and <2 x i32> %x, %m @@ -48,10 +46,9 @@ define <2 x i32> @p_splatvec(<2 x i32> %x, <2 x i32> %y, <2 x i32> %m) { define <3 x i32> @p_vec_undef(<3 x i32> %x, <3 x i32> %y, <3 x i32> %m) { ; CHECK-LABEL: @p_vec_undef( -; CHECK-NEXT: [[AND:%.*]] = and <3 x i32> [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor <3 x i32> [[M]], <i32 -1, i32 undef, i32 -1> -; CHECK-NEXT: [[AND1:%.*]] = and <3 x i32> [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or <3 x i32> [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <3 x i32> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and <3 x i32> [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor <3 x i32> [[TMP2]], [[Y]] ; CHECK-NEXT: ret <3 x i32> [[RET]] ; %and = and <3 x i32> %x, %m @@ -182,10 +179,9 @@ declare i32 @gen32() define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative0( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %m, %x ; swapped order @@ -198,10 +194,9 @@ define i32 @p_commutative0(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative1(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative1( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -214,10 +209,9 @@ define i32 @p_commutative1(i32 %x, i32 %m) { define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative2( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %x, %m @@ -230,10 +224,9 @@ define i32 @p_commutative2(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative3(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative3( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND]], [[AND1]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -246,10 +239,9 @@ define i32 @p_commutative3(i32 %x, i32 %m) { define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { ; CHECK-LABEL: @p_commutative4( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NEG]], [[Y:%.*]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %and = and i32 %m, %x ; swapped order @@ -262,10 +254,9 @@ define i32 @p_commutative4(i32 %x, i32 %y, i32 %m) { define i32 @p_commutative5(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative5( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[M:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() @@ -279,10 +270,9 @@ define i32 @p_commutative5(i32 %x, i32 %m) { define i32 @p_commutative6(i32 %x, i32 %m) { ; CHECK-LABEL: @p_commutative6( ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32() -; CHECK-NEXT: [[AND:%.*]] = and i32 [[M:%.*]], [[X:%.*]] -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[M]], -1 -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[Y]], [[NEG]] -; CHECK-NEXT: [[RET:%.*]] = or i32 [[AND1]], [[AND]] +; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y]], [[X:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[M:%.*]] +; CHECK-NEXT: [[RET:%.*]] = xor i32 [[TMP2]], [[Y]] ; CHECK-NEXT: ret i32 [[RET]] ; %y = call i32 @gen32() diff --git a/llvm/test/Transforms/InstCombine/vec_sext.ll b/llvm/test/Transforms/InstCombine/vec_sext.ll index f4ee7df881b..69d49888aef 100644 --- a/llvm/test/Transforms/InstCombine/vec_sext.ll +++ b/llvm/test/Transforms/InstCombine/vec_sext.ll @@ -5,10 +5,9 @@ define <4 x i32> @psignd_3(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: @psignd_3( ; CHECK-NEXT: [[SUB:%.*]] = sub nsw <4 x i32> zeroinitializer, [[A:%.*]] ; CHECK-NEXT: [[B_LOBIT1:%.*]] = ashr <4 x i32> [[B:%.*]], <i32 31, i32 31, i32 31, i32 31> -; CHECK-NEXT: [[T1:%.*]] = xor <4 x i32> [[B_LOBIT1]], <i32 -1, i32 -1, i32 -1, i32 -1> -; CHECK-NEXT: [[T2:%.*]] = and <4 x i32> [[T1]], [[A]] -; CHECK-NEXT: [[T3:%.*]] = and <4 x i32> [[B_LOBIT1]], [[SUB]] -; CHECK-NEXT: [[COND:%.*]] = or <4 x i32> [[T2]], [[T3]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i32> [[SUB]], [[A]] +; CHECK-NEXT: [[TMP2:%.*]] = and <4 x i32> [[TMP1]], [[B_LOBIT1]] +; CHECK-NEXT: [[COND:%.*]] = xor <4 x i32> [[TMP2]], [[A]] ; CHECK-NEXT: ret <4 x i32> [[COND]] ; %cmp = icmp slt <4 x i32> %b, zeroinitializer @@ -27,10 +26,9 @@ define <4 x i32> @test1(<4 x i32> %a, <4 x i32> %b) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: [[SUB:%.*]] = sub nsw <4 x i32> zeroinitializer, [[A:%.*]] ; CHECK-NEXT: [[B_LOBIT1:%.*]] = ashr <4 x i32> [[B:%.*]], <i32 31, i32 31, i32 31, i32 31> -; CHECK-NEXT: [[B_LOBIT1_NOT:%.*]] = xor <4 x i32> [[B_LOBIT1]], <i32 -1, i32 -1, i32 -1, i32 -1> -; CHECK-NEXT: [[T2:%.*]] = and <4 x i32> [[B_LOBIT1]], [[A]] -; CHECK-NEXT: [[T3:%.*]] = and <4 x i32> [[B_LOBIT1_NOT]], [[SUB]] -; CHECK-NEXT: [[COND:%.*]] = or <4 x i32> [[T2]], [[T3]] +; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i32> [[SUB]], [[A]] +; CHECK-NEXT: [[TMP2:%.*]] = and <4 x i32> [[TMP1]], [[B_LOBIT1]] +; CHECK-NEXT: [[COND:%.*]] = xor <4 x i32> [[TMP2]], [[SUB]] ; CHECK-NEXT: ret <4 x i32> [[COND]] ; %cmp = icmp sgt <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1> |

