diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 |
commit | 71d5a2540a98c81f5bcaeb48805e0e2881f530ef (patch) | |
tree | 5343938942df402b49ec7300a1c25a2d4ccd5821 /test/Transforms/InstCombine/icmp.ll | |
parent | 31bbf64f3a4974a2d6c8b3b27ad2f519caf74057 (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.ll | 231 |
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 +} |