1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Canonicalize vector ge/le comparisons with constants to gt/lt. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Normal types are ConstantDataVectors. Test the constant values adjacent to the 7*9880d681SAndroid Build Coastguard Worker; min/max values that we're not allowed to transform. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @sge(<2 x i8> %x) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sge( 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> %x, <i8 -128, i8 126> 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge <2 x i8> %x, <i8 -127, i8 -129> 15*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @uge(<2 x i8> %x) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uge( 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> %x, <i8 -2, i8 0> 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 22*9880d681SAndroid Build Coastguard Worker; 23*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge <2 x i8> %x, <i8 -1, i8 1> 24*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @sle(<2 x i8> %x) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sle( 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %x, <i8 127, i8 -127> 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 31*9880d681SAndroid Build Coastguard Worker; 32*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <2 x i8> %x, <i8 126, i8 128> 33*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @ule(<2 x i8> %x) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ule( 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> %x, <i8 -1, i8 1> 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 40*9880d681SAndroid Build Coastguard Worker; 41*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule <2 x i8> %x, <i8 254, i8 0> 42*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Zeros are special: they're ConstantAggregateZero. 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @sge_zero(<2 x i8> %x) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sge_zero( 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> %x, <i8 -1, i8 -1> 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 51*9880d681SAndroid Build Coastguard Worker; 52*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge <2 x i8> %x, <i8 0, i8 0> 53*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @uge_zero(<2 x i8> %x) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uge_zero( 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 59*9880d681SAndroid Build Coastguard Worker; 60*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge <2 x i8> %x, <i8 0, i8 0> 61*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @sle_zero(<2 x i8> %x) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sle_zero( 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %x, <i8 1, i8 1> 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 68*9880d681SAndroid Build Coastguard Worker; 69*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <2 x i8> %x, <i8 0, i8 0> 70*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @ule_zero(<2 x i8> %x) { 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ule_zero( 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> %x, <i8 1, i8 1> 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 77*9880d681SAndroid Build Coastguard Worker; 78*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule <2 x i8> %x, <i8 0, i8 0> 79*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; Weird types are ConstantVectors, not ConstantDataVectors. For an i3 type: 83*9880d681SAndroid Build Coastguard Worker; Signed min = -4 84*9880d681SAndroid Build Coastguard Worker; Unsigned min = 0 85*9880d681SAndroid Build Coastguard Worker; Signed max = 3 86*9880d681SAndroid Build Coastguard Worker; Unsigned max = 7 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @sge_weird(<3 x i3> %x) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sge_weird( 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <3 x i3> %x, <i3 -4, i3 2, i3 -1> 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i1> [[CMP]] 92*9880d681SAndroid Build Coastguard Worker; 93*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge <3 x i3> %x, <i3 -3, i3 -5, i3 0> 94*9880d681SAndroid Build Coastguard Worker ret <3 x i1> %cmp 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @uge_weird(<3 x i3> %x) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uge_weird( 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <3 x i3> %x, <i3 -2, i3 0, i3 1> 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i1> [[CMP]] 101*9880d681SAndroid Build Coastguard Worker; 102*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge <3 x i3> %x, <i3 -1, i3 1, i3 2> 103*9880d681SAndroid Build Coastguard Worker ret <3 x i1> %cmp 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @sle_weird(<3 x i3> %x) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sle_weird( 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp slt <3 x i3> %x, <i3 3, i3 -3, i3 1> 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i1> [[CMP]] 110*9880d681SAndroid Build Coastguard Worker; 111*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <3 x i3> %x, <i3 2, i3 4, i3 0> 112*9880d681SAndroid Build Coastguard Worker ret <3 x i1> %cmp 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @ule_weird(<3 x i3> %x) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ule_weird( 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ult <3 x i3> %x, <i3 -1, i3 1, i3 2> 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i1> [[CMP]] 119*9880d681SAndroid Build Coastguard Worker; 120*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule <3 x i3> %x, <i3 6, i3 0, i3 1> 121*9880d681SAndroid Build Coastguard Worker ret <3 x i1> %cmp 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; We can't do the transform if any constants are already at the limits. 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @sge_min(<2 x i3> %x) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sge_min( 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sge <2 x i3> %x, <i3 -4, i3 1> 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 130*9880d681SAndroid Build Coastguard Worker; 131*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge <2 x i3> %x, <i3 -4, i3 1> 132*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @uge_min(<2 x i3> %x) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uge_min( 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp uge <2 x i3> %x, <i3 1, i3 0> 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 139*9880d681SAndroid Build Coastguard Worker; 140*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge <2 x i3> %x, <i3 1, i3 0> 141*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @sle_max(<2 x i3> %x) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sle_max( 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i3> %x, <i3 1, i3 3> 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 148*9880d681SAndroid Build Coastguard Worker; 149*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <2 x i3> %x, <i3 1, i3 3> 150*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @ule_max(<2 x i3> %x) { 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ule_max( 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ule <2 x i3> %x, <i3 -1, i3 1> 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 157*9880d681SAndroid Build Coastguard Worker; 158*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule <2 x i3> %x, <i3 7, i3 1> 159*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; If we can't determine if a constant element is min/max (eg, it's a ConstantExpr), do nothing. 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @PR27756_1(<2 x i8> %a) { 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR27756_1( 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i8> %a, <i8 bitcast (<2 x i4> <i4 1, i4 2> to i8), i8 0> 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 168*9880d681SAndroid Build Coastguard Worker; 169*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <2 x i8> %a, <i8 bitcast (<2 x i4> <i4 1, i4 2> to i8), i8 0> 170*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; Undef elements don't prevent the transform of the comparison. 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @PR27756_2(<2 x i8> %a) { 176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR27756_2( 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %a, <i8 undef, i8 1> 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 179*9880d681SAndroid Build Coastguard Worker; 180*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <2 x i8> %a, <i8 undef, i8 0> 181*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker@someglobal = global i32 0 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @PR27786(<2 x i8> %a) { 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR27786( 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i8> %a, bitcast (i16 ptrtoint (i32* @someglobal to i16) to <2 x i8>) 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[CMP]] 190*9880d681SAndroid Build Coastguard Worker; 191*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <2 x i8> %a, bitcast (i16 ptrtoint (i32* @someglobal to i16) to <2 x i8>) 192*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %cmp 193*9880d681SAndroid Build Coastguard Worker} 194