1*5fa59edfSYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*5fa59edfSYingwei Zheng; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3*5fa59edfSYingwei Zheng 4*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_zext_icmp_trunc_nuw(i16 %x, i32 %y) { 5*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc_nuw( 6*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) { 7*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[X]] to i32 8*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]] 9*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 10*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 11*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CONV:%.*]] = trunc nuw i32 [[Y]] to i16 12*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 13*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 14*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 15*5fa59edfSYingwei Zheng; 16*5fa59edfSYingwei Zheng %ext = zext i16 %x to i32 17*5fa59edfSYingwei Zheng %cond = icmp ult i32 %y, %ext 18*5fa59edfSYingwei Zheng br i1 %cond, label %if.then, label %if.else 19*5fa59edfSYingwei Zheng 20*5fa59edfSYingwei Zhengif.then: 21*5fa59edfSYingwei Zheng %conv = trunc nuw i32 %y to i16 22*5fa59edfSYingwei Zheng %cmp = icmp eq i16 %x, %conv 23*5fa59edfSYingwei Zheng ret i1 %cmp 24*5fa59edfSYingwei Zheng 25*5fa59edfSYingwei Zhengif.else: 26*5fa59edfSYingwei Zheng ret i1 false 27*5fa59edfSYingwei Zheng} 28*5fa59edfSYingwei Zheng 29*5fa59edfSYingwei Zhengdefine i1 @test_icmp_slt_sext_icmp_trunc_nsw(i16 %x, i32 %y) { 30*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_slt_sext_icmp_trunc_nsw( 31*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) { 32*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = sext i16 [[X]] to i32 33*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[Y]], [[EXT]] 34*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 35*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 36*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CONV:%.*]] = trunc nsw i32 [[Y]] to i16 37*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 38*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 39*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 40*5fa59edfSYingwei Zheng; 41*5fa59edfSYingwei Zheng %ext = sext i16 %x to i32 42*5fa59edfSYingwei Zheng %cond = icmp slt i32 %y, %ext 43*5fa59edfSYingwei Zheng br i1 %cond, label %if.then, label %if.else 44*5fa59edfSYingwei Zheng 45*5fa59edfSYingwei Zhengif.then: 46*5fa59edfSYingwei Zheng %conv = trunc nsw i32 %y to i16 47*5fa59edfSYingwei Zheng %cmp = icmp slt i16 %x, %conv 48*5fa59edfSYingwei Zheng ret i1 %cmp 49*5fa59edfSYingwei Zheng 50*5fa59edfSYingwei Zhengif.else: 51*5fa59edfSYingwei Zheng ret i1 false 52*5fa59edfSYingwei Zheng} 53*5fa59edfSYingwei Zheng 54*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw(i64 %x, i32 %y) { 55*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw( 56*5fa59edfSYingwei Zheng; CHECK-SAME: i64 [[X:%.*]], i32 [[Y:%.*]]) { 57*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = trunc nsw i64 [[X]] to i32 58*5fa59edfSYingwei Zheng; CHECK-NEXT: [[NNEG:%.*]] = icmp sgt i64 [[X]], -1 59*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]] 60*5fa59edfSYingwei Zheng; CHECK-NEXT: [[AND:%.*]] = and i1 [[NNEG]], [[COND]] 61*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[AND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 62*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 63*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[Y]] to i64 64*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 65*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 66*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 67*5fa59edfSYingwei Zheng; 68*5fa59edfSYingwei Zheng %ext = trunc nsw i64 %x to i32 69*5fa59edfSYingwei Zheng %nneg = icmp sgt i64 %x, -1 70*5fa59edfSYingwei Zheng %cond = icmp ult i32 %y, %ext 71*5fa59edfSYingwei Zheng %and = and i1 %nneg, %cond 72*5fa59edfSYingwei Zheng br i1 %and, label %if.then, label %if.else 73*5fa59edfSYingwei Zheng 74*5fa59edfSYingwei Zhengif.then: 75*5fa59edfSYingwei Zheng %conv = zext i32 %y to i64 76*5fa59edfSYingwei Zheng %cmp = icmp eq i64 %x, %conv 77*5fa59edfSYingwei Zheng ret i1 %cmp 78*5fa59edfSYingwei Zheng 79*5fa59edfSYingwei Zhengif.else: 80*5fa59edfSYingwei Zheng ret i1 false 81*5fa59edfSYingwei Zheng} 82*5fa59edfSYingwei Zheng 83*5fa59edfSYingwei Zhengdefine i1 @test2(i32 %n) { 84*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test2( 85*5fa59edfSYingwei Zheng; CHECK-SAME: i32 [[N:%.*]]) { 86*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[N]], 0 87*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 88*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 89*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[N]] to i64 90*5fa59edfSYingwei Zheng; CHECK-NEXT: [[END:%.*]] = add nsw i64 [[EXT]], -1 91*5fa59edfSYingwei Zheng; CHECK-NEXT: br label %[[FOR_BODY:.*]] 92*5fa59edfSYingwei Zheng; CHECK: [[FOR_BODY]]: 93*5fa59edfSYingwei Zheng; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, %[[IF_THEN]] ], [ [[INDVAR_NEXT:%.*]], %[[FOR_NEXT:.*]] ] 94*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[INDVAR]], [[END]] 95*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label %[[IF_ELSE]], label %[[FOR_NEXT]] 96*5fa59edfSYingwei Zheng; CHECK: [[FOR_NEXT]]: 97*5fa59edfSYingwei Zheng; CHECK-NEXT: [[INDVAR_NEXT]] = add nuw nsw i64 [[INDVAR]], 1 98*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND2:%.*]] = call i1 @cond() 99*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND2]], label %[[FOR_BODY]], label %[[FOR_END:.*]] 100*5fa59edfSYingwei Zheng; CHECK: [[FOR_END]]: 101*5fa59edfSYingwei Zheng; CHECK-NEXT: [[TRUNC:%.*]] = trunc nsw i64 [[INDVAR_NEXT]] to i32 102*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 true 103*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 104*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 105*5fa59edfSYingwei Zheng; 106*5fa59edfSYingwei Zheng %cond = icmp sgt i32 %n, 0 107*5fa59edfSYingwei Zheng br i1 %cond, label %if.then, label %if.else 108*5fa59edfSYingwei Zheng 109*5fa59edfSYingwei Zhengif.then: 110*5fa59edfSYingwei Zheng %ext = zext nneg i32 %n to i64 111*5fa59edfSYingwei Zheng %end = add nsw i64 %ext, -1 112*5fa59edfSYingwei Zheng br label %for.body 113*5fa59edfSYingwei Zheng 114*5fa59edfSYingwei Zhengfor.body: 115*5fa59edfSYingwei Zheng %indvar = phi i64 [ 0, %if.then ], [ %indvar.next, %for.next ] 116*5fa59edfSYingwei Zheng %cmp = icmp eq i64 %indvar, %end 117*5fa59edfSYingwei Zheng br i1 %cmp, label %if.else, label %for.next 118*5fa59edfSYingwei Zheng 119*5fa59edfSYingwei Zhengfor.next: 120*5fa59edfSYingwei Zheng %indvar.next = add nuw nsw i64 %indvar, 1 121*5fa59edfSYingwei Zheng %cond2 = call i1 @cond() 122*5fa59edfSYingwei Zheng br i1 %cond2, label %for.body, label %for.end 123*5fa59edfSYingwei Zheng 124*5fa59edfSYingwei Zhengfor.end: 125*5fa59edfSYingwei Zheng %trunc = trunc nsw i64 %indvar.next to i32 126*5fa59edfSYingwei Zheng %res = icmp sgt i32 %n, %trunc 127*5fa59edfSYingwei Zheng ret i1 %res 128*5fa59edfSYingwei Zheng 129*5fa59edfSYingwei Zhengif.else: 130*5fa59edfSYingwei Zheng ret i1 false 131*5fa59edfSYingwei Zheng} 132*5fa59edfSYingwei Zheng 133*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_zext_icmp_trunc(i16 %x, i32 %y) { 134*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc( 135*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) { 136*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[X]] to i32 137*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]] 138*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 139*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 140*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[Y]] to i16 141*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]] 142*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 [[CMP]] 143*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 144*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 145*5fa59edfSYingwei Zheng; 146*5fa59edfSYingwei Zheng %ext = zext i16 %x to i32 147*5fa59edfSYingwei Zheng %cond = icmp ult i32 %y, %ext 148*5fa59edfSYingwei Zheng br i1 %cond, label %if.then, label %if.else 149*5fa59edfSYingwei Zheng 150*5fa59edfSYingwei Zhengif.then: 151*5fa59edfSYingwei Zheng %conv = trunc i32 %y to i16 152*5fa59edfSYingwei Zheng %cmp = icmp eq i16 %x, %conv 153*5fa59edfSYingwei Zheng ret i1 %cmp 154*5fa59edfSYingwei Zheng 155*5fa59edfSYingwei Zhengif.else: 156*5fa59edfSYingwei Zheng ret i1 false 157*5fa59edfSYingwei Zheng} 158*5fa59edfSYingwei Zheng 159*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_zext_icmp_trunc_nuw_i128(i16 %x, i128 %y) { 160*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc_nuw_i128( 161*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i128 [[Y:%.*]]) { 162*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[X]] to i128 163*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp ult i128 [[Y]], [[EXT]] 164*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 165*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 166*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CONV:%.*]] = trunc nuw i128 [[Y]] to i16 167*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]] 168*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 [[CMP]] 169*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 170*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 171*5fa59edfSYingwei Zheng; 172*5fa59edfSYingwei Zheng %ext = zext i16 %x to i128 173*5fa59edfSYingwei Zheng %cond = icmp ult i128 %y, %ext 174*5fa59edfSYingwei Zheng br i1 %cond, label %if.then, label %if.else 175*5fa59edfSYingwei Zheng 176*5fa59edfSYingwei Zhengif.then: 177*5fa59edfSYingwei Zheng %conv = trunc nuw i128 %y to i16 178*5fa59edfSYingwei Zheng %cmp = icmp eq i16 %x, %conv 179*5fa59edfSYingwei Zheng ret i1 %cmp 180*5fa59edfSYingwei Zheng 181*5fa59edfSYingwei Zhengif.else: 182*5fa59edfSYingwei Zheng ret i1 false 183*5fa59edfSYingwei Zheng} 184*5fa59edfSYingwei Zheng 185*5fa59edfSYingwei Zheng; We do not know the sign of %x, so we cannot infer nuw for %ext. 186*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_trunc_nsw_icmp_trunc_nuw(i64 %x, i32 %y) { 187*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_trunc_nsw_icmp_trunc_nuw( 188*5fa59edfSYingwei Zheng; CHECK-SAME: i64 [[X:%.*]], i32 [[Y:%.*]]) { 189*5fa59edfSYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = trunc nsw i64 [[X]] to i32 190*5fa59edfSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]] 191*5fa59edfSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 192*5fa59edfSYingwei Zheng; CHECK: [[IF_THEN]]: 193*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[Y]] to i64 194*5fa59edfSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[X]], [[CONV]] 195*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 [[CMP]] 196*5fa59edfSYingwei Zheng; CHECK: [[IF_ELSE]]: 197*5fa59edfSYingwei Zheng; CHECK-NEXT: ret i1 false 198*5fa59edfSYingwei Zheng; 199*5fa59edfSYingwei Zheng %ext = trunc nsw i64 %x to i32 200*5fa59edfSYingwei Zheng %cond = icmp ult i32 %y, %ext 201*5fa59edfSYingwei Zheng br i1 %cond, label %if.then, label %if.else 202*5fa59edfSYingwei Zheng 203*5fa59edfSYingwei Zhengif.then: 204*5fa59edfSYingwei Zheng %conv = zext i32 %y to i64 205*5fa59edfSYingwei Zheng %cmp = icmp eq i64 %x, %conv 206*5fa59edfSYingwei Zheng ret i1 %cmp 207*5fa59edfSYingwei Zheng 208*5fa59edfSYingwei Zhengif.else: 209*5fa59edfSYingwei Zheng ret i1 false 210*5fa59edfSYingwei Zheng} 211*5fa59edfSYingwei Zheng 212*5fa59edfSYingwei Zhengdeclare void @cond() 213