aboutsummaryrefslogtreecommitdiff
path: root/test/Transforms/InstCombine/icmp.ll
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-04-16 16:01:22 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-04-16 16:01:22 +0000
commit71d5a2540a98c81f5bcaeb48805e0e2881f530ef (patch)
tree5343938942df402b49ec7300a1c25a2d4ccd5821 /test/Transforms/InstCombine/icmp.ll
parent31bbf64f3a4974a2d6c8b3b27ad2f519caf74057 (diff)
Vendor import of llvm trunk r300422:vendor/llvm/llvm-trunk-r300422
Notes
Notes: svn path=/vendor/llvm/dist/; revision=317017 svn path=/vendor/llvm/llvm-trunk-r300422/; revision=317018; tag=vendor/llvm/llvm-trunk-r300422
Diffstat (limited to 'test/Transforms/InstCombine/icmp.ll')
-rw-r--r--test/Transforms/InstCombine/icmp.ll231
1 files changed, 200 insertions, 31 deletions
diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll
index 32fe050bf83f..edfa9a102917 100644
--- a/test/Transforms/InstCombine/icmp.ll
+++ b/test/Transforms/InstCombine/icmp.ll
@@ -918,7 +918,7 @@ define i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) {
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 %i to i16
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 %j to i16
; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nuw i16 [[TMP1]], 2
-; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i16 [[TMP2]], [[GEP1_IDX]]
+; CHECK-NEXT: [[TMP3:%.*]] = icmp slt i16 [[GEP1_IDX]], [[TMP2]]
; CHECK-NEXT: ret i1 [[TMP3]]
;
%bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
@@ -949,7 +949,7 @@ define i1 @test60_addrspacecast_smaller(i8* %foo, i16 %i, i64 %j) {
; CHECK-LABEL: @test60_addrspacecast_smaller(
; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nuw i16 %i, 2
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 %j to i16
-; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i16 [[TMP1]], [[GEP1_IDX]]
+; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i16 [[GEP1_IDX]], [[TMP1]]
; CHECK-NEXT: ret i1 [[TMP2]]
;
%bit = addrspacecast i8* %foo to i32 addrspace(1)*
@@ -981,7 +981,7 @@ define i1 @test61(i8* %foo, i64 %i, i64 %j) {
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, i32* [[BIT]], i64 %i
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, i8* %foo, i64 %j
; CHECK-NEXT: [[CAST1:%.*]] = bitcast i32* [[GEP1]] to i8*
-; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8* [[CAST1]], [[GEP2]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8* [[GEP2]], [[CAST1]]
; CHECK-NEXT: ret i1 [[CMP]]
;
%bit = bitcast i8* %foo to i32*
@@ -999,7 +999,7 @@ define i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, i32 addrspace(1)* [[BIT]], i16 %i
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, i8 addrspace(1)* %foo, i16 %j
; CHECK-NEXT: [[CAST1:%.*]] = bitcast i32 addrspace(1)* [[GEP1]] to i8 addrspace(1)*
-; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 addrspace(1)* [[CAST1]], [[GEP2]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 addrspace(1)* [[GEP2]], [[CAST1]]
; CHECK-NEXT: ret i1 [[CMP]]
;
%bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
@@ -1123,19 +1123,6 @@ define i1 @test68(i32 %x) {
ret i1 %cmp
}
-; PR14708
-define i1 @test69(i32 %c) {
-; CHECK-LABEL: @test69(
-; CHECK-NEXT: [[TMP1:%.*]] = or i32 %c, 32
-; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 97
-; CHECK-NEXT: ret i1 [[TMP2]]
-;
- %1 = icmp eq i32 %c, 97
- %2 = icmp eq i32 %c, 65
- %3 = or i1 %1, %2
- ret i1 %3
-}
-
; PR15940
define i1 @test70(i32 %X) {
; CHECK-LABEL: @test70(
@@ -1183,12 +1170,11 @@ define i1 @icmp_sext8trunc(i32 %x) {
ret i1 %cmp
}
-; FIXME: Vectors should fold the same way.
+; Vectors should fold the same way.
define <2 x i1> @icmp_sext8trunc_vec(<2 x i32> %x) {
; CHECK-LABEL: @icmp_sext8trunc_vec(
-; CHECK-NEXT: [[SEXT1:%.*]] = shl <2 x i32> %x, <i32 24, i32 24>
-; CHECK-NEXT: [[SEXT:%.*]] = ashr <2 x i32> [[SEXT:%.*]]1, <i32 24, i32 24>
-; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[SEXT]], <i32 36, i32 36>
+; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i32> %x to <2 x i8>
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[TMP1]], <i8 36, i8 36>
; CHECK-NEXT: ret <2 x i1> [[CMP]]
;
%trunc = trunc <2 x i32> %x to <2 x i8>
@@ -1877,6 +1863,55 @@ define <2 x i1> @icmp_and_X_-16_ne-16_vec(<2 x i32> %X) {
ret <2 x i1> %cmp
}
+; PR32524: https://bugs.llvm.org/show_bug.cgi?id=32524
+; X | C == C --> X <=u C (when C+1 is PowerOf2).
+
+define i1 @or1_eq1(i32 %x) {
+; CHECK-LABEL: @or1_eq1(
+; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 %x, 2
+; CHECK-NEXT: ret i1 [[T1]]
+;
+ %t0 = or i32 %x, 1
+ %t1 = icmp eq i32 %t0, 1
+ ret i1 %t1
+}
+
+; X | C == C --> X <=u C (when C+1 is PowerOf2).
+
+define <2 x i1> @or3_eq3_vec(<2 x i8> %x) {
+; CHECK-LABEL: @or3_eq3_vec(
+; CHECK-NEXT: [[T1:%.*]] = icmp ult <2 x i8> %x, <i8 4, i8 4>
+; CHECK-NEXT: ret <2 x i1> [[T1]]
+;
+ %t0 = or <2 x i8> %x, <i8 3, i8 3>
+ %t1 = icmp eq <2 x i8> %t0, <i8 3, i8 3>
+ ret <2 x i1> %t1
+}
+
+; X | C != C --> X >u C (when C+1 is PowerOf2).
+
+define i1 @or7_ne7(i32 %x) {
+; CHECK-LABEL: @or7_ne7(
+; CHECK-NEXT: [[T1:%.*]] = icmp ugt i32 %x, 7
+; CHECK-NEXT: ret i1 [[T1]]
+;
+ %t0 = or i32 %x, 7
+ %t1 = icmp ne i32 %t0, 7
+ ret i1 %t1
+}
+
+; X | C != C --> X >u C (when C+1 is PowerOf2).
+
+define <2 x i1> @or63_ne63_vec(<2 x i8> %x) {
+; CHECK-LABEL: @or63_ne63_vec(
+; CHECK-NEXT: [[T1:%.*]] = icmp ugt <2 x i8> %x, <i8 63, i8 63>
+; CHECK-NEXT: ret <2 x i1> [[T1]]
+;
+ %t0 = or <2 x i8> %x, <i8 63, i8 63>
+ %t1 = icmp ne <2 x i8> %t0, <i8 63, i8 63>
+ ret <2 x i1> %t1
+}
+
define i1 @shrink_constant(i32 %X) {
; CHECK-LABEL: @shrink_constant(
; CHECK-NEXT: [[XOR:%.*]] = xor i32 %X, -12
@@ -2232,16 +2267,6 @@ define i1 @icmp_sge_zero_add_nsw(i32 %a) {
ret i1 %cmp
}
-define i1 @icmp_slt_zero_add_nsw(i32 %a) {
-; CHECK-LABEL: @icmp_slt_zero_add_nsw(
-; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 %a, -1
-; CHECK-NEXT: ret i1 [[CMP]]
-;
- %add = add nsw i32 %a, 1
- %cmp = icmp slt i32 %add, 0
- ret i1 %cmp
-}
-
define i1 @icmp_sle_zero_add_nsw(i32 %a) {
; CHECK-LABEL: @icmp_sle_zero_add_nsw(
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 %a, 0
@@ -2425,6 +2450,10 @@ define i1 @f10(i16 %p) {
ret i1 %cmp580
}
+; Note: fptosi is used in various tests below to ensure that operand complexity
+; canonicalization does not kick in, which would make some of the tests
+; equivalent to one another.
+
define i1 @cmp_sgt_rhs_dec(float %x, i32 %i) {
; CHECK-LABEL: @cmp_sgt_rhs_dec(
; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
@@ -2711,3 +2740,143 @@ define i1 @or_ptrtoint_mismatch(i8* %p, i32* %q) {
%b = icmp eq i64 %o, 0
ret i1 %b
}
+
+define i1 @icmp_add1_ugt(i32 %x, i32 %y) {
+; CHECK-LABEL: @icmp_add1_ugt(
+; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 %x, %y
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %add = add nuw i32 %x, 1
+ %cmp = icmp ugt i32 %add, %y
+ ret i1 %cmp
+}
+
+define i1 @icmp_add1_ule(i32 %x, i32 %y) {
+; CHECK-LABEL: @icmp_add1_ule(
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 %x, %y
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %add = add nuw i32 %x, 1
+ %cmp = icmp ule i32 %add, %y
+ ret i1 %cmp
+}
+
+define i1 @cmp_uge_rhs_inc(float %x, i32 %i) {
+; CHECK-LABEL: @cmp_uge_rhs_inc(
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
+; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV]], %i
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = fptosi float %x to i32
+ %inc = add nuw i32 %i, 1
+ %cmp = icmp uge i32 %conv, %inc
+ ret i1 %cmp
+}
+
+define i1 @cmp_ult_rhs_inc(float %x, i32 %i) {
+; CHECK-LABEL: @cmp_ult_rhs_inc(
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
+; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[CONV]], %i
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = fptosi float %x to i32
+ %inc = add nuw i32 %i, 1
+ %cmp = icmp ult i32 %conv, %inc
+ ret i1 %cmp
+}
+
+define i1 @cmp_sge_lhs_inc(i32 %x, i32 %y) {
+; CHECK-LABEL: @cmp_sge_lhs_inc(
+; CHECK-NEXT: [[INC:%.*]] = add
+; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[INC]], %y
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %inc = add nsw i32 %x, 1
+ %cmp = icmp sge i32 %inc, %y
+ ret i1 %cmp
+}
+
+define i1 @cmp_uge_lhs_inc(i32 %x, i32 %y) {
+; CHECK-LABEL: @cmp_uge_lhs_inc(
+; CHECK-NEXT: [[INC:%.*]] = add
+; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[INC]], %y
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %inc = add nuw i32 %x, 1
+ %cmp = icmp uge i32 %inc, %y
+ ret i1 %cmp
+}
+
+define i1 @cmp_sgt_lhs_dec(i32 %x, i32 %y) {
+; CHECK-LABEL: @cmp_sgt_lhs_dec(
+; CHECK-NEXT: [[DEC:%.*]] = {{add|sub}}
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[DEC]], %y
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %dec = sub nsw i32 %x, 1
+ %cmp = icmp sgt i32 %dec, %y
+ ret i1 %cmp
+}
+
+define i1 @cmp_ugt_lhs_dec(i32 %x, i32 %y) {
+; CHECK-LABEL: @cmp_ugt_lhs_dec(
+; CHECK-NEXT: [[DEC:%.*]] = {{add|sub}}
+; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC]], %y
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %dec = sub nuw i32 %x, 1
+ %cmp = icmp ugt i32 %dec, %y
+ ret i1 %cmp
+}
+
+define i1 @cmp_sle_rhs_inc(float %x, i32 %y) {
+; CHECK-LABEL: @cmp_sle_rhs_inc(
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
+; CHECK-NEXT: [[INC:%.*]] = add
+; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[INC]], [[CONV]]
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = fptosi float %x to i32
+ %inc = add nsw i32 %y, 1
+ %cmp = icmp sle i32 %conv, %inc
+ ret i1 %cmp
+}
+
+define i1 @cmp_ule_rhs_inc(float %x, i32 %y) {
+; CHECK-LABEL: @cmp_ule_rhs_inc(
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
+; CHECK-NEXT: [[INC:%.*]] = add
+; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[INC]], [[CONV]]
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = fptosi float %x to i32
+ %inc = add nuw i32 %y, 1
+ %cmp = icmp ule i32 %conv, %inc
+ ret i1 %cmp
+}
+
+define i1 @cmp_slt_rhs_dec(float %x, i32 %y) {
+; CHECK-LABEL: @cmp_slt_rhs_dec(
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
+; CHECK-NEXT: [[DEC:%.*]] = {{add|sub}}
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[DEC]], [[CONV]]
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = fptosi float %x to i32
+ %dec = sub nsw i32 %y, 1
+ %cmp = icmp slt i32 %conv, %dec
+ ret i1 %cmp
+}
+
+define i1 @cmp_ult_rhs_dec(float %x, i32 %y) {
+; CHECK-LABEL: @cmp_ult_rhs_dec(
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float %x to i32
+; CHECK-NEXT: [[DEC:%.*]] = {{add|sub}}
+; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC]], [[CONV]]
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = fptosi float %x to i32
+ %dec = sub nuw i32 %y, 1
+ %cmp = icmp ult i32 %conv, %dec
+ ret i1 %cmp
+}