diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2020-01-04 16:50:53 +0300 |
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2020-01-04 17:30:51 +0300 |
| commit | 772ede3d5d552e0214473f247f7f98f15e596fe5 (patch) | |
| tree | ec805d546dcd3c3221ae62298421dfdeef9a0f12 /llvm/test/Transforms/InstCombine/sub-minmax.ll | |
| parent | d2b79c76be5b1613d80364888286e7ead70674eb (diff) | |
| download | bcm5719-llvm-772ede3d5d552e0214473f247f7f98f15e596fe5.tar.gz bcm5719-llvm-772ede3d5d552e0214473f247f7f98f15e596fe5.zip | |
[InstCombine] Sink sub into hands of select if one hand becomes zero. Part 2 (PR44426)
This decreases use count of %Op0, makes one hand of select to be 0,
and possibly exposes further folding potential.
Name: sub %Op0, (select %Cond, %Op0, %FalseVal) -> select %Cond, 0, (sub %Op0, %FalseVal)
%Op0 = %TrueVal
%o = select i1 %Cond, i8 %Op0, i8 %FalseVal
%r = sub i8 %Op0, %o
=>
%n = sub i8 %Op0, %FalseVal
%r = select i1 %Cond, i8 0, i8 %n
Name: sub %Op0, (select %Cond, %TrueVal, %Op0) -> select %Cond, (sub %Op0, %TrueVal), 0
%Op0 = %FalseVal
%o = select i1 %Cond, i8 %TrueVal, i8 %Op0
%r = sub i8 %Op0, %o
=>
%n = sub i8 %Op0, %TrueVal
%r = select i1 %Cond, i8 %n, i8 0
https://rise4fun.com/Alive/aHRt
https://bugs.llvm.org/show_bug.cgi?id=44426
Diffstat (limited to 'llvm/test/Transforms/InstCombine/sub-minmax.ll')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/sub-minmax.ll | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/llvm/test/Transforms/InstCombine/sub-minmax.ll b/llvm/test/Transforms/InstCombine/sub-minmax.ll index 7fb5e31d81e..58edf37195f 100644 --- a/llvm/test/Transforms/InstCombine/sub-minmax.ll +++ b/llvm/test/Transforms/InstCombine/sub-minmax.ll @@ -18,10 +18,8 @@ define i32 @max_na_b_minux_na(i32 %A, i32 %B) { define i32 @na_minus_max_na_b(i32 %A, i32 %B) { ; CHECK-LABEL: @na_minus_max_na_b( ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[L0:%.*]] = icmp ult i32 [[NOT]], [[B:%.*]] -; CHECK-NEXT: [[L1:%.*]] = select i1 [[L0]], i32 [[NOT]], i32 [[B]] -; CHECK-NEXT: [[X:%.*]] = sub i32 [[NOT]], [[L1]] -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B:%.*]]) +; CHECK-NEXT: ret i32 [[TMP1]] ; %not = xor i32 %A, -1 %l0 = icmp ult i32 %not, %B @@ -47,10 +45,8 @@ define i32 @max_b_na_minus_na(i32 %A, i32 %B) { define i32 @na_minus_max_b_na(i32 %A, i32 %B) { ; CHECK-LABEL: @na_minus_max_b_na( ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[L0:%.*]] = icmp ugt i32 [[NOT]], [[B:%.*]] -; CHECK-NEXT: [[L1:%.*]] = select i1 [[L0]], i32 [[B]], i32 [[NOT]] -; CHECK-NEXT: [[X:%.*]] = sub i32 [[NOT]], [[L1]] -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B:%.*]]) +; CHECK-NEXT: ret i32 [[TMP1]] ; %not = xor i32 %A, -1 %l0 = icmp ugt i32 %not, %B @@ -62,10 +58,9 @@ define i32 @na_minus_max_b_na(i32 %A, i32 %B) { define i32 @max_na_bi_minux_na(i32 %A, i32 %Bi) { ; CHECK-LABEL: @max_na_bi_minux_na( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[A:%.*]], [[BI:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[BI]], i32 [[A]] -; CHECK-NEXT: [[X:%.*]] = sub i32 [[A]], [[TMP2]] -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-NEXT: [[TMP2:%.*]] = sub i32 0, [[TMP1]] +; CHECK-NEXT: ret i32 [[TMP2]] ; %B = xor i32 %Bi, -1 %not = xor i32 %A, -1 @@ -90,10 +85,9 @@ define i32 @na_minus_max_na_bi(i32 %A, i32 %Bi) { define i32 @max_bi_na_minus_na(i32 %A, i32 %Bi) { ; CHECK-LABEL: @max_bi_na_minus_na( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[A:%.*]], [[BI:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[BI]], i32 [[A]] -; CHECK-NEXT: [[X:%.*]] = sub i32 [[A]], [[TMP2]] -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-NEXT: [[TMP2:%.*]] = sub i32 0, [[TMP1]] +; CHECK-NEXT: ret i32 [[TMP2]] ; %B = xor i32 %Bi, -1 %not = xor i32 %A, -1 |

