From 0265ec0e3971b01abaf92453132796968e140644 Mon Sep 17 00:00:00 2001 From: Tirthankar Mazumder Date: Sat, 17 Jan 2026 23:38:24 +0530 Subject: [PATCH] Only fold `trunc X` to `(X & Mask)` for simple masks. --- llvm/lib/Analysis/CmpInstAnalysis.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Analysis/CmpInstAnalysis.cpp b/llvm/lib/Analysis/CmpInstAnalysis.cpp index 880006c0fcfac..5e434f3e711fe 100644 --- a/llvm/lib/Analysis/CmpInstAnalysis.cpp +++ b/llvm/lib/Analysis/CmpInstAnalysis.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/CmpInstAnalysis.h" +#include "llvm/ADT/APInt.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/PatternMatch.h" @@ -164,9 +165,16 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, // Try to convert (trunc X) eq/ne C into (X & Mask) eq/ne C if (LookThroughTrunc && isa(LHS)) { - Result.Pred = Pred; - Result.Mask = APInt::getAllOnes(C.getBitWidth()); - Result.C = C; + auto *TI = dyn_cast(LHS); + unsigned SrcBW = TI->getSrcTy()->getScalarSizeInBits(), + DstBW = TI->getDestTy()->getScalarSizeInBits(); + APInt DesiredMask = APInt::getLowBitsSet(SrcBW, DstBW); + APInt Mask = APInt::getAllOnes(C.getBitWidth()).zext(SrcBW); + if (Mask == DesiredMask) { + Result.Pred = Pred; + Result.Mask = Mask; + Result.C = C; + } break; }