1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -march=arm -mcpu=cortex-a8 | FileCheck %s --check-prefix=COST 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; Make sure that ARM backend with NEON handles vselect. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine void @vmax_v4i32(<4 x i32>* %m, <4 x i32> %a, <4 x i32> %b) { 6*9880d681SAndroid Build Coastguard Worker; CHECK: vmax.s32 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}} 7*9880d681SAndroid Build Coastguard Worker %cmpres = icmp sgt <4 x i32> %a, %b 8*9880d681SAndroid Build Coastguard Worker %maxres = select <4 x i1> %cmpres, <4 x i32> %a, <4 x i32> %b 9*9880d681SAndroid Build Coastguard Worker store <4 x i32> %maxres, <4 x i32>* %m 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker%T0_10 = type <16 x i16> 14*9880d681SAndroid Build Coastguard Worker%T1_10 = type <16 x i1> 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func_blend10: 16*9880d681SAndroid Build Coastguard Workerdefine void @func_blend10(%T0_10* %loadaddr, %T0_10* %loadaddr2, 17*9880d681SAndroid Build Coastguard Worker %T1_10* %blend, %T0_10* %storeaddr) { 18*9880d681SAndroid Build Coastguard Worker %v0 = load %T0_10, %T0_10* %loadaddr 19*9880d681SAndroid Build Coastguard Worker %v1 = load %T0_10, %T0_10* %loadaddr2 20*9880d681SAndroid Build Coastguard Worker %c = icmp slt %T0_10 %v0, %v1 21*9880d681SAndroid Build Coastguard Worker; CHECK: vmin.s16 22*9880d681SAndroid Build Coastguard Worker; CHECK: vmin.s16 23*9880d681SAndroid Build Coastguard Worker; COST: func_blend10 24*9880d681SAndroid Build Coastguard Worker; COST: cost of 2 {{.*}} select 25*9880d681SAndroid Build Coastguard Worker %r = select %T1_10 %c, %T0_10 %v0, %T0_10 %v1 26*9880d681SAndroid Build Coastguard Worker store %T0_10 %r, %T0_10* %storeaddr 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker%T0_14 = type <8 x i32> 30*9880d681SAndroid Build Coastguard Worker%T1_14 = type <8 x i1> 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func_blend14: 32*9880d681SAndroid Build Coastguard Workerdefine void @func_blend14(%T0_14* %loadaddr, %T0_14* %loadaddr2, 33*9880d681SAndroid Build Coastguard Worker %T1_14* %blend, %T0_14* %storeaddr) { 34*9880d681SAndroid Build Coastguard Worker %v0 = load %T0_14, %T0_14* %loadaddr 35*9880d681SAndroid Build Coastguard Worker %v1 = load %T0_14, %T0_14* %loadaddr2 36*9880d681SAndroid Build Coastguard Worker %c = icmp slt %T0_14 %v0, %v1 37*9880d681SAndroid Build Coastguard Worker; CHECK: vmin.s32 38*9880d681SAndroid Build Coastguard Worker; CHECK: vmin.s32 39*9880d681SAndroid Build Coastguard Worker; COST: func_blend14 40*9880d681SAndroid Build Coastguard Worker; COST: cost of 2 {{.*}} select 41*9880d681SAndroid Build Coastguard Worker %r = select %T1_14 %c, %T0_14 %v0, %T0_14 %v1 42*9880d681SAndroid Build Coastguard Worker store %T0_14 %r, %T0_14* %storeaddr 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker%T0_15 = type <16 x i32> 46*9880d681SAndroid Build Coastguard Worker%T1_15 = type <16 x i1> 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func_blend15: 48*9880d681SAndroid Build Coastguard Workerdefine void @func_blend15(%T0_15* %loadaddr, %T0_15* %loadaddr2, 49*9880d681SAndroid Build Coastguard Worker %T1_15* %blend, %T0_15* %storeaddr) { 50*9880d681SAndroid Build Coastguard Worker; CHECK: vmin.s32 51*9880d681SAndroid Build Coastguard Worker; CHECK: vmin.s32 52*9880d681SAndroid Build Coastguard Worker %v0 = load %T0_15, %T0_15* %loadaddr 53*9880d681SAndroid Build Coastguard Worker %v1 = load %T0_15, %T0_15* %loadaddr2 54*9880d681SAndroid Build Coastguard Worker %c = icmp slt %T0_15 %v0, %v1 55*9880d681SAndroid Build Coastguard Worker; COST: func_blend15 56*9880d681SAndroid Build Coastguard Worker; COST: cost of 4 {{.*}} select 57*9880d681SAndroid Build Coastguard Worker %r = select %T1_15 %c, %T0_15 %v0, %T0_15 %v1 58*9880d681SAndroid Build Coastguard Worker store %T0_15 %r, %T0_15* %storeaddr 59*9880d681SAndroid Build Coastguard Worker ret void 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; We adjusted the cost model of the following selects. When we improve code 63*9880d681SAndroid Build Coastguard Worker; lowering we also need to adjust the cost. 64*9880d681SAndroid Build Coastguard Worker%T0_18 = type <4 x i64> 65*9880d681SAndroid Build Coastguard Worker%T1_18 = type <4 x i1> 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func_blend18: 67*9880d681SAndroid Build Coastguard Workerdefine void @func_blend18(%T0_18* %loadaddr, %T0_18* %loadaddr2, 68*9880d681SAndroid Build Coastguard Worker %T1_18* %blend, %T0_18* %storeaddr) { 69*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 70*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 71*9880d681SAndroid Build Coastguard Worker %v0 = load %T0_18, %T0_18* %loadaddr 72*9880d681SAndroid Build Coastguard Worker %v1 = load %T0_18, %T0_18* %loadaddr2 73*9880d681SAndroid Build Coastguard Worker %c = icmp slt %T0_18 %v0, %v1 74*9880d681SAndroid Build Coastguard Worker; COST: func_blend18 75*9880d681SAndroid Build Coastguard Worker; COST: cost of 19 {{.*}} select 76*9880d681SAndroid Build Coastguard Worker %r = select %T1_18 %c, %T0_18 %v0, %T0_18 %v1 77*9880d681SAndroid Build Coastguard Worker store %T0_18 %r, %T0_18* %storeaddr 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker%T0_19 = type <8 x i64> 81*9880d681SAndroid Build Coastguard Worker%T1_19 = type <8 x i1> 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func_blend19: 83*9880d681SAndroid Build Coastguard Workerdefine void @func_blend19(%T0_19* %loadaddr, %T0_19* %loadaddr2, 84*9880d681SAndroid Build Coastguard Worker %T1_19* %blend, %T0_19* %storeaddr) { 85*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 86*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 87*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 88*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 89*9880d681SAndroid Build Coastguard Worker %v0 = load %T0_19, %T0_19* %loadaddr 90*9880d681SAndroid Build Coastguard Worker %v1 = load %T0_19, %T0_19* %loadaddr2 91*9880d681SAndroid Build Coastguard Worker %c = icmp slt %T0_19 %v0, %v1 92*9880d681SAndroid Build Coastguard Worker; COST: func_blend19 93*9880d681SAndroid Build Coastguard Worker; COST: cost of 50 {{.*}} select 94*9880d681SAndroid Build Coastguard Worker %r = select %T1_19 %c, %T0_19 %v0, %T0_19 %v1 95*9880d681SAndroid Build Coastguard Worker store %T0_19 %r, %T0_19* %storeaddr 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker%T0_20 = type <16 x i64> 99*9880d681SAndroid Build Coastguard Worker%T1_20 = type <16 x i1> 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func_blend20: 101*9880d681SAndroid Build Coastguard Workerdefine void @func_blend20(%T0_20* %loadaddr, %T0_20* %loadaddr2, 102*9880d681SAndroid Build Coastguard Worker %T1_20* %blend, %T0_20* %storeaddr) { 103*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 104*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 105*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 106*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 107*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 108*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 109*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 110*9880d681SAndroid Build Coastguard Worker; CHECK: vbsl 111*9880d681SAndroid Build Coastguard Worker %v0 = load %T0_20, %T0_20* %loadaddr 112*9880d681SAndroid Build Coastguard Worker %v1 = load %T0_20, %T0_20* %loadaddr2 113*9880d681SAndroid Build Coastguard Worker %c = icmp slt %T0_20 %v0, %v1 114*9880d681SAndroid Build Coastguard Worker; COST: func_blend20 115*9880d681SAndroid Build Coastguard Worker; COST: cost of 100 {{.*}} select 116*9880d681SAndroid Build Coastguard Worker %r = select %T1_20 %c, %T0_20 %v0, %T0_20 %v1 117*9880d681SAndroid Build Coastguard Worker store %T0_20 %r, %T0_20* %storeaddr 118*9880d681SAndroid Build Coastguard Worker ret void 119*9880d681SAndroid Build Coastguard Worker} 120