1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-neon-syntax=apple < %s -mcpu=cyclone | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; ModuleID = 'arm64_vecCmpBr.c' 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128" 4*9880d681SAndroid Build Coastguard Workertarget triple = "arm64-apple-ios3.0.0" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @anyZero64(<4 x i16> %a) #0 { 8*9880d681SAndroid Build Coastguard Worker; CHECK: _anyZero64: 9*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REGNO1:[0-9]+]], v0 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 12*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i16> %a to <8 x i8> 16*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %0) #3 17*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vminv.i to i8 18*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 19*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %return 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 22*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 23*9880d681SAndroid Build Coastguard Worker br label %return 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 26*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 27*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(...) #1 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine i32 @anyZero128(<8 x i16> %a) #0 { 33*9880d681SAndroid Build Coastguard Worker; CHECK: _anyZero128: 34*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REGNO1:[0-9]+]], v0 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 37*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i16> %a to <16 x i8> 42*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %0) #3 43*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vminv.i to i8 44*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 45*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %return 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 48*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 49*9880d681SAndroid Build Coastguard Worker br label %return 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 52*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 53*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i32 @anyNonZero64(<4 x i16> %a) #0 { 57*9880d681SAndroid Build Coastguard Worker; CHECK: _anyNonZero64: 58*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.8b b[[REGNO1:[0-9]+]], v0 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 61*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i16> %a to <8 x i8> 66*9880d681SAndroid Build Coastguard Worker %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> %0) #3 67*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vmaxv.i to i8 68*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 69*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 72*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 73*9880d681SAndroid Build Coastguard Worker br label %return 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 76*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 77*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine i32 @anyNonZero128(<8 x i16> %a) #0 { 81*9880d681SAndroid Build Coastguard Worker; CHECK: _anyNonZero128: 82*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.16b b[[REGNO1:[0-9]+]], v0 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 85*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0 87*9880d681SAndroid Build Coastguard Workerentry: 88*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i16> %a to <16 x i8> 89*9880d681SAndroid Build Coastguard Worker %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> %0) #3 90*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vmaxv.i to i8 91*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 92*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 95*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 96*9880d681SAndroid Build Coastguard Worker br label %return 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 99*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 100*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine i32 @allZero64(<4 x i16> %a) #0 { 104*9880d681SAndroid Build Coastguard Worker; CHECK: _allZero64: 105*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.8b b[[REGNO1:[0-9]+]], v0 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 108*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar 110*9880d681SAndroid Build Coastguard Workerentry: 111*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i16> %a to <8 x i8> 112*9880d681SAndroid Build Coastguard Worker %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> %0) #3 113*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vmaxv.i to i8 114*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 115*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %return 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 118*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 119*9880d681SAndroid Build Coastguard Worker br label %return 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 122*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 123*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i32 @allZero128(<8 x i16> %a) #0 { 127*9880d681SAndroid Build Coastguard Worker; CHECK: _allZero128: 128*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.16b b[[REGNO1:[0-9]+]], v0 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 131*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar 133*9880d681SAndroid Build Coastguard Workerentry: 134*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i16> %a to <16 x i8> 135*9880d681SAndroid Build Coastguard Worker %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> %0) #3 136*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vmaxv.i to i8 137*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 138*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %return 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 141*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 142*9880d681SAndroid Build Coastguard Worker br label %return 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 145*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 146*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine i32 @allNonZero64(<4 x i16> %a) #0 { 150*9880d681SAndroid Build Coastguard Worker; CHECK: _allNonZero64: 151*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REGNO1:[0-9]+]], v0 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 154*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i16> %a to <8 x i8> 158*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %0) #3 159*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vminv.i to i8 160*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 161*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 164*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 165*9880d681SAndroid Build Coastguard Worker br label %return 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 168*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 169*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine i32 @allNonZero128(<8 x i16> %a) #0 { 173*9880d681SAndroid Build Coastguard Worker; CHECK: _allNonZero128: 174*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REGNO1:[0-9]+]], v0 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]] 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]] 177*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]: 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0 179*9880d681SAndroid Build Coastguard Workerentry: 180*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i16> %a to <16 x i8> 181*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %0) #3 182*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %vminv.i to i8 183*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %1, 0 184*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 187*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4 188*9880d681SAndroid Build Coastguard Worker br label %return 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry, %if.then 191*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 192*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8>) #2 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8>) #2 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8>) #2 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8>) #2 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind ssp "target-cpu"="cyclone" } 204*9880d681SAndroid Build Coastguard Workerattributes #1 = { "target-cpu"="cyclone" } 205*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind readnone } 206*9880d681SAndroid Build Coastguard Workerattributes #3 = { nounwind } 207*9880d681SAndroid Build Coastguard Workerattributes #4 = { nobuiltin nounwind } 208