[llvm] [VPlan] Model address separately. (PR #72164)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 7 06:02:23 PST 2024
================
@@ -397,6 +399,50 @@ Value *VPInstruction::generateInstruction(VPTransformState &State,
Builder.GetInsertBlock()->getTerminator()->eraseFromParent();
return CondBr;
}
+ case VPInstruction::VectorPtr:
+ case VPInstruction::VectorPtrReverse: {
+ // Calculate the pointer for the specific unroll-part.
+ Value *PartPtr = nullptr;
+ bool IsReverse = getOpcode() == VPInstruction::VectorPtrReverse;
+ auto *MemR = cast<VPWidenMemoryInstructionRecipe>(*user_begin());
+ Type *ScalarDataTy =
+ MemR->isStore() ? cast<StoreInst>(&MemR->getIngredient())
+ ->getValueOperand()
+ ->getType()
+ : cast<LoadInst>(&MemR->getIngredient())->getType();
+ // Use i32 for the gep index type when the value is constant,
+ // or query DataLayout for a more suitable index type otherwise.
+ const DataLayout &DL =
+ Builder.GetInsertBlock()->getModule()->getDataLayout();
+ Type *IndexTy = State.VF.isScalable() && (IsReverse || Part > 0)
+ ? DL.getIndexType(ScalarDataTy->getPointerTo())
+ : Builder.getInt32Ty();
+ Value *Ptr = State.get(getOperand(0), VPIteration(0, 0));
+ bool InBounds = false;
+ if (auto *GEP = dyn_cast<GetElementPtrInst>(Ptr->stripPointerCasts()))
+ InBounds = GEP->isInBounds();
----------------
fhahn wrote:
Updated to manage inbounds via VPRecipeWithIRFlags in 18ec3304a9e4aed25d998180728faaf02236205d
https://github.com/llvm/llvm-project/pull/72164
More information about the llvm-commits
mailing list