1*86ef0392SZ572; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*86ef0392SZ572; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3*86ef0392SZ572 4*86ef0392SZ572declare i4 @llvm.abs.i4(i4, i1) 5*86ef0392SZ572 6*86ef0392SZ572define i1 @icmp_sge_abs(i4 %arg) { 7*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs( 8*86ef0392SZ572; CHECK-NEXT: ret i1 true 9*86ef0392SZ572; 10*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 11*86ef0392SZ572 %cmp = icmp sge i4 %abs, %arg 12*86ef0392SZ572 ret i1 %cmp 13*86ef0392SZ572} 14*86ef0392SZ572 15*86ef0392SZ572define i1 @icmp_sge_abs_false(i4 %arg) { 16*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs_false( 17*86ef0392SZ572; CHECK-NEXT: ret i1 true 18*86ef0392SZ572; 19*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 20*86ef0392SZ572 %cmp = icmp sge i4 %abs, %arg 21*86ef0392SZ572 ret i1 %cmp 22*86ef0392SZ572} 23*86ef0392SZ572 24*86ef0392SZ572define i1 @icmp_eq_abs(i4 %arg) { 25*86ef0392SZ572; CHECK-LABEL: @icmp_eq_abs( 26*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i4 [[ARG:%.*]], -1 27*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 28*86ef0392SZ572; 29*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 30*86ef0392SZ572 %cmp = icmp eq i4 %abs, %arg 31*86ef0392SZ572 ret i1 %cmp 32*86ef0392SZ572} 33*86ef0392SZ572 34*86ef0392SZ572define i1 @icmp_eq_abs_false(i4 %arg) { 35*86ef0392SZ572; CHECK-LABEL: @icmp_eq_abs_false( 36*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp ult i4 [[ARG:%.*]], -7 37*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 38*86ef0392SZ572; 39*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 40*86ef0392SZ572 %cmp = icmp eq i4 %abs, %arg 41*86ef0392SZ572 ret i1 %cmp 42*86ef0392SZ572} 43*86ef0392SZ572 44*86ef0392SZ572define i1 @icmp_ne_abs(i4 %arg) { 45*86ef0392SZ572; CHECK-LABEL: @icmp_ne_abs( 46*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[ARG:%.*]], 0 47*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 48*86ef0392SZ572; 49*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 50*86ef0392SZ572 %cmp = icmp ne i4 %abs, %arg 51*86ef0392SZ572 ret i1 %cmp 52*86ef0392SZ572} 53*86ef0392SZ572 54*86ef0392SZ572define i1 @icmp_ne_abs_false(i4 %arg) { 55*86ef0392SZ572; CHECK-LABEL: @icmp_ne_abs_false( 56*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i4 [[ARG:%.*]], -8 57*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 58*86ef0392SZ572; 59*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 60*86ef0392SZ572 %cmp = icmp ne i4 %abs, %arg 61*86ef0392SZ572 ret i1 %cmp 62*86ef0392SZ572} 63*86ef0392SZ572 64*86ef0392SZ572define i1 @icmp_sle_abs(i4 %arg) { 65*86ef0392SZ572; CHECK-LABEL: @icmp_sle_abs( 66*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i4 [[ARG:%.*]], -1 67*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 68*86ef0392SZ572; 69*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 70*86ef0392SZ572 %cmp = icmp sle i4 %abs, %arg 71*86ef0392SZ572 ret i1 %cmp 72*86ef0392SZ572} 73*86ef0392SZ572 74*86ef0392SZ572define i1 @icmp_sle_abs_false(i4 %arg) { 75*86ef0392SZ572; CHECK-LABEL: @icmp_sle_abs_false( 76*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp ult i4 [[ARG:%.*]], -7 77*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 78*86ef0392SZ572; 79*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 80*86ef0392SZ572 %cmp = icmp sle i4 %abs, %arg 81*86ef0392SZ572 ret i1 %cmp 82*86ef0392SZ572} 83*86ef0392SZ572 84*86ef0392SZ572define i1 @icmp_slt_abs(i4 %arg) { 85*86ef0392SZ572; CHECK-LABEL: @icmp_slt_abs( 86*86ef0392SZ572; CHECK-NEXT: ret i1 false 87*86ef0392SZ572; 88*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 89*86ef0392SZ572 %cmp = icmp slt i4 %abs, %arg 90*86ef0392SZ572 ret i1 %cmp 91*86ef0392SZ572} 92*86ef0392SZ572 93*86ef0392SZ572define i1 @icmp_slt_abs_false(i4 %arg) { 94*86ef0392SZ572; CHECK-LABEL: @icmp_slt_abs_false( 95*86ef0392SZ572; CHECK-NEXT: ret i1 false 96*86ef0392SZ572; 97*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 98*86ef0392SZ572 %cmp = icmp slt i4 %abs, %arg 99*86ef0392SZ572 ret i1 %cmp 100*86ef0392SZ572} 101*86ef0392SZ572 102*86ef0392SZ572define i1 @icmp_sgt_abs(i4 %arg) { 103*86ef0392SZ572; CHECK-LABEL: @icmp_sgt_abs( 104*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[ARG:%.*]], 0 105*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 106*86ef0392SZ572; 107*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 108*86ef0392SZ572 %cmp = icmp sgt i4 %abs, %arg 109*86ef0392SZ572 ret i1 %cmp 110*86ef0392SZ572} 111*86ef0392SZ572 112*86ef0392SZ572define i1 @icmp_sgt_abs_false(i4 %arg) { 113*86ef0392SZ572; CHECK-LABEL: @icmp_sgt_abs_false( 114*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i4 [[ARG:%.*]], -8 115*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 116*86ef0392SZ572; 117*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 118*86ef0392SZ572 %cmp = icmp sgt i4 %abs, %arg 119*86ef0392SZ572 ret i1 %cmp 120*86ef0392SZ572} 121*86ef0392SZ572 122*86ef0392SZ572define i1 @icmp_ugt_abs(i4 %arg) { 123*86ef0392SZ572; CHECK-LABEL: @icmp_ugt_abs( 124*86ef0392SZ572; CHECK-NEXT: ret i1 false 125*86ef0392SZ572; 126*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 127*86ef0392SZ572 %cmp = icmp ugt i4 %abs, %arg 128*86ef0392SZ572 ret i1 %cmp 129*86ef0392SZ572} 130*86ef0392SZ572 131*86ef0392SZ572define i1 @icmp_ugt_abs_false(i4 %arg) { 132*86ef0392SZ572; CHECK-LABEL: @icmp_ugt_abs_false( 133*86ef0392SZ572; CHECK-NEXT: ret i1 false 134*86ef0392SZ572; 135*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 136*86ef0392SZ572 %cmp = icmp ugt i4 %abs, %arg 137*86ef0392SZ572 ret i1 %cmp 138*86ef0392SZ572} 139*86ef0392SZ572 140*86ef0392SZ572define i1 @icmp_uge_abs(i4 %arg) { 141*86ef0392SZ572; CHECK-LABEL: @icmp_uge_abs( 142*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i4 [[ARG:%.*]], -1 143*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 144*86ef0392SZ572; 145*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 146*86ef0392SZ572 %cmp = icmp uge i4 %abs, %arg 147*86ef0392SZ572 ret i1 %cmp 148*86ef0392SZ572} 149*86ef0392SZ572 150*86ef0392SZ572define i1 @icmp_uge_abs_false(i4 %arg) { 151*86ef0392SZ572; CHECK-LABEL: @icmp_uge_abs_false( 152*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp ult i4 [[ARG:%.*]], -7 153*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 154*86ef0392SZ572; 155*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 156*86ef0392SZ572 %cmp = icmp uge i4 %abs, %arg 157*86ef0392SZ572 ret i1 %cmp 158*86ef0392SZ572} 159*86ef0392SZ572 160*86ef0392SZ572define i1 @icmp_ule_abs(i4 %arg) { 161*86ef0392SZ572; CHECK-LABEL: @icmp_ule_abs( 162*86ef0392SZ572; CHECK-NEXT: ret i1 true 163*86ef0392SZ572; 164*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 165*86ef0392SZ572 %cmp = icmp ule i4 %abs, %arg 166*86ef0392SZ572 ret i1 %cmp 167*86ef0392SZ572} 168*86ef0392SZ572 169*86ef0392SZ572define i1 @icmp_ule_abs_false(i4 %arg) { 170*86ef0392SZ572; CHECK-LABEL: @icmp_ule_abs_false( 171*86ef0392SZ572; CHECK-NEXT: ret i1 true 172*86ef0392SZ572; 173*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 174*86ef0392SZ572 %cmp = icmp ule i4 %abs, %arg 175*86ef0392SZ572 ret i1 %cmp 176*86ef0392SZ572} 177*86ef0392SZ572 178*86ef0392SZ572define i1 @icmp_ult_abs(i4 %arg) { 179*86ef0392SZ572; CHECK-LABEL: @icmp_ult_abs( 180*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[ARG:%.*]], 0 181*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 182*86ef0392SZ572; 183*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 184*86ef0392SZ572 %cmp = icmp ult i4 %abs, %arg 185*86ef0392SZ572 ret i1 %cmp 186*86ef0392SZ572} 187*86ef0392SZ572 188*86ef0392SZ572define i1 @icmp_ult_abs_false(i4 %arg) { 189*86ef0392SZ572; CHECK-LABEL: @icmp_ult_abs_false( 190*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i4 [[ARG:%.*]], -8 191*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 192*86ef0392SZ572; 193*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false) 194*86ef0392SZ572 %cmp = icmp ult i4 %abs, %arg 195*86ef0392SZ572 ret i1 %cmp 196*86ef0392SZ572} 197*86ef0392SZ572 198*86ef0392SZ572define i1 @icmp_sge_abs2(i4 %arg) { 199*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs2( 200*86ef0392SZ572; CHECK-NEXT: [[X:%.*]] = mul i4 [[ARG:%.*]], [[ARG]] 201*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i4 [[X]], -1 202*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 203*86ef0392SZ572; 204*86ef0392SZ572 %x = mul i4 %arg, %arg ; thwart complexity-based canonicalization 205*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %x, i1 true) 206*86ef0392SZ572 %cmp = icmp sge i4 %x, %abs 207*86ef0392SZ572 ret i1 %cmp 208*86ef0392SZ572} 209*86ef0392SZ572 210*86ef0392SZ572define i1 @icmp_sge_abs_mismatched_op(i4 %arg, i4 %arg2) { 211*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs_mismatched_op( 212*86ef0392SZ572; CHECK-NEXT: [[ABS:%.*]] = call i4 @llvm.abs.i4(i4 [[ARG:%.*]], i1 true) 213*86ef0392SZ572; CHECK-NEXT: [[CMP:%.*]] = icmp sge i4 [[ABS]], [[ARG2:%.*]] 214*86ef0392SZ572; CHECK-NEXT: ret i1 [[CMP]] 215*86ef0392SZ572; 216*86ef0392SZ572 %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true) 217*86ef0392SZ572 %cmp = icmp sge i4 %abs, %arg2 218*86ef0392SZ572 ret i1 %cmp 219*86ef0392SZ572 } 220