llvm-project
3aed0816 - [AggressiveInstCombine] Fold split-width i32 cttz/ctlz patterns into wide i64 intrinsics (#192296)

Commit
3 days ago
[AggressiveInstCombine] Fold split-width i32 cttz/ctlz patterns into wide i64 intrinsics (#192296) This patch teaches `AggressiveInstCombine ` to recognize and fold common split-width i32 cttz/ctlz intrinsic calls into a single full-width i64 cttz/ctlz intrinsic. For ex: ``` define i32 @src(i64 %val) { %lo = trunc i64 %val to i32 %cmp = icmp eq i32 %lo, 0 %shr = lshr i64 %val, 32 %hi = trunc i64 %shr to i32 %cttz_hi = call i32 @llvm.cttz.i32(i32 %hi, i1 true) %hi_plus32 = or i32 %cttz_hi, 32 %cttz_lo = call i32 @llvm.cttz.i32(i32 %lo, i1 true) %result = select i1 %cmp, i32 %hi_plus32, i32 %cttz_lo ret i32 %result } define i32 @tgt(i64 %val) { %cttz64 = call i64 @llvm.cttz.i64(i64 %val, i1 false) %result = trunc i64 %cttz64 to i32 ret i32 %result } ``` and similarly for ctlz intrinsic. Alive proof for the 2 folds added by this patch. cttz: https://alive2.llvm.org/ce/z/-s14-s ctlz: https://alive2.llvm.org/ce/z/WfQepH
Author
Parents
Loading