[llvm] [GISel][RISCV] Compute CTPOP of small odd-sized integer correctly (PR #168559)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 18 09:28:26 PST 2025


================
@@ -7678,6 +7678,16 @@ LegalizerHelper::lowerBitCount(MachineInstr &MI) {
     unsigned Size = Ty.getSizeInBits();
     MachineIRBuilder &B = MIRBuilder;
 
+    // Lift odd-size integer to multiple of 8 bit.
----------------
topperc wrote:

I don't think we should do this. I think we should do

```
    if (Size >= 128 || Size % 8 != 0)
      return UnableToLegalize;
```

and in RISCVLegalizerInfo.cpp do

```
diff --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
index b1794b78a3e2..1fba16d3d51c 100644
--- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
+++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
@@ -238,7 +238,10 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
         .clampScalar(0, sXLen, sXLen)
         .scalarSameSizeAs(1, 0);
   } else {
-    CTPOPActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
+    CTPOPActions.widenScalarToNextPow2(0, /*Min*/ 8)
+        .clampScalar(0, s8, sXLen)
+        .scalarSameSizeAs(1, 0)
+        .lower();
   }
 
   getActionDefinitionsBuilder(G_CONSTANT)
```

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


More information about the llvm-commits mailing list