1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -S %s -instsimplify | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; A ==> A -> true 5*9880d681SAndroid Build Coastguard Workerdefine i1 @test(i32 %length.i, i32 %i) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test( 7*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 8*9880d681SAndroid Build Coastguard Worker; 9*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %length.i 10*9880d681SAndroid Build Coastguard Worker %res = icmp uge i1 %var29, %var29 11*9880d681SAndroid Build Coastguard Worker ret i1 %res 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; i +_{nsw} C_{>0} <s L ==> i <s L -> true 15*9880d681SAndroid Build Coastguard Workerdefine i1 @test2(i32 %length.i, i32 %i) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 17*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 18*9880d681SAndroid Build Coastguard Worker; 19*9880d681SAndroid Build Coastguard Worker %iplus1 = add nsw i32 %i, 1 20*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %length.i 21*9880d681SAndroid Build Coastguard Worker %var30 = icmp slt i32 %iplus1, %length.i 22*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 23*9880d681SAndroid Build Coastguard Worker ret i1 %res 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; i + C_{>0} <s L ==> i <s L -> unknown without the nsw 27*9880d681SAndroid Build Coastguard Workerdefine i1 @test2_neg(i32 %length.i, i32 %i) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2_neg( 29*9880d681SAndroid Build Coastguard Worker; CHECK: [[IPLUS1:%.*]] = add i32 %i, 1 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR29:%.*]] = icmp slt i32 %i, %length.i 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR30:%.*]] = icmp slt i32 [[IPLUS1]], %length.i 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[VAR30]], [[VAR29]] 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 34*9880d681SAndroid Build Coastguard Worker; 35*9880d681SAndroid Build Coastguard Worker %iplus1 = add i32 %i, 1 36*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %length.i 37*9880d681SAndroid Build Coastguard Worker %var30 = icmp slt i32 %iplus1, %length.i 38*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 39*9880d681SAndroid Build Coastguard Worker ret i1 %res 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; sle is not implication 43*9880d681SAndroid Build Coastguard Workerdefine i1 @test2_neg2(i32 %length.i, i32 %i) { 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2_neg2( 45*9880d681SAndroid Build Coastguard Worker; CHECK: [[IPLUS1:%.*]] = add i32 %i, 1 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR29:%.*]] = icmp slt i32 %i, %length.i 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR30:%.*]] = icmp slt i32 [[IPLUS1]], %length.i 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp sle i1 [[VAR30]], [[VAR29]] 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 50*9880d681SAndroid Build Coastguard Worker; 51*9880d681SAndroid Build Coastguard Worker %iplus1 = add i32 %i, 1 52*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %length.i 53*9880d681SAndroid Build Coastguard Worker %var30 = icmp slt i32 %iplus1, %length.i 54*9880d681SAndroid Build Coastguard Worker %res = icmp sle i1 %var30, %var29 55*9880d681SAndroid Build Coastguard Worker ret i1 %res 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; The binary operator has to be an add 59*9880d681SAndroid Build Coastguard Workerdefine i1 @test2_neg3(i32 %length.i, i32 %i) { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2_neg3( 61*9880d681SAndroid Build Coastguard Worker; CHECK: [[IPLUS1:%.*]] = sub nsw i32 %i, 1 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR29:%.*]] = icmp slt i32 %i, %length.i 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR30:%.*]] = icmp slt i32 [[IPLUS1]], %length.i 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[VAR30]], [[VAR29]] 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 66*9880d681SAndroid Build Coastguard Worker; 67*9880d681SAndroid Build Coastguard Worker %iplus1 = sub nsw i32 %i, 1 68*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %length.i 69*9880d681SAndroid Build Coastguard Worker %var30 = icmp slt i32 %iplus1, %length.i 70*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 71*9880d681SAndroid Build Coastguard Worker ret i1 %res 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; i +_{nsw} C_{>0} <s L ==> i <s L -> true 75*9880d681SAndroid Build Coastguard Worker; With an inverted conditional (ule B A rather than canonical ugt A B 76*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(i32 %length.i, i32 %i) { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 78*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker %iplus1 = add nsw i32 %i, 1 81*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %length.i 82*9880d681SAndroid Build Coastguard Worker %var30 = icmp slt i32 %iplus1, %length.i 83*9880d681SAndroid Build Coastguard Worker %res = icmp uge i1 %var29, %var30 84*9880d681SAndroid Build Coastguard Worker ret i1 %res 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; i +_{nuw} C <u L ==> i <u L 88*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i32 %length.i, i32 %i) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 90*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 91*9880d681SAndroid Build Coastguard Worker; 92*9880d681SAndroid Build Coastguard Worker %iplus1 = add nuw i32 %i, 1 93*9880d681SAndroid Build Coastguard Worker %var29 = icmp ult i32 %i, %length.i 94*9880d681SAndroid Build Coastguard Worker %var30 = icmp ult i32 %iplus1, %length.i 95*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 96*9880d681SAndroid Build Coastguard Worker ret i1 %res 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; A ==> A for vectors 100*9880d681SAndroid Build Coastguard Workerdefine <4 x i1> @test5(<4 x i1> %vec) { 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 102*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x i1> <i1 true, i1 true, i1 true, i1 true> 103*9880d681SAndroid Build Coastguard Worker; 104*9880d681SAndroid Build Coastguard Worker %res = icmp ule <4 x i1> %vec, %vec 105*9880d681SAndroid Build Coastguard Worker ret <4 x i1> %res 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; Don't crash on vector inputs - pr25040 109*9880d681SAndroid Build Coastguard Workerdefine <4 x i1> @test6(<4 x i1> %a, <4 x i1> %b) { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 111*9880d681SAndroid Build Coastguard Worker; CHECK: [[RES:%.*]] = icmp ule <4 x i1> %a, %b 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i1> [[RES]] 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker %res = icmp ule <4 x i1> %a, %b 115*9880d681SAndroid Build Coastguard Worker ret <4 x i1> %res 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; i +_{nsw} 1 <s L ==> i < L +_{nsw} 1 119*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(i32 %length.i, i32 %i) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 121*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 122*9880d681SAndroid Build Coastguard Worker; 123*9880d681SAndroid Build Coastguard Worker %iplus1 = add nsw i32 %i, 1 124*9880d681SAndroid Build Coastguard Worker %len.plus.one = add nsw i32 %length.i, 1 125*9880d681SAndroid Build Coastguard Worker %var29 = icmp slt i32 %i, %len.plus.one 126*9880d681SAndroid Build Coastguard Worker %var30 = icmp slt i32 %iplus1, %length.i 127*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 128*9880d681SAndroid Build Coastguard Worker ret i1 %res 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; i +_{nuw} 1 <u L ==> i < L +_{nuw} 1 132*9880d681SAndroid Build Coastguard Workerdefine i1 @test8(i32 %length.i, i32 %i) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 134*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 135*9880d681SAndroid Build Coastguard Worker; 136*9880d681SAndroid Build Coastguard Worker %iplus1 = add nuw i32 %i, 1 137*9880d681SAndroid Build Coastguard Worker %len.plus.one = add nuw i32 %length.i, 1 138*9880d681SAndroid Build Coastguard Worker %var29 = icmp ult i32 %i, %len.plus.one 139*9880d681SAndroid Build Coastguard Worker %var30 = icmp ult i32 %iplus1, %length.i 140*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 141*9880d681SAndroid Build Coastguard Worker ret i1 %res 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; i +_{nuw} C <u L ==> i < L, even if C is negative 145*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i32 %length.i, i32 %i) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 147*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 148*9880d681SAndroid Build Coastguard Worker; 149*9880d681SAndroid Build Coastguard Worker %iplus1 = add nuw i32 %i, -100 150*9880d681SAndroid Build Coastguard Worker %var29 = icmp ult i32 %i, %length.i 151*9880d681SAndroid Build Coastguard Worker %var30 = icmp ult i32 %iplus1, %length.i 152*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %var30, %var29 153*9880d681SAndroid Build Coastguard Worker ret i1 %res 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine i1 @test10(i32 %length.i, i32 %x.full) { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 158*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 159*9880d681SAndroid Build Coastguard Worker; 160*9880d681SAndroid Build Coastguard Worker %x = and i32 %x.full, 4294901760 ;; 4294901760 == 0xffff0000 161*9880d681SAndroid Build Coastguard Worker %large = or i32 %x, 100 162*9880d681SAndroid Build Coastguard Worker %small = or i32 %x, 90 163*9880d681SAndroid Build Coastguard Worker %known = icmp ult i32 %large, %length.i 164*9880d681SAndroid Build Coastguard Worker %to.prove = icmp ult i32 %small, %length.i 165*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %known, %to.prove 166*9880d681SAndroid Build Coastguard Worker ret i1 %res 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefine i1 @test11(i32 %length.i, i32 %x) { 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 171*9880d681SAndroid Build Coastguard Worker; CHECK: [[LARGE:%.*]] = or i32 %x, 100 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SMALL:%.*]] = or i32 %x, 90 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[KNOWN:%.*]] = icmp ult i32 [[LARGE]], %length.i 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TO_PROVE:%.*]] = icmp ult i32 [[SMALL]], %length.i 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[KNOWN]], [[TO_PROVE]] 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 177*9880d681SAndroid Build Coastguard Worker; 178*9880d681SAndroid Build Coastguard Worker %large = or i32 %x, 100 179*9880d681SAndroid Build Coastguard Worker %small = or i32 %x, 90 180*9880d681SAndroid Build Coastguard Worker %known = icmp ult i32 %large, %length.i 181*9880d681SAndroid Build Coastguard Worker %to.prove = icmp ult i32 %small, %length.i 182*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %known, %to.prove 183*9880d681SAndroid Build Coastguard Worker ret i1 %res 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i32 %length.i, i32 %x.full) { 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 188*9880d681SAndroid Build Coastguard Worker; CHECK: [[X:%.*]] = and i32 [[X:%.*]].full, -65536 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LARGE:%.*]] = or i32 [[X]], 65536 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SMALL:%.*]] = or i32 [[X]], 90 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[KNOWN:%.*]] = icmp ult i32 [[LARGE]], %length.i 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TO_PROVE:%.*]] = icmp ult i32 [[SMALL]], %length.i 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[KNOWN]], [[TO_PROVE]] 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 195*9880d681SAndroid Build Coastguard Worker; 196*9880d681SAndroid Build Coastguard Worker %x = and i32 %x.full, 4294901760 ;; 4294901760 == 0xffff0000 197*9880d681SAndroid Build Coastguard Worker %large = or i32 %x, 65536 ;; 65536 == 0x00010000 198*9880d681SAndroid Build Coastguard Worker %small = or i32 %x, 90 199*9880d681SAndroid Build Coastguard Worker %known = icmp ult i32 %large, %length.i 200*9880d681SAndroid Build Coastguard Worker %to.prove = icmp ult i32 %small, %length.i 201*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %known, %to.prove 202*9880d681SAndroid Build Coastguard Worker ret i1 %res 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i32 %length.i, i32 %x) { 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 207*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 208*9880d681SAndroid Build Coastguard Worker; 209*9880d681SAndroid Build Coastguard Worker %large = add nuw i32 %x, 100 210*9880d681SAndroid Build Coastguard Worker %small = add nuw i32 %x, 90 211*9880d681SAndroid Build Coastguard Worker %known = icmp ult i32 %large, %length.i 212*9880d681SAndroid Build Coastguard Worker %to.prove = icmp ult i32 %small, %length.i 213*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %known, %to.prove 214*9880d681SAndroid Build Coastguard Worker ret i1 %res 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i32 %length.i, i32 %x.full) { 218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 219*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 220*9880d681SAndroid Build Coastguard Worker; 221*9880d681SAndroid Build Coastguard Worker %x = and i32 %x.full, 4294905615 ;; 4294905615 == 0xffff0f0f 222*9880d681SAndroid Build Coastguard Worker %large = or i32 %x, 8224 ;; == 0x2020 223*9880d681SAndroid Build Coastguard Worker %small = or i32 %x, 4112 ;; == 0x1010 224*9880d681SAndroid Build Coastguard Worker %known = icmp ult i32 %large, %length.i 225*9880d681SAndroid Build Coastguard Worker %to.prove = icmp ult i32 %small, %length.i 226*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %known, %to.prove 227*9880d681SAndroid Build Coastguard Worker ret i1 %res 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workerdefine i1 @test15(i32 %length.i, i32 %x) { 231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 232*9880d681SAndroid Build Coastguard Worker; CHECK: [[LARGE:%.*]] = add nuw i32 %x, 100 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SMALL:%.*]] = add nuw i32 %x, 110 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[KNOWN:%.*]] = icmp ult i32 [[LARGE]], %length.i 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TO_PROVE:%.*]] = icmp ult i32 [[SMALL]], %length.i 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[KNOWN]], [[TO_PROVE]] 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 238*9880d681SAndroid Build Coastguard Worker; 239*9880d681SAndroid Build Coastguard Worker %large = add nuw i32 %x, 100 240*9880d681SAndroid Build Coastguard Worker %small = add nuw i32 %x, 110 241*9880d681SAndroid Build Coastguard Worker %known = icmp ult i32 %large, %length.i 242*9880d681SAndroid Build Coastguard Worker %to.prove = icmp ult i32 %small, %length.i 243*9880d681SAndroid Build Coastguard Worker %res = icmp ule i1 %known, %to.prove 244*9880d681SAndroid Build Coastguard Worker ret i1 %res 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker; X >=(s) Y == X ==> Y (i1 1 becomes -1 for reasoning) 248*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sge(i32 %length.i, i32 %i) { 249*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sge( 250*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 251*9880d681SAndroid Build Coastguard Worker; 252*9880d681SAndroid Build Coastguard Worker %iplus1 = add nsw nuw i32 %i, 1 253*9880d681SAndroid Build Coastguard Worker %var29 = icmp ult i32 %i, %length.i 254*9880d681SAndroid Build Coastguard Worker %var30 = icmp ult i32 %iplus1, %length.i 255*9880d681SAndroid Build Coastguard Worker %res = icmp sge i1 %var30, %var29 256*9880d681SAndroid Build Coastguard Worker ret i1 %res 257*9880d681SAndroid Build Coastguard Worker} 258