1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+lzcnt | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; LZCNT and TZCNT will always produce the operand size when the input operand 4*9880d681SAndroid Build Coastguard Worker; is zero. This test is to verify that we efficiently select LZCNT/TZCNT 5*9880d681SAndroid Build Coastguard Worker; based on the fact that the 'icmp+select' sequence is always redundant 6*9880d681SAndroid Build Coastguard Worker; in every function defined below. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine i16 @test1_ctlz(i16 %v) { 10*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true) 11*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %v, 0 12*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 13*9880d681SAndroid Build Coastguard Worker ret i16 %cond 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_ctlz 16*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine i32 @test2_ctlz(i32 %v) { 21*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true) 22*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %v, 0 23*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 24*9880d681SAndroid Build Coastguard Worker ret i32 %cond 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_ctlz 27*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i64 @test3_ctlz(i64 %v) { 32*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true) 33*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %v, 0 34*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 35*9880d681SAndroid Build Coastguard Worker ret i64 %cond 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_ctlz 38*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine i16 @test4_ctlz(i16 %v) { 43*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true) 44*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 0, %v 45*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 46*9880d681SAndroid Build Coastguard Worker ret i16 %cond 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4_ctlz 49*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @test5_ctlz(i32 %v) { 54*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true) 55*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 0, %v 56*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 57*9880d681SAndroid Build Coastguard Worker ret i32 %cond 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5_ctlz 60*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine i64 @test6_ctlz(i64 %v) { 65*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true) 66*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 0, %v 67*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 68*9880d681SAndroid Build Coastguard Worker ret i64 %cond 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6_ctlz 71*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i16 @test10_ctlz(i16* %ptr) { 76*9880d681SAndroid Build Coastguard Worker %v = load i16, i16* %ptr 77*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true) 78*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %v, 0 79*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 80*9880d681SAndroid Build Coastguard Worker ret i16 %cond 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10_ctlz 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movw 84*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine i32 @test11_ctlz(i32* %ptr) { 89*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %ptr 90*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true) 91*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %v, 0 92*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 93*9880d681SAndroid Build Coastguard Worker ret i32 %cond 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11_ctlz 96*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movd 97*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine i64 @test12_ctlz(i64* %ptr) { 102*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* %ptr 103*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true) 104*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %v, 0 105*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 106*9880d681SAndroid Build Coastguard Worker ret i64 %cond 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12_ctlz 109*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movq 110*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine i16 @test13_ctlz(i16* %ptr) { 115*9880d681SAndroid Build Coastguard Worker %v = load i16, i16* %ptr 116*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true) 117*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 0, %v 118*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 119*9880d681SAndroid Build Coastguard Worker ret i16 %cond 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13_ctlz 122*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movw 123*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine i32 @test14_ctlz(i32* %ptr) { 128*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %ptr 129*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true) 130*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 0, %v 131*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 132*9880d681SAndroid Build Coastguard Worker ret i32 %cond 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14_ctlz 135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movd 136*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine i64 @test15_ctlz(i64* %ptr) { 141*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* %ptr 142*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true) 143*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 0, %v 144*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 145*9880d681SAndroid Build Coastguard Worker ret i64 %cond 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15_ctlz 148*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movq 149*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine i16 @test1_cttz(i16 %v) { 154*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true) 155*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %v, 0 156*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 157*9880d681SAndroid Build Coastguard Worker ret i16 %cond 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_cttz 160*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerdefine i32 @test2_cttz(i32 %v) { 165*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 166*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %v, 0 167*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 168*9880d681SAndroid Build Coastguard Worker ret i32 %cond 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_cttz 171*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine i64 @test3_cttz(i64 %v) { 176*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true) 177*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %v, 0 178*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 179*9880d681SAndroid Build Coastguard Worker ret i64 %cond 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_cttz 182*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine i16 @test4_cttz(i16 %v) { 187*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true) 188*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 0, %v 189*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 190*9880d681SAndroid Build Coastguard Worker ret i16 %cond 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4_cttz 193*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine i32 @test5_cttz(i32 %v) { 198*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 199*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 0, %v 200*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 201*9880d681SAndroid Build Coastguard Worker ret i32 %cond 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5_cttz 204*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerdefine i64 @test6_cttz(i64 %v) { 209*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true) 210*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 0, %v 211*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 212*9880d681SAndroid Build Coastguard Worker ret i64 %cond 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6_cttz 215*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdefine i16 @test10_cttz(i16* %ptr) { 220*9880d681SAndroid Build Coastguard Worker %v = load i16, i16* %ptr 221*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true) 222*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %v, 0 223*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 224*9880d681SAndroid Build Coastguard Worker ret i16 %cond 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10_cttz 227*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movw 228*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefine i32 @test11_cttz(i32* %ptr) { 233*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %ptr 234*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 235*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %v, 0 236*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 237*9880d681SAndroid Build Coastguard Worker ret i32 %cond 238*9880d681SAndroid Build Coastguard Worker} 239*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11_cttz 240*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movd 241*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdefine i64 @test12_cttz(i64* %ptr) { 246*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* %ptr 247*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true) 248*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %v, 0 249*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 250*9880d681SAndroid Build Coastguard Worker ret i64 %cond 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12_cttz 253*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movq 254*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerdefine i16 @test13_cttz(i16* %ptr) { 259*9880d681SAndroid Build Coastguard Worker %v = load i16, i16* %ptr 260*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true) 261*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 0, %v 262*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %cnt 263*9880d681SAndroid Build Coastguard Worker ret i16 %cond 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13_cttz 266*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movw 267*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerdefine i32 @test14_cttz(i32* %ptr) { 272*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %ptr 273*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 274*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 0, %v 275*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %cnt 276*9880d681SAndroid Build Coastguard Worker ret i32 %cond 277*9880d681SAndroid Build Coastguard Worker} 278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14_cttz 279*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movd 280*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Workerdefine i64 @test15_cttz(i64* %ptr) { 285*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* %ptr 286*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true) 287*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 0, %v 288*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %cnt 289*9880d681SAndroid Build Coastguard Worker ret i64 %cond 290*9880d681SAndroid Build Coastguard Worker} 291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15_cttz 292*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movq 293*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Workerdefine i16 @test4b_ctlz(i16 %v) { 298*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true) 299*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %v, 0 300*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %cnt, i16 16 301*9880d681SAndroid Build Coastguard Worker ret i16 %cond 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4b_ctlz 304*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b_ctlz(i32 %v) { 309*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true) 310*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %v, 0 311*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %cnt, i32 32 312*9880d681SAndroid Build Coastguard Worker ret i32 %cond 313*9880d681SAndroid Build Coastguard Worker} 314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5b_ctlz 315*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Workerdefine i64 @test6b_ctlz(i64 %v) { 320*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true) 321*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %v, 0 322*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %cnt, i64 64 323*9880d681SAndroid Build Coastguard Worker ret i64 %cond 324*9880d681SAndroid Build Coastguard Worker} 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6b_ctlz 326*9880d681SAndroid Build Coastguard Worker; CHECK: lzcnt 327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerdefine i16 @test4b_cttz(i16 %v) { 331*9880d681SAndroid Build Coastguard Worker %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true) 332*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %v, 0 333*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %cnt, i16 16 334*9880d681SAndroid Build Coastguard Worker ret i16 %cond 335*9880d681SAndroid Build Coastguard Worker} 336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4b_cttz 337*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b_cttz(i32 %v) { 342*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 343*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %v, 0 344*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %cnt, i32 32 345*9880d681SAndroid Build Coastguard Worker ret i32 %cond 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5b_cttz 348*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Workerdefine i64 @test6b_cttz(i64 %v) { 353*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true) 354*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %v, 0 355*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %cnt, i64 64 356*9880d681SAndroid Build Coastguard Worker ret i64 %cond 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6b_cttz 359*9880d681SAndroid Build Coastguard Worker; CHECK: tzcnt 360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1) 364*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 365*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.cttz.i16(i16, i1) 366*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64(i64, i1) 367*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctlz.i32(i32, i1) 368*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.ctlz.i16(i16, i1) 369*9880d681SAndroid Build Coastguard Worker 370