[flang-commits] [flang] [llvm] [compiler-rt] [libcxx] [libclc] [libcxxabi] [lldb] [clang-tools-extra] [libc] [lld] [clang] [VPlan] Add new VPScalarCastRecipe, use for IV & step trunc. (PR #78113)
Florian Hahn via flang-commits
flang-commits at lists.llvm.org
Thu Jan 25 09:57:43 PST 2024
================
@@ -491,19 +491,41 @@ void VPlanTransforms::removeDeadRecipes(VPlan &Plan) {
static VPValue *createScalarIVSteps(VPlan &Plan, const InductionDescriptor &ID,
ScalarEvolution &SE, Instruction *TruncI,
- Type *IVTy, VPValue *StartV,
- VPValue *Step) {
+ VPValue *StartV, VPValue *Step) {
VPBasicBlock *HeaderVPBB = Plan.getVectorLoopRegion()->getEntryBasicBlock();
auto IP = HeaderVPBB->getFirstNonPhi();
VPCanonicalIVPHIRecipe *CanonicalIV = Plan.getCanonicalIV();
- Type *TruncTy = TruncI ? TruncI->getType() : IVTy;
VPValue *BaseIV = CanonicalIV;
- if (!CanonicalIV->isCanonical(ID.getKind(), StartV, Step, TruncTy)) {
- BaseIV = new VPDerivedIVRecipe(ID, StartV, CanonicalIV, Step,
- TruncI ? TruncI->getType() : nullptr);
+ VPTypeAnalysis TypeInfo(SE.getContext());
+ Type *StepTy = TypeInfo.inferScalarType(Step);
+ if (!CanonicalIV->isCanonical(ID.getKind(), StartV, Step)) {
+ BaseIV = new VPDerivedIVRecipe(ID, StartV, CanonicalIV, Step);
HeaderVPBB->insert(BaseIV->getDefiningRecipe(), IP);
}
+ // Truncate base induction if needed.
+ if (TruncI) {
+ Type *TruncTy = TruncI->getType();
+ assert(TypeInfo.inferScalarType(BaseIV)->getScalarSizeInBits() >
+ TruncTy->getScalarSizeInBits() &&
+ StepTy->isIntegerTy() && "Truncation requires an integer step");
+ auto *T = new VPScalarCastRecipe(Instruction::Trunc, BaseIV, TruncTy);
+ HeaderVPBB->insert(T, IP);
+ BaseIV = T;
+ }
+
+ // Truncate step if needed.
+ Type *BaseIVTy = TypeInfo.inferScalarType(BaseIV);
+ if (BaseIVTy != StepTy) {
+ assert(StepTy->getScalarSizeInBits() > BaseIVTy->getScalarSizeInBits() &&
+ "Not truncating.");
----------------
fhahn wrote:
Renamed thanks!
https://github.com/llvm/llvm-project/pull/78113
More information about the flang-commits
mailing list