diff options
| author | Craig Topper <craig.topper@intel.com> | 2019-07-24 20:57:29 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2019-07-24 20:57:29 +0000 |
| commit | e9abc8177a368ea481dfa3874ce10a84e032fb01 (patch) | |
| tree | fbfa776bae3cc74e1892286bf33bfd1a49a35fc1 /llvm/test | |
| parent | a8104b49272dc97ab22c373f81cb070db2c6a464 (diff) | |
| download | bcm5719-llvm-e9abc8177a368ea481dfa3874ce10a84e032fb01.tar.gz bcm5719-llvm-e9abc8177a368ea481dfa3874ce10a84e032fb01.zip | |
[InstCombine] Teach foldOrOfICmps to allow icmp eq MIN_INT/MAX to be part of a range comparision. Similar for foldAndOfICmps
We can treat icmp eq X, MIN_UINT as icmp ule X, MIN_UINT and allow
it to merge with icmp ugt X, C. Similar for the other constants.
We can do simliar for icmp ne X, (U)INT_MIN/MAX in foldAndOfICmps. And we already handled UINT_MIN there.
Fixes PR42691.
Differential Revision: https://reviews.llvm.org/D65017
llvm-svn: 366945
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/and-or-icmps.ll | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/llvm/test/Transforms/InstCombine/and-or-icmps.ll b/llvm/test/Transforms/InstCombine/and-or-icmps.ll index 481e0f2fd20..378b82020d4 100644 --- a/llvm/test/Transforms/InstCombine/and-or-icmps.ll +++ b/llvm/test/Transforms/InstCombine/and-or-icmps.ll @@ -255,10 +255,8 @@ define void @simplify_before_foldAndOfICmps() { define i1 @PR42691_1(i32 %x) { ; CHECK-LABEL: @PR42691_1( -; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 %x, 0 -; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 %x, 2147483647 -; CHECK-NEXT: [[C:%.*]] = or i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 %x, 2147483646 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp slt i32 %x, 0 %c2 = icmp eq i32 %x, 2147483647 @@ -279,10 +277,8 @@ define i1 @PR42691_2(i32 %x) { define i1 @PR42691_3(i32 %x) { ; CHECK-LABEL: @PR42691_3( -; CHECK-NEXT: [[C1:%.*]] = icmp sgt i32 %x, -1 -; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 %x, -2147483648 -; CHECK-NEXT: [[C:%.*]] = or i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 %x, -2147483647 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp sge i32 %x, 0 %c2 = icmp eq i32 %x, -2147483648 @@ -303,10 +299,9 @@ define i1 @PR42691_4(i32 %x) { define i1 @PR42691_5(i32 %x) { ; CHECK-LABEL: @PR42691_5( -; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 %x, 1 -; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 %x, 2147483647 -; CHECK-NEXT: [[C:%.*]] = or i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[X_OFF:%.*]] = add i32 %x, -1 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[X_OFF]], 2147483645 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp slt i32 %x, 1 %c2 = icmp eq i32 %x, 2147483647 @@ -316,10 +311,9 @@ define i1 @PR42691_5(i32 %x) { define i1 @PR42691_6(i32 %x) { ; CHECK-LABEL: @PR42691_6( -; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 %x, -2147483647 -; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 %x, -1 -; CHECK-NEXT: [[C:%.*]] = or i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[X_OFF:%.*]] = add i32 %x, 2147483647 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[X_OFF]], 2147483645 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp ult i32 %x, 2147483649 %c2 = icmp eq i32 %x, 4294967295 @@ -341,10 +335,9 @@ define i1 @PR42691_7(i32 %x) { define i1 @PR42691_8(i32 %x) { ; CHECK-LABEL: @PR42691_8( -; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 %x, 14 -; CHECK-NEXT: [[C2:%.*]] = icmp ne i32 %x, -2147483648 -; CHECK-NEXT: [[C:%.*]] = and i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[X_OFF:%.*]] = add i32 %x, 2147483647 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], -2147483635 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp slt i32 %x, 14 %c2 = icmp ne i32 %x, -2147483648 @@ -354,10 +347,9 @@ define i1 @PR42691_8(i32 %x) { define i1 @PR42691_9(i32 %x) { ; CHECK-LABEL: @PR42691_9( -; CHECK-NEXT: [[C1:%.*]] = icmp sgt i32 %x, 13 -; CHECK-NEXT: [[C2:%.*]] = icmp ne i32 %x, 2147483647 -; CHECK-NEXT: [[C:%.*]] = and i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[X_OFF:%.*]] = add i32 %x, -14 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], 2147483633 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp sgt i32 %x, 13 %c2 = icmp ne i32 %x, 2147483647 @@ -367,10 +359,9 @@ define i1 @PR42691_9(i32 %x) { define i1 @PR42691_10(i32 %x) { ; CHECK-LABEL: @PR42691_10( -; CHECK-NEXT: [[C1:%.*]] = icmp ugt i32 %x, 13 -; CHECK-NEXT: [[C2:%.*]] = icmp ne i32 %x, -1 -; CHECK-NEXT: [[C:%.*]] = and i1 [[C1]], [[C2]] -; CHECK-NEXT: ret i1 [[C]] +; CHECK-NEXT: [[X_OFF:%.*]] = add i32 %x, -14 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], -15 +; CHECK-NEXT: ret i1 [[TMP1]] ; %c1 = icmp ugt i32 %x, 13 %c2 = icmp ne i32 %x, 4294967295 |

