[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