1*4e9fe860SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*4e9fe860SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3*4e9fe860SFlorian Hahn 4*4e9fe860SFlorian Hahndefine i1 @cmp_sext(i32 %a, i32 %b){ 5*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext( 6*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 7*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 8*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 9*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 10*4e9fe860SFlorian Hahn; CHECK: then: 11*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 12*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64 13*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 14*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 true 15*4e9fe860SFlorian Hahn; CHECK: else: 16*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 17*4e9fe860SFlorian Hahn; 18*4e9fe860SFlorian Hahnentry: 19*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 20*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 21*4e9fe860SFlorian Hahn 22*4e9fe860SFlorian Hahnthen: 23*4e9fe860SFlorian Hahn %sa = sext i32 %a to i64 24*4e9fe860SFlorian Hahn %sb = sext i32 %b to i64 25*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, 1 26*4e9fe860SFlorian Hahn %cmp2 = icmp sge i64 %sb, %add 27*4e9fe860SFlorian Hahn ret i1 %cmp2 28*4e9fe860SFlorian Hahn 29*4e9fe860SFlorian Hahnelse: 30*4e9fe860SFlorian Hahn ret i1 false 31*4e9fe860SFlorian Hahn} 32*4e9fe860SFlorian Hahn 33*4e9fe860SFlorian Hahndefine i1 @cmp_sext_add(i32 %a, i32 %b){ 34*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_add( 35*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 36*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 37*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 38*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 39*4e9fe860SFlorian Hahn; CHECK: then: 40*4e9fe860SFlorian Hahn; CHECK-NEXT: [[A1:%.*]] = add nsw i32 [[A]], 1 41*4e9fe860SFlorian Hahn; CHECK-NEXT: [[B1:%.*]] = add nsw i32 [[B]], 1 42*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A1]] to i64 43*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B1]] to i64 44*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 45*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 true 46*4e9fe860SFlorian Hahn; CHECK: else: 47*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 48*4e9fe860SFlorian Hahn; 49*4e9fe860SFlorian Hahnentry: 50*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 51*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 52*4e9fe860SFlorian Hahn 53*4e9fe860SFlorian Hahnthen: 54*4e9fe860SFlorian Hahn %a1 = add nsw i32 %a, 1 55*4e9fe860SFlorian Hahn %b1 = add nsw i32 %b, 1 56*4e9fe860SFlorian Hahn %sa = sext i32 %a1 to i64 57*4e9fe860SFlorian Hahn %sb = sext i32 %b1 to i64 58*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, 1 59*4e9fe860SFlorian Hahn %cmp2 = icmp sge i64 %sb, %add 60*4e9fe860SFlorian Hahn ret i1 %cmp2 61*4e9fe860SFlorian Hahn 62*4e9fe860SFlorian Hahnelse: 63*4e9fe860SFlorian Hahn ret i1 false 64*4e9fe860SFlorian Hahn} 65*4e9fe860SFlorian Hahn 66*4e9fe860SFlorian Hahndefine i1 @cmp_sext_dynamic_increment(i32 %a, i32 %b, i64 %c){ 67*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_dynamic_increment( 68*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]]) { 69*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 70*4e9fe860SFlorian Hahn; CHECK-NEXT: [[POS:%.*]] = icmp slt i64 [[C]], 2 71*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[POS]]) 72*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 73*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 74*4e9fe860SFlorian Hahn; CHECK: then: 75*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 76*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64 77*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]] 78*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 true 79*4e9fe860SFlorian Hahn; CHECK: else: 80*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 81*4e9fe860SFlorian Hahn; 82*4e9fe860SFlorian Hahnentry: 83*4e9fe860SFlorian Hahn %pos = icmp slt i64 %c, 2 84*4e9fe860SFlorian Hahn call void @llvm.assume(i1 %pos) 85*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 86*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 87*4e9fe860SFlorian Hahn 88*4e9fe860SFlorian Hahnthen: 89*4e9fe860SFlorian Hahn %sa = sext i32 %a to i64 90*4e9fe860SFlorian Hahn %sb = sext i32 %b to i64 91*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, %c 92*4e9fe860SFlorian Hahn %cmp2 = icmp sge i64 %sb, %add 93*4e9fe860SFlorian Hahn ret i1 %cmp2 94*4e9fe860SFlorian Hahn 95*4e9fe860SFlorian Hahnelse: 96*4e9fe860SFlorian Hahn ret i1 false 97*4e9fe860SFlorian Hahn} 98*4e9fe860SFlorian Hahn 99*4e9fe860SFlorian Hahndefine i1 @cmp_zext_nneg(i32 %a, i32 %b){ 100*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_zext_nneg( 101*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 102*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 103*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 104*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 105*4e9fe860SFlorian Hahn; CHECK: then: 106*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64 107*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64 108*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 109*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 true 110*4e9fe860SFlorian Hahn; CHECK: else: 111*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 112*4e9fe860SFlorian Hahn; 113*4e9fe860SFlorian Hahnentry: 114*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 115*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 116*4e9fe860SFlorian Hahn 117*4e9fe860SFlorian Hahnthen: 118*4e9fe860SFlorian Hahn %sa = zext nneg i32 %a to i64 119*4e9fe860SFlorian Hahn %sb = zext nneg i32 %b to i64 120*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, 1 121*4e9fe860SFlorian Hahn %cmp2 = icmp sge i64 %sb, %add 122*4e9fe860SFlorian Hahn ret i1 %cmp2 123*4e9fe860SFlorian Hahn 124*4e9fe860SFlorian Hahnelse: 125*4e9fe860SFlorian Hahn ret i1 false 126*4e9fe860SFlorian Hahn} 127*4e9fe860SFlorian Hahn 128*4e9fe860SFlorian Hahn; Negative tests 129*4e9fe860SFlorian Hahn 130*4e9fe860SFlorian Hahndefine i1 @cmp_zext(i32 %a, i32 %b){ 131*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_zext( 132*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 133*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 134*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 135*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 136*4e9fe860SFlorian Hahn; CHECK: then: 137*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = zext i32 [[A]] to i64 138*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = zext i32 [[B]] to i64 139*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 140*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]] 141*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 [[CMP2]] 142*4e9fe860SFlorian Hahn; CHECK: else: 143*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 144*4e9fe860SFlorian Hahn; 145*4e9fe860SFlorian Hahnentry: 146*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 147*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 148*4e9fe860SFlorian Hahn 149*4e9fe860SFlorian Hahnthen: 150*4e9fe860SFlorian Hahn %sa = zext i32 %a to i64 151*4e9fe860SFlorian Hahn %sb = zext i32 %b to i64 152*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, 1 153*4e9fe860SFlorian Hahn %cmp2 = icmp sge i64 %sb, %add 154*4e9fe860SFlorian Hahn ret i1 %cmp2 155*4e9fe860SFlorian Hahn 156*4e9fe860SFlorian Hahnelse: 157*4e9fe860SFlorian Hahn ret i1 false 158*4e9fe860SFlorian Hahn} 159*4e9fe860SFlorian Hahn 160*4e9fe860SFlorian Hahndefine i1 @cmp_sext_unknown_increment(i32 %a, i32 %b, i64 %c){ 161*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_unknown_increment( 162*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]]) { 163*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 164*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 165*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 166*4e9fe860SFlorian Hahn; CHECK: then: 167*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 168*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64 169*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]] 170*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]] 171*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 [[CMP2]] 172*4e9fe860SFlorian Hahn; CHECK: else: 173*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 174*4e9fe860SFlorian Hahn; 175*4e9fe860SFlorian Hahnentry: 176*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 177*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 178*4e9fe860SFlorian Hahn 179*4e9fe860SFlorian Hahnthen: 180*4e9fe860SFlorian Hahn %sa = sext i32 %a to i64 181*4e9fe860SFlorian Hahn %sb = sext i32 %b to i64 182*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, %c 183*4e9fe860SFlorian Hahn %cmp2 = icmp sge i64 %sb, %add 184*4e9fe860SFlorian Hahn ret i1 %cmp2 185*4e9fe860SFlorian Hahn 186*4e9fe860SFlorian Hahnelse: 187*4e9fe860SFlorian Hahn ret i1 false 188*4e9fe860SFlorian Hahn} 189*4e9fe860SFlorian Hahn 190*4e9fe860SFlorian Hahndefine i1 @cmp_sext_sgt(i32 %a, i32 %b){ 191*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_sgt( 192*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 193*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 194*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 195*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 196*4e9fe860SFlorian Hahn; CHECK: then: 197*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 198*4e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64 199*4e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 200*4e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[SB]], [[ADD]] 201*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 [[CMP2]] 202*4e9fe860SFlorian Hahn; CHECK: else: 203*4e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 204*4e9fe860SFlorian Hahn; 205*4e9fe860SFlorian Hahnentry: 206*4e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 207*4e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 208*4e9fe860SFlorian Hahn 209*4e9fe860SFlorian Hahnthen: 210*4e9fe860SFlorian Hahn %sa = sext i32 %a to i64 211*4e9fe860SFlorian Hahn %sb = sext i32 %b to i64 212*4e9fe860SFlorian Hahn %add = add nsw i64 %sa, 1 213*4e9fe860SFlorian Hahn %cmp2 = icmp sgt i64 %sb, %add 214*4e9fe860SFlorian Hahn ret i1 %cmp2 215*4e9fe860SFlorian Hahn 216*4e9fe860SFlorian Hahnelse: 217*4e9fe860SFlorian Hahn ret i1 false 218*4e9fe860SFlorian Hahn} 219*4e9fe860SFlorian Hahn 220*4e9fe860SFlorian Hahndeclare void @use(i1) 221*4e9fe860SFlorian Hahn 222*4e9fe860SFlorian Hahndefine void @sge_sext(i16 %x, i32 %y) { 223*4e9fe860SFlorian Hahn; CHECK-LABEL: define void @sge_sext( 224*4e9fe860SFlorian Hahn; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) { 225*4e9fe860SFlorian Hahn; CHECK-NEXT: entry: 226*4e9fe860SFlorian Hahn; CHECK-NEXT: [[X_EXT:%.*]] = sext i16 [[X]] to i32 227*4e9fe860SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X_EXT]], [[Y]] 228*4e9fe860SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[Y]], -10 229*4e9fe860SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 230*4e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]] 231*4e9fe860SFlorian Hahn; CHECK: bb1: 232*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 233*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 234*4e9fe860SFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[X_EXT]], -9 235*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_3]]) 236*4e9fe860SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sge i32 [[X_EXT]], -9 237*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 238*4e9fe860SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 [[Y]], [[X_EXT]] 239*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 240*4e9fe860SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp sge i16 [[X]], -9 241*4e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 242*4e9fe860SFlorian Hahn; CHECK-NEXT: ret void 243*4e9fe860SFlorian Hahn; CHECK: bb2: 244*4e9fe860SFlorian Hahn; CHECK-NEXT: ret void 245*4e9fe860SFlorian Hahn; 246*4e9fe860SFlorian Hahnentry: 247*4e9fe860SFlorian Hahn %x.ext = sext i16 %x to i32 248*4e9fe860SFlorian Hahn %c.1 = icmp sge i32 %x.ext, %y 249*4e9fe860SFlorian Hahn %c.2 = icmp sge i32 %y, -10 250*4e9fe860SFlorian Hahn %and = and i1 %c.1, %c.2 251*4e9fe860SFlorian Hahn br i1 %and, label %bb1, label %bb2 252*4e9fe860SFlorian Hahn 253*4e9fe860SFlorian Hahnbb1: 254*4e9fe860SFlorian Hahn %t.1 = icmp sge i32 %x.ext, %y 255*4e9fe860SFlorian Hahn call void @use(i1 %t.1) 256*4e9fe860SFlorian Hahn %t.2 = icmp sge i16 %x, -10 257*4e9fe860SFlorian Hahn call void @use(i1 %t.2) 258*4e9fe860SFlorian Hahn %t.3 = icmp sge i32 %x.ext, -9 259*4e9fe860SFlorian Hahn call void @use(i1 %t.3) 260*4e9fe860SFlorian Hahn %c.3 = icmp sge i32 %x.ext, -9 261*4e9fe860SFlorian Hahn call void @use(i1 %c.3) 262*4e9fe860SFlorian Hahn %c.4 = icmp sge i32 %y, %x.ext 263*4e9fe860SFlorian Hahn call void @use(i1 %c.4) 264*4e9fe860SFlorian Hahn %c.5 = icmp sge i16 %x, -9 265*4e9fe860SFlorian Hahn call void @use(i1 %c.5) 266*4e9fe860SFlorian Hahn ret void 267*4e9fe860SFlorian Hahn 268*4e9fe860SFlorian Hahnbb2: 269*4e9fe860SFlorian Hahn ret void 270*4e9fe860SFlorian Hahn} 271