[llvm] AMDGPU/PromoteAlloca: Refactor into analysis / commit phases (PR #170512)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 9 20:03:24 PST 2025
Nicolai =?utf-8?q?Hähnle?= <nicolai.haehnle at amd.com>,
Nicolai =?utf-8?q?Hähnle?= <nicolai.haehnle at amd.com>,
Nicolai =?utf-8?q?Hähnle?= <nicolai.haehnle at amd.com>,
Nicolai =?utf-8?q?Hähnle?= <nicolai.haehnle at amd.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/170512 at github.com>
================
@@ -388,23 +463,49 @@ static bool isSupportedMemset(MemSetInst *I, AllocaInst *AI,
match(I->getOperand(2), m_SpecificInt(Size)) && !I->isVolatile();
}
-static Value *calculateVectorIndex(
- Value *Ptr, const std::map<GetElementPtrInst *, WeakTrackingVH> &GEPIdx) {
- auto *GEP = dyn_cast<GetElementPtrInst>(Ptr->stripPointerCasts());
- if (!GEP)
- return ConstantInt::getNullValue(Type::getInt32Ty(Ptr->getContext()));
+static Value *calculateVectorIndex(Value *Ptr, AllocaAnalysis &AA) {
+ IRBuilder<> B(Ptr->getContext());
+
+ Ptr = Ptr->stripPointerCasts();
+ if (Ptr == AA.Alloca)
+ return B.getInt32(0);
+
+ auto *GEP = cast<GetElementPtrInst>(Ptr);
+ auto I = AA.Vector.GEPVectorIdx.find(GEP);
+ assert(I != AA.Vector.GEPVectorIdx.end() && "Must have entry for GEP!");
+
+ if (!I->second.Full) {
+ Value *Result = nullptr;
+ B.SetInsertPoint(GEP);
- auto I = GEPIdx.find(GEP);
- assert(I != GEPIdx.end() && "Must have entry for GEP!");
+ if (I->second.VarIndex) {
+ Result = I->second.VarIndex;
+ Result = B.CreateSExtOrTrunc(Result, B.getInt32Ty());
- Value *IndexValue = I->second;
- assert(IndexValue && "index value missing from GEP index map");
- return IndexValue;
+ if (I->second.VarMul)
+ Result = B.CreateMul(Result, I->second.VarMul);
+ }
+
+ if (I->second.ConstIndex) {
+ if (Result) {
+ Result = B.CreateAdd(Result, I->second.ConstIndex);
+ } else {
+ Result = I->second.ConstIndex;
+ }
+ }
+
+ if (!Result)
+ Result = B.getInt32(0);
----------------
ruiling wrote:
I am not sure whether we can just assert here the `Result` is not null to catch unexpected error in the future. The assumption would be the pointer should either point to the alloca or the index should be passed explicitly.
https://github.com/llvm/llvm-project/pull/170512
More information about the llvm-commits
mailing list