[llvm] [LoopIdiom] Use narrower bit widths where possible in `optimizeCRCLoopUsingClmul` (PR #210139)
Piotr Fusik via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 22 11:50:15 PDT 2026
================
@@ -1628,32 +1625,40 @@ bool LoopIdiomRecognize::optimizeCRCLoop(const PolynomialInfo &Info) {
// The algorithm used in this optimization is a Polynomial (GF(2)) Barrett
// Reduction based on Intel's "Fast CRC Computation for Generic Polynomials
// Using PCLMULQDQ Instruction" white paper (December 2009).
-void LoopIdiomRecognize::optimizeCRCLoopUsingClmul(const PolynomialInfo &Info,
- IntegerType *ClmulTy) {
+void LoopIdiomRecognize::optimizeCRCLoopUsingClmul(const PolynomialInfo &Info) {
Type *CRCTy = Info.LHS->getType();
LLVMContext &Ctx = CRCTy->getContext();
unsigned CRCBW = CRCTy->getIntegerBitWidth();
// The loop's TripCount determines how many bits of the data are processed,
// regardless of whether the actual data bit width matches (if auxiliary data
// is even used at all).
unsigned TC = Info.TripCount;
- unsigned ClmulBW = ClmulTy->getBitWidth();
+ // Based on the clmul inputs, the first clmul needs 2*TC bits, and the second
+ // needs CRCBW+TC bits.
+ IntegerType *ClmulMuTy = IntegerType::get(Ctx, 2 * TC);
+ IntegerType *ClmulGPTy = IntegerType::get(Ctx, CRCBW + TC);
// First, generate the constants required for GF(2) Barrett reduction.
auto [Mu, FullGenPoly] = HashRecognize::genBarrettConstants(Info);
- Value *MuConst = ConstantInt::get(Ctx, Mu.zext(ClmulBW));
- Value *GenPolyConst = ConstantInt::get(Ctx, FullGenPoly.zext(ClmulBW));
+ Value *MuConst = ConstantInt::get(Ctx, Mu.zext(ClmulMuTy->getBitWidth()));
+ Value *GenPolyConst =
+ ConstantInt::get(Ctx, FullGenPoly.zext(ClmulGPTy->getBitWidth()));
IRBuilder<> Builder(CurLoop->getLoopPreheader()->getTerminator());
auto LoTCBits = [TC, &Builder, &Ctx](Value *Op, const Twine &Name) {
unsigned OpBW = Op->getType()->getIntegerBitWidth();
- assert(OpBW >= TC && "Bit width should be at least TripCount");
+ if (OpBW <= TC)
+ return Op;
----------------
pfusik wrote:
Oh. Let's keep the `return`.
https://github.com/llvm/llvm-project/pull/210139
More information about the llvm-commits
mailing list