[llvm] [AggressiveInstCombine] POPCNT generation for bit-count pattern (PR #177109)

Rohit Aggarwal via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 07:11:11 PDT 2026


================
@@ -239,3 +239,964 @@ define i32 @popcount64_mask(i64 %x) {
   %13 = trunc nuw nsw i64 %12 to i32
   ret i32 %13
 }
+
+define i32 @popcnt1_32(i32 noundef %uWord) {
+; CHECK-LABEL: define i32 @popcnt1_32(
+; CHECK-SAME: i32 noundef [[UWORD:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[UWORD]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %and = and i32 %uWord, 1431655765
+  %shr = lshr i32 %uWord, 1
+  %and1 = and i32 %shr, 1431655765
+  %add = add i32 %and1, %and
+  %and2 = and i32 %add, 858993459
+  %shr3 = lshr i32 %add, 2
+  %and4 = and i32 %shr3, 858993459
+  %add5 = add i32 %and4, %and2
+  %and6 = and i32 %add5, 252645135
+  %shr7 = lshr i32 %add5, 4
+  %and8 = and i32 %shr7, 252645135
+  %add9 = add i32 %and8, %and6
+  %and10 = and i32 %add9, 16711935
+  %shr11 = lshr i32 %add9, 8
+  %and12 = and i32 %shr11, 16711935
+  %add13 = add i32 %and12, %and10
+  %and14 = and i32 %add13, 65535
+  %shr15 = lshr i32 %add13, 16
+  %add16 = add i32 %and14, %shr15
+  ret i32 %add16
+}
+
+define i32 @popcnt1_32_variant2(i32 noundef %uWord) {
+; CHECK-LABEL: define i32 @popcnt1_32_variant2(
+; CHECK-SAME: i32 noundef [[UWORD:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[UWORD]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %and = and i32 %uWord, 1431655765
+  %shr = lshr i32 %uWord, 1
+  %and1 = and i32 %shr, 1431655765
+  %add = add i32 %and1, %and
+  %and2 = and i32 %add, 858993459
+  %shr3 = lshr i32 %add, 2
+  %and4 = and i32 %shr3, 858993459
+  %add5 = add i32 %and4, %and2
+  %and6 = and i32 %add5, 252645135
+  %shr7 = lshr i32 %add5, 4
+  %and8 = and i32 %shr7, 252645135
+  %add9 = add i32 %and8, %and6
+  %and10 = and i32 %add9, 16711935
+  %shr11 = lshr i32 %add9, 8
+  %and12 = and i32 %shr11, 16711935
+  %add13 = add i32 %and12, %and10
+  %and14 = and i32 %add13, 65535
+  %shr15 = lshr i32 %add13, 16
+  %and16 = and i32 %shr15, 65535
+  %add17 = add i32 %and14, %and16
+  ret i32 %add17
+}
+
+define  i64 @popcnt1_64(i64 noundef %uWord) {
+; CHECK-LABEL: define  i64 @popcnt1_64(
+; CHECK-SAME: i64 noundef [[UWORD:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.ctpop.i64(i64 [[UWORD]])
+; CHECK-NEXT:    ret i64 [[TMP0]]
+;
+entry:
+  %and = and i64 %uWord, u0x5555555555555555 ; 0x5555555555555555
----------------
rohitaggarwal007 wrote:

Done

https://github.com/llvm/llvm-project/pull/177109


More information about the llvm-commits mailing list