@@ -263,3 +263,35 @@ define i64 @test_inv_and_eqz(i64 %f, i64 %x, i1 %cond) {
263263 %7 = and i64 %6 , %f
264264 ret i64 %7
265265}
266+
267+ define i32 @pr166596 (i32 %conv.i , i1 %iszero ) #0 {
268+ ; RV32ZICOND-LABEL: pr166596:
269+ ; RV32ZICOND: # %bb.0: # %entry
270+ ; RV32ZICOND-NEXT: andi a1, a1, 1
271+ ; RV32ZICOND-NEXT: xori a0, a0, 1
272+ ; RV32ZICOND-NEXT: zext.h a0, a0
273+ ; RV32ZICOND-NEXT: clz a0, a0
274+ ; RV32ZICOND-NEXT: addi a0, a0, 41
275+ ; RV32ZICOND-NEXT: czero.nez a0, a0, a1
276+ ; RV32ZICOND-NEXT: addi a0, a0, -9
277+ ; RV32ZICOND-NEXT: ret
278+ ;
279+ ; RV64ZICOND-LABEL: pr166596:
280+ ; RV64ZICOND: # %bb.0: # %entry
281+ ; RV64ZICOND-NEXT: andi a1, a1, 1
282+ ; RV64ZICOND-NEXT: xori a0, a0, 1
283+ ; RV64ZICOND-NEXT: zext.h a0, a0
284+ ; RV64ZICOND-NEXT: clz a0, a0
285+ ; RV64ZICOND-NEXT: addi a0, a0, 9
286+ ; RV64ZICOND-NEXT: czero.nez a0, a0, a1
287+ ; RV64ZICOND-NEXT: addi a0, a0, -9
288+ ; RV64ZICOND-NEXT: ret
289+ entry:
290+ %not.i = xor i32 %conv.i , 1
291+ %conv2.i = trunc i32 %not.i to i16
292+ %conv22 = zext i16 %conv2.i to i64
293+ %0 = call i64 @llvm.ctlz.i64 (i64 %conv22 , i1 false )
294+ %cast = trunc i64 %0 to i32
295+ %clzg = select i1 %iszero , i32 -9 , i32 %cast
296+ ret i32 %clzg
297+ }
0 commit comments