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 5*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo( 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = icmp slt i32 %a, %b 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[J:%.*]] = select i1 [[E]], i32 %c, i32 %d 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[J]] 10*9880d681SAndroid Build Coastguard Worker; 11*9880d681SAndroid Build Coastguard Worker %e = icmp slt i32 %a, %b 12*9880d681SAndroid Build Coastguard Worker %f = sext i1 %e to i32 13*9880d681SAndroid Build Coastguard Worker %g = and i32 %c, %f 14*9880d681SAndroid Build Coastguard Worker %h = xor i32 %f, -1 15*9880d681SAndroid Build Coastguard Worker %i = and i32 %d, %h 16*9880d681SAndroid Build Coastguard Worker %j = or i32 %g, %i 17*9880d681SAndroid Build Coastguard Worker ret i32 %j 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar( 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = icmp slt i32 %a, %b 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[J:%.*]] = select i1 [[E]], i32 %c, i32 %d 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[J]] 25*9880d681SAndroid Build Coastguard Worker; 26*9880d681SAndroid Build Coastguard Worker %e = icmp slt i32 %a, %b 27*9880d681SAndroid Build Coastguard Worker %f = sext i1 %e to i32 28*9880d681SAndroid Build Coastguard Worker %g = and i32 %c, %f 29*9880d681SAndroid Build Coastguard Worker %h = xor i32 %f, -1 30*9880d681SAndroid Build Coastguard Worker %i = and i32 %d, %h 31*9880d681SAndroid Build Coastguard Worker %j = or i32 %i, %g 32*9880d681SAndroid Build Coastguard Worker ret i32 %j 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @goo( 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T0:%.*]] = icmp slt i32 %a, %b 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T3:%.*]] = select i1 [[T0]], i32 %c, i32 %d 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[T3]] 40*9880d681SAndroid Build Coastguard Worker; 41*9880d681SAndroid Build Coastguard Worker %t0 = icmp slt i32 %a, %b 42*9880d681SAndroid Build Coastguard Worker %iftmp.0.0 = select i1 %t0, i32 -1, i32 0 43*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %iftmp.0.0, %c 44*9880d681SAndroid Build Coastguard Worker %not = xor i32 %iftmp.0.0, -1 45*9880d681SAndroid Build Coastguard Worker %t2 = and i32 %not, %d 46*9880d681SAndroid Build Coastguard Worker %t3 = or i32 %t1, %t2 47*9880d681SAndroid Build Coastguard Worker ret i32 %t3 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @poo( 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T0:%.*]] = icmp slt i32 %a, %b 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T3:%.*]] = select i1 [[T0]], i32 %c, i32 %d 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[T3]] 55*9880d681SAndroid Build Coastguard Worker; 56*9880d681SAndroid Build Coastguard Worker %t0 = icmp slt i32 %a, %b 57*9880d681SAndroid Build Coastguard Worker %iftmp.0.0 = select i1 %t0, i32 -1, i32 0 58*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %iftmp.0.0, %c 59*9880d681SAndroid Build Coastguard Worker %iftmp = select i1 %t0, i32 0, i32 -1 60*9880d681SAndroid Build Coastguard Worker %t2 = and i32 %iftmp, %d 61*9880d681SAndroid Build Coastguard Worker %t3 = or i32 %t1, %t2 62*9880d681SAndroid Build Coastguard Worker ret i32 %t3 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @par( 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T0:%.*]] = icmp slt i32 %a, %b 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T3:%.*]] = select i1 [[T0]], i32 %c, i32 %d 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[T3]] 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker %t0 = icmp slt i32 %a, %b 72*9880d681SAndroid Build Coastguard Worker %iftmp.1.0 = select i1 %t0, i32 -1, i32 0 73*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %iftmp.1.0, %c 74*9880d681SAndroid Build Coastguard Worker %not = xor i32 %iftmp.1.0, -1 75*9880d681SAndroid Build Coastguard Worker %t2 = and i32 %not, %d 76*9880d681SAndroid Build Coastguard Worker %t3 = or i32 %t1, %t2 77*9880d681SAndroid Build Coastguard Worker ret i32 %t3 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; In the following tests (8 commutation variants), verify that a bitcast doesn't get 81*9880d681SAndroid Build Coastguard Worker; in the way of a select transform. These bitcasts are common in SSE/AVX and possibly 82*9880d681SAndroid Build Coastguard Worker; other vector code because of canonicalization to i64 elements for vectors. 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; The fptosi instructions are included to avoid commutation canonicalization based on 85*9880d681SAndroid Build Coastguard Worker; operator weight. Using another cast operator ensures that both operands of all logic 86*9880d681SAndroid Build Coastguard Worker; ops are equally weighted, and this ensures that we're testing all commutation 87*9880d681SAndroid Build Coastguard Worker; possibilities. 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap0(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap0( 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 98*9880d681SAndroid Build Coastguard Worker; 99*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 100*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 101*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 102*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 103*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %bc1, %sia 104*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 105*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 106*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %bc2, %sib 107*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 108*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap1(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap1( 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 120*9880d681SAndroid Build Coastguard Worker; 121*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 122*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 123*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 124*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 125*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %bc1, %sia 126*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 127*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 128*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %bc2, %sib 129*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and2, %and1 130*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap2(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap2( 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 142*9880d681SAndroid Build Coastguard Worker; 143*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 144*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 145*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 146*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 147*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %bc1, %sia 148*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 149*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 150*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %sib, %bc2 151*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 152*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap3(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap3( 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 164*9880d681SAndroid Build Coastguard Worker; 165*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 166*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 167*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 168*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 169*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %bc1, %sia 170*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 171*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 172*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %sib, %bc2 173*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and2, %and1 174*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap4(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap4( 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 186*9880d681SAndroid Build Coastguard Worker; 187*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 188*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 189*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 190*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 191*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %sia, %bc1 192*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 193*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 194*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %bc2, %sib 195*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 196*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap5(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 200*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap5( 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 208*9880d681SAndroid Build Coastguard Worker; 209*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 210*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 211*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 212*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 213*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %sia, %bc1 214*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 215*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 216*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %bc2, %sib 217*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and2, %and1 218*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap6(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap6( 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 230*9880d681SAndroid Build Coastguard Worker; 231*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 232*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 233*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 234*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 235*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %sia, %bc1 236*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 237*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 238*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %sib, %bc2 239*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 240*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap7(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) { 244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap7( 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64> 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64> 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32> 248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32> 249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]] 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64> 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[OR]] 252*9880d681SAndroid Build Coastguard Worker; 253*9880d681SAndroid Build Coastguard Worker %sia = fptosi <2 x double> %a to <2 x i64> 254*9880d681SAndroid Build Coastguard Worker %sib = fptosi <2 x double> %b to <2 x i64> 255*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 256*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 257*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %sia, %bc1 258*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 259*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 260*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %sib, %bc2 261*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and2, %and1 262*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_multi_uses(<4 x i1> %cmp, <2 x i64> %a, <2 x i64> %b) { 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_multi_uses( 267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> %cmp to <4 x i32> 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BC1:%.*]] = bitcast <4 x i32> [[SEXT]] to <2 x i64> 269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND1:%.*]] = and <2 x i64> [[BC1]], %a 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NEG:%.*]] = xor <4 x i32> [[SEXT]], <i32 -1, i32 -1, i32 -1, i32 -1> 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BC2:%.*]] = bitcast <4 x i32> [[NEG]] to <2 x i64> 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND2:%.*]] = and <2 x i64> [[BC2]], %b 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or <2 x i64> [[AND2]], [[AND1]] 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add <2 x i64> [[AND2]], [[BC2]] 275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SUB:%.*]] = sub <2 x i64> [[OR]], [[ADD]] 276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[SUB]] 277*9880d681SAndroid Build Coastguard Worker; 278*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i1> %cmp to <4 x i32> 279*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i32> %sext to <2 x i64> 280*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %a, %bc1 281*9880d681SAndroid Build Coastguard Worker %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1> 282*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %neg to <2 x i64> 283*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %b, %bc2 284*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and2, %and1 285*9880d681SAndroid Build Coastguard Worker %add = add <2 x i64> %and2, %bc2 286*9880d681SAndroid Build Coastguard Worker %sub = sub <2 x i64> %or, %add 287*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %sub 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdefine i1 @bools(i1 %a, i1 %b, i1 %c) { 291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bools( 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 294*9880d681SAndroid Build Coastguard Worker; 295*9880d681SAndroid Build Coastguard Worker %not = xor i1 %c, -1 296*9880d681SAndroid Build Coastguard Worker %and1 = and i1 %not, %a 297*9880d681SAndroid Build Coastguard Worker %and2 = and i1 %c, %b 298*9880d681SAndroid Build Coastguard Worker %or = or i1 %and1, %and2 299*9880d681SAndroid Build Coastguard Worker ret i1 %or 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker; Form a select if we know we can get replace 2 simple logic ops. 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdefine i1 @bools_multi_uses1(i1 %a, i1 %b, i1 %c) { 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bools_multi_uses1( 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT:%.*]] = xor i1 %c, true 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND1:%.*]] = and i1 [[NOT]], %a 308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a 309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[TMP1]], [[AND1]] 310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[XOR]] 311*9880d681SAndroid Build Coastguard Worker; 312*9880d681SAndroid Build Coastguard Worker %not = xor i1 %c, -1 313*9880d681SAndroid Build Coastguard Worker %and1 = and i1 %not, %a 314*9880d681SAndroid Build Coastguard Worker %and2 = and i1 %c, %b 315*9880d681SAndroid Build Coastguard Worker %or = or i1 %and1, %and2 316*9880d681SAndroid Build Coastguard Worker %xor = xor i1 %or, %and1 317*9880d681SAndroid Build Coastguard Worker ret i1 %xor 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker; Don't replace a cheap logic op with a potentially expensive select 321*9880d681SAndroid Build Coastguard Worker; unless we can also eliminate one of the other original ops. 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Workerdefine i1 @bools_multi_uses2(i1 %a, i1 %b, i1 %c) { 324*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bools_multi_uses2( 325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT:%.*]] = xor i1 %c, true 326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND1:%.*]] = and i1 [[NOT]], %a 327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND2:%.*]] = and i1 %c, %b 328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = xor i1 [[AND1]], [[AND2]] 329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[ADD]] 330*9880d681SAndroid Build Coastguard Worker; 331*9880d681SAndroid Build Coastguard Worker %not = xor i1 %c, -1 332*9880d681SAndroid Build Coastguard Worker %and1 = and i1 %not, %a 333*9880d681SAndroid Build Coastguard Worker %and2 = and i1 %c, %b 334*9880d681SAndroid Build Coastguard Worker %or = or i1 %and1, %and2 335*9880d681SAndroid Build Coastguard Worker %add = add i1 %and1, %and2 336*9880d681SAndroid Build Coastguard Worker %and3 = and i1 %or, %add 337*9880d681SAndroid Build Coastguard Worker ret i1 %and3 338*9880d681SAndroid Build Coastguard Worker} 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Workerdefine <4 x i1> @vec_of_bools(<4 x i1> %a, <4 x i1> %b, <4 x i1> %c) { 341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_of_bools( 342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = select <4 x i1> %c, <4 x i1> %b, <4 x i1> %a 343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i1> [[TMP1]] 344*9880d681SAndroid Build Coastguard Worker; 345*9880d681SAndroid Build Coastguard Worker %not = xor <4 x i1> %c, <i1 true, i1 true, i1 true, i1 true> 346*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i1> %not, %a 347*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i1> %b, %c 348*9880d681SAndroid Build Coastguard Worker %or = or <4 x i1> %and2, %and1 349*9880d681SAndroid Build Coastguard Worker ret <4 x i1> %or 350*9880d681SAndroid Build Coastguard Worker} 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Workerdefine i4 @vec_of_casted_bools(i4 %a, i4 %b, <4 x i1> %c) { 353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_of_casted_bools( 354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast i4 %a to <4 x i1> 355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast i4 %b to <4 x i1> 356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> %c, <4 x i1> [[TMP2]], <4 x i1> [[TMP1]] 357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4 358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i4 [[TMP4]] 359*9880d681SAndroid Build Coastguard Worker; 360*9880d681SAndroid Build Coastguard Worker %not = xor <4 x i1> %c, <i1 true, i1 true, i1 true, i1 true> 361*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x i1> %not to i4 362*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i1> %c to i4 363*9880d681SAndroid Build Coastguard Worker %and1 = and i4 %a, %bc1 364*9880d681SAndroid Build Coastguard Worker %and2 = and i4 %bc2, %b 365*9880d681SAndroid Build Coastguard Worker %or = or i4 %and1, %and2 366*9880d681SAndroid Build Coastguard Worker ret i4 %or 367*9880d681SAndroid Build Coastguard Worker} 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker; Inverted 'and' constants mean this is a select. 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_sel_consts(<4 x i32> %a, <4 x i32> %b) { 372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_consts( 373*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = select <4 x i1> <i1 true, i1 false, i1 false, i1 true>, <4 x i32> %a, <4 x i32> %b 374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[TMP1]] 375*9880d681SAndroid Build Coastguard Worker; 376*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 -1> 377*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %b, <i32 0, i32 -1, i32 -1, i32 0> 378*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 379*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 380*9880d681SAndroid Build Coastguard Worker} 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Worker; The select condition constant is always derived from the first operand of the 'or'. 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Workerdefine <3 x i129> @vec_sel_consts_weird(<3 x i129> %a, <3 x i129> %b) { 385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_consts_weird( 386*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> <i1 false, i1 true, i1 false>, <3 x i129> %b, <3 x i129> %a 387*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i129> [[TMP1]] 388*9880d681SAndroid Build Coastguard Worker; 389*9880d681SAndroid Build Coastguard Worker %and1 = and <3 x i129> %a, <i129 -1, i129 0, i129 -1> 390*9880d681SAndroid Build Coastguard Worker %and2 = and <3 x i129> %b, <i129 0, i129 -1, i129 0> 391*9880d681SAndroid Build Coastguard Worker %or = or <3 x i129> %and2, %and1 392*9880d681SAndroid Build Coastguard Worker ret <3 x i129> %or 393*9880d681SAndroid Build Coastguard Worker} 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker; The mask elements must be inverted for this to be a select. 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_not_sel_consts(<4 x i32> %a, <4 x i32> %b) { 398*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_not_sel_consts( 399*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND1:%.*]] = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 0> 400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND2:%.*]] = and <4 x i32> %b, <i32 0, i32 -1, i32 0, i32 -1> 401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or <4 x i32> [[AND1]], [[AND2]] 402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[OR]] 403*9880d681SAndroid Build Coastguard Worker; 404*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 0> 405*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %b, <i32 0, i32 -1, i32 0, i32 -1> 406*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 407*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 408*9880d681SAndroid Build Coastguard Worker} 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker; The inverted constants may be operands of xor instructions. 411*9880d681SAndroid Build Coastguard Worker 412*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_sel_xor(<4 x i32> %a, <4 x i32> %b, <4 x i1> %c) { 413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_xor( 414*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i1> %c, <i1 false, i1 true, i1 true, i1 true> 415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> %a, <4 x i32> %b 416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[TMP2]] 417*9880d681SAndroid Build Coastguard Worker; 418*9880d681SAndroid Build Coastguard Worker %mask = sext <4 x i1> %c to <4 x i32> 419*9880d681SAndroid Build Coastguard Worker %mask_flip1 = xor <4 x i32> %mask, <i32 -1, i32 0, i32 0, i32 0> 420*9880d681SAndroid Build Coastguard Worker %not_mask_flip1 = xor <4 x i32> %mask, <i32 0, i32 -1, i32 -1, i32 -1> 421*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %not_mask_flip1, %a 422*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %mask_flip1, %b 423*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 424*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 425*9880d681SAndroid Build Coastguard Worker} 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Worker; Allow the transform even if the mask values have multiple uses because 428*9880d681SAndroid Build Coastguard Worker; there's still a net reduction of instructions from removing the and/and/or. 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_sel_xor_multi_use(<4 x i32> %a, <4 x i32> %b, <4 x i1> %c) { 431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_xor_multi_use( 432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MASK:%.*]] = sext <4 x i1> %c to <4 x i32> 433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MASK_FLIP1:%.*]] = xor <4 x i32> [[MASK]], <i32 -1, i32 0, i32 0, i32 0> 434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i1> %c, <i1 false, i1 true, i1 true, i1 true> 435*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> %a, <4 x i32> %b 436*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[TMP2]], [[MASK_FLIP1]] 437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[ADD]] 438*9880d681SAndroid Build Coastguard Worker; 439*9880d681SAndroid Build Coastguard Worker %mask = sext <4 x i1> %c to <4 x i32> 440*9880d681SAndroid Build Coastguard Worker %mask_flip1 = xor <4 x i32> %mask, <i32 -1, i32 0, i32 0, i32 0> 441*9880d681SAndroid Build Coastguard Worker %not_mask_flip1 = xor <4 x i32> %mask, <i32 0, i32 -1, i32 -1, i32 -1> 442*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %not_mask_flip1, %a 443*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %mask_flip1, %b 444*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 445*9880d681SAndroid Build Coastguard Worker %add = add <4 x i32> %or, %mask_flip1 446*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %add 447*9880d681SAndroid Build Coastguard Worker} 448*9880d681SAndroid Build Coastguard Worker 449