1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; This test is to verify that the instruction combiner is able to fold 4*9880d681SAndroid Build Coastguard Worker; a cttz/ctlz followed by a icmp + select into a single cttz/ctlz with 5*9880d681SAndroid Build Coastguard Worker; the 'is_zero_undef' flag cleared. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i16 @test1(i16 %x) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 9*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %x, i1 false) 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR]] 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true) 13*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 0 14*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %0, i16 16 15*9880d681SAndroid Build Coastguard Worker ret i16 %cond 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %x) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 20*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR]] 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) 24*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 25*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %0, i32 32 26*9880d681SAndroid Build Coastguard Worker ret i32 %cond 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %x) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 31*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %x, i1 false) 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR]] 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) 35*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %x, 0 36*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %0, i64 64 37*9880d681SAndroid Build Coastguard Worker ret i64 %cond 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i16 @test4(i16 %x) { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 42*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %x, i1 false) 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR]] 44*9880d681SAndroid Build Coastguard Workerentry: 45*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true) 46*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %x, 0 47*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %0 48*9880d681SAndroid Build Coastguard Worker ret i16 %cond 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %x) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 53*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR]] 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) 57*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %x, 0 58*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %0 59*9880d681SAndroid Build Coastguard Worker ret i32 %cond 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine i64 @test6(i64 %x) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 64*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %x, i1 false) 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR]] 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) 68*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %x, 0 69*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %0 70*9880d681SAndroid Build Coastguard Worker ret i64 %cond 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine i16 @test1b(i16 %x) { 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1b( 75*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %x, i1 false) 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR]] 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.cttz.i16(i16 %x, i1 true) 79*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 0 80*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %0, i16 16 81*9880d681SAndroid Build Coastguard Worker ret i16 %cond 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine i32 @test2b(i32 %x) { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2b( 86*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR]] 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) 90*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 91*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %0, i32 32 92*9880d681SAndroid Build Coastguard Worker ret i32 %cond 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine i64 @test3b(i64 %x) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3b( 97*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %x, i1 false) 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR]] 99*9880d681SAndroid Build Coastguard Workerentry: 100*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) 101*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %x, 0 102*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %0, i64 64 103*9880d681SAndroid Build Coastguard Worker ret i64 %cond 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine i16 @test4b(i16 %x) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4b( 108*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %x, i1 false) 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR]] 110*9880d681SAndroid Build Coastguard Workerentry: 111*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.cttz.i16(i16 %x, i1 true) 112*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %x, 0 113*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 16, i16 %0 114*9880d681SAndroid Build Coastguard Worker ret i16 %cond 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b(i32 %x) { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5b( 119*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR]] 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) 123*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %x, 0 124*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 32, i32 %0 125*9880d681SAndroid Build Coastguard Worker ret i32 %cond 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine i64 @test6b(i64 %x) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6b( 130*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR:%[a-zA-Z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %x, i1 false) 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR]] 132*9880d681SAndroid Build Coastguard Workerentry: 133*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) 134*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %x, 0 135*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 64, i64 %0 136*9880d681SAndroid Build Coastguard Worker ret i64 %cond 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine i32 @test1c(i16 %x) { 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1c( 141*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %x, i1 false) 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i16 [[VAR1]] to i32 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR2]] 144*9880d681SAndroid Build Coastguard Workerentry: 145*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.cttz.i16(i16 %x, i1 true) 146*9880d681SAndroid Build Coastguard Worker %cast2 = zext i16 %0 to i32 147*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 0 148*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %cast2, i32 16 149*9880d681SAndroid Build Coastguard Worker ret i32 %cond 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine i64 @test2c(i16 %x) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2c( 154*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %x, i1 false) 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i16 [[VAR1]] to i64 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR2]] 157*9880d681SAndroid Build Coastguard Workerentry: 158*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.cttz.i16(i16 %x, i1 true) 159*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %0 to i64 160*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 0 161*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %conv, i64 16 162*9880d681SAndroid Build Coastguard Worker ret i64 %cond 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine i64 @test3c(i32 %x) { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3c( 167*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i32 [[VAR1]] to i64 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR2]] 170*9880d681SAndroid Build Coastguard Workerentry: 171*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) 172*9880d681SAndroid Build Coastguard Worker %conv = zext i32 %0 to i64 173*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 174*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %conv, i64 32 175*9880d681SAndroid Build Coastguard Worker ret i64 %cond 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine i32 @test4c(i16 %x) { 179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4c( 180*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %x, i1 false) 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i16 [[VAR1]] to i32 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR2]] 183*9880d681SAndroid Build Coastguard Workerentry: 184*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true) 185*9880d681SAndroid Build Coastguard Worker %cast = zext i16 %0 to i32 186*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 0 187*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %cast, i32 16 188*9880d681SAndroid Build Coastguard Worker ret i32 %cond 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdefine i64 @test5c(i16 %x) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5c( 193*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %x, i1 false) 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i16 [[VAR1]] to i64 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR2]] 196*9880d681SAndroid Build Coastguard Workerentry: 197*9880d681SAndroid Build Coastguard Worker %0 = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true) 198*9880d681SAndroid Build Coastguard Worker %cast = zext i16 %0 to i64 199*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 0 200*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %cast, i64 16 201*9880d681SAndroid Build Coastguard Worker ret i64 %cond 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerdefine i64 @test6c(i32 %x) { 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6c( 206*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i32 [[VAR1]] to i64 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR2]] 209*9880d681SAndroid Build Coastguard Workerentry: 210*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) 211*9880d681SAndroid Build Coastguard Worker %cast = zext i32 %0 to i64 212*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 213*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %cast, i64 32 214*9880d681SAndroid Build Coastguard Worker ret i64 %cond 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerdefine i16 @test1d(i64 %x) { 218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1d( 219*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %x, i1 false) 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i64 [[VAR1]] to i16 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR2]] 222*9880d681SAndroid Build Coastguard Workerentry: 223*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) 224*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %0 to i16 225*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %x, 0 226*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %conv, i16 64 227*9880d681SAndroid Build Coastguard Worker ret i16 %cond 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workerdefine i32 @test2d(i64 %x) { 231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2d( 232*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %x, i1 false) 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i64 [[VAR1]] to i32 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR2]] 235*9880d681SAndroid Build Coastguard Workerentry: 236*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) 237*9880d681SAndroid Build Coastguard Worker %cast = trunc i64 %0 to i32 238*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %x, 0 239*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %cast, i32 64 240*9880d681SAndroid Build Coastguard Worker ret i32 %cond 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine i16 @test3d(i32 %x) { 244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3d( 245*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i32 [[VAR1]] to i16 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR2]] 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) 250*9880d681SAndroid Build Coastguard Worker %cast = trunc i32 %0 to i16 251*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 252*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %cast, i16 32 253*9880d681SAndroid Build Coastguard Worker ret i16 %cond 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Workerdefine i16 @test4d(i64 %x) { 257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4d( 258*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %x, i1 false) 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i64 [[VAR1]] to i16 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR2]] 261*9880d681SAndroid Build Coastguard Workerentry: 262*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) 263*9880d681SAndroid Build Coastguard Worker %cast = trunc i64 %0 to i16 264*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %x, 0 265*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %cast, i16 64 266*9880d681SAndroid Build Coastguard Worker ret i16 %cond 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdefine i32 @test5d(i64 %x) { 270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5d( 271*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %x, i1 false) 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i64 [[VAR1]] to i32 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAR2]] 274*9880d681SAndroid Build Coastguard Workerentry: 275*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) 276*9880d681SAndroid Build Coastguard Worker %cast = trunc i64 %0 to i32 277*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %x, 0 278*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %cast, i32 64 279*9880d681SAndroid Build Coastguard Worker ret i32 %cond 280*9880d681SAndroid Build Coastguard Worker} 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Workerdefine i16 @test6d(i32 %x) { 283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6d( 284*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i32 [[VAR1]] to i16 286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR2]] 287*9880d681SAndroid Build Coastguard Workerentry: 288*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) 289*9880d681SAndroid Build Coastguard Worker %cast = trunc i32 %0 to i16 290*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 291*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %cast, i16 32 292*9880d681SAndroid Build Coastguard Worker ret i16 %cond 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerdefine i64 @select_bug1(i32 %x) { 296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_bug1( 297*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = zext i32 [[VAR1]] to i64 299*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[VAR2]] 300*9880d681SAndroid Build Coastguard Workerentry: 301*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 302*9880d681SAndroid Build Coastguard Worker %conv = zext i32 %0 to i64 303*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 304*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %conv, i64 32 305*9880d681SAndroid Build Coastguard Worker ret i64 %cond 306*9880d681SAndroid Build Coastguard Worker} 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Workerdefine i16 @select_bug2(i32 %x) { 309*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_bug2( 310*9880d681SAndroid Build Coastguard Worker; CHECK: [[VAR1:%[a-zA-Z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAR2:%[a-zA-Z0-9]+]] = trunc i32 [[VAR1]] to i16 312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[VAR2]] 313*9880d681SAndroid Build Coastguard Workerentry: 314*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 315*9880d681SAndroid Build Coastguard Worker %conv = trunc i32 %0 to i16 316*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, 0 317*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i16 %conv, i16 32 318*9880d681SAndroid Build Coastguard Worker ret i16 %cond 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.ctlz.i16(i16, i1) 323*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctlz.i32(i32, i1) 324*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64(i64, i1) 325*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.cttz.i16(i16, i1) 326*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 327*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1) 328