diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-08-24 06:49:36 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-08-24 06:49:36 +0000 |
commit | de19f749e0e6108de7eff4d77e8e6afa8c9f64cb (patch) | |
tree | e458142104c61ef86f4df305c195fd1283628c1d /llvm/test | |
parent | 2c75fe7f2a8b2f50573e144f3ccb9b1de43a8f8f (diff) | |
download | bcm5719-llvm-de19f749e0e6108de7eff4d77e8e6afa8c9f64cb.tar.gz bcm5719-llvm-de19f749e0e6108de7eff4d77e8e6afa8c9f64cb.zip |
[InstCombine] matchThreeWayIntCompare(): commutativity awareness
Summary:
`matchThreeWayIntCompare()` looks for
```
select i1 (a == b),
i32 Equal,
i32 (select i1 (a < b), i32 Less, i32 Greater)
```
but both of these selects/compares can be in it's commuted form,
so out of 8 variants, only the two most basic ones is handled.
This fixes regression being introduced in D66232.
Reviewers: spatel, nikic, efriedma, xbolva00
Reviewed By: spatel
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D66607
llvm-svn: 369841
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/Transforms/InstCombine/unrecognized_three-way-comparison.ll | 76 |
1 files changed, 24 insertions, 52 deletions
diff --git a/llvm/test/Transforms/InstCombine/unrecognized_three-way-comparison.ll b/llvm/test/Transforms/InstCombine/unrecognized_three-way-comparison.ll index 1ca16778299..14e0b557394 100644 --- a/llvm/test/Transforms/InstCombine/unrecognized_three-way-comparison.ll +++ b/llvm/test/Transforms/InstCombine/unrecognized_three-way-comparison.ll @@ -36,14 +36,10 @@ exit: define i32 @compare_against_zero(i32 %x) { ; CHECK-LABEL: @compare_against_zero( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[X:%.*]], 0 -; CHECK-NEXT: [[CMP2_INV:%.*]] = icmp sgt i32 [[X]], -1 -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2_INV]], i32 1, i32 -1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 0, i32 [[SELECT1]] -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 0 +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 42 @@ -96,14 +92,10 @@ exit: define i32 @compare_against_two(i32 %x) { ; CHECK-LABEL: @compare_against_two( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[X:%.*]], 2 -; CHECK-NEXT: [[CMP2_INV:%.*]] = icmp sgt i32 [[X]], 1 -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2_INV]], i32 1, i32 -1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 0, i32 [[SELECT1]] -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 2 +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 42 @@ -497,13 +489,10 @@ define i32 @compare_against_fortytwo_commutatibility_1(i32 %x) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], 42 ; CHECK-NEXT: call void @use1(i1 [[CMP1]]) -; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[X]], 42 -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2]], i32 -1, i32 1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 [[SELECT1]], i32 0 -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], 42 +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 84 @@ -527,14 +516,10 @@ exit: define i32 @compare_against_fortytwo_commutatibility_2(i32 %x) { ; CHECK-LABEL: @compare_against_fortytwo_commutatibility_2( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[X:%.*]], 42 -; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X]], 41 -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2]], i32 1, i32 -1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 0, i32 [[SELECT1]] -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 42 +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 84 @@ -559,13 +544,10 @@ define i32 @compare_against_fortytwo_commutatibility_3(i32 %x) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], 42 ; CHECK-NEXT: call void @use1(i1 [[CMP1]]) -; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X]], 41 -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2]], i32 1, i32 -1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 [[SELECT1]], i32 0 -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], 42 +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 84 @@ -616,14 +598,10 @@ exit: define i32 @compare_against_arbitrary_value_commutativity1(i32 %x, i32 %c) { ; CHECK-LABEL: @compare_against_arbitrary_value_commutativity1( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[X:%.*]], [[C:%.*]] -; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[C]], [[X]] -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2]], i32 -1, i32 1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 0, i32 [[SELECT1]] -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], [[C:%.*]] +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 42 @@ -648,13 +626,10 @@ define i32 @compare_against_arbitrary_value_commutativity2(i32 %x, i32 %c) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], [[C:%.*]] ; CHECK-NEXT: call void @use1(i1 [[CMP1]]) -; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[X]], [[C]] -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2]], i32 -1, i32 1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 [[SELECT1]], i32 0 -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], [[C]] +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 42 @@ -680,13 +655,10 @@ define i32 @compare_against_arbitrary_value_commutativity3(i32 %x, i32 %c) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], [[C:%.*]] ; CHECK-NEXT: call void @use1(i1 [[CMP1]]) -; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[C]], [[X]] -; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[CMP2]], i32 -1, i32 1 -; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP1]], i32 [[SELECT1]], i32 0 -; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SELECT2]], 0 -; CHECK-NEXT: br i1 [[COND]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], [[C]] +; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]] ; CHECK: callfoo: -; CHECK-NEXT: call void @foo(i32 [[SELECT2]]) +; CHECK-NEXT: call void @foo(i32 1) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i32 42 |