[llvm] [NVPTX] Lower allocas to the local address space (PR #204346)
Tim Besard via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 17 05:28:40 PDT 2026
================
@@ -51,82 +56,228 @@ char NVPTXLowerAlloca::ID = 1;
INITIALIZE_PASS(NVPTXLowerAlloca, "nvptx-lower-alloca", "Lower Alloca", false,
false)
+static Value *getOrCreateGenericPtr(Value *LocalPtr,
+ DenseMap<Value *, Value *> &GenericPtrs) {
+ auto It = GenericPtrs.find(LocalPtr);
+ if (It != GenericPtrs.end())
+ return It->second;
+
+ auto *LocalInst = cast<Instruction>(LocalPtr);
+ auto *GenericPtr = new AddrSpaceCastInst(
+ LocalPtr, PointerType::get(LocalPtr->getContext(), ADDRESS_SPACE_GENERIC),
+ "");
+ GenericPtr->insertAfter(LocalInst->getIterator());
+ GenericPtrs[LocalPtr] = GenericPtr;
+ return GenericPtr;
+}
+
+static void updateMemIntrinsicDeclaration(MemIntrinsic *MI) {
+ SmallVector<Type *, 3> Tys;
+ if (auto *MTI = dyn_cast<MemTransferInst>(MI)) {
+ Tys.push_back(MTI->getRawDest()->getType());
+ Tys.push_back(MTI->getRawSource()->getType());
+ Tys.push_back(MTI->getLength()->getType());
+ } else {
+ auto *MSI = cast<MemSetInst>(MI);
+ Tys.push_back(MSI->getRawDest()->getType());
+ Tys.push_back(MSI->getLength()->getType());
+ }
+
+ Function *Decl = Intrinsic::getOrInsertDeclaration(MI->getModule(),
+ MI->getIntrinsicID(), Tys);
+ MI->setCalledFunction(Decl);
+}
+
+static void convertPointerUsersToLocal(Value *OldPtr, Value *LocalPtr,
+ DenseMap<Value *, Value *> &GenericPtrs,
+ SmallPtrSetImpl<Value *> &Visited) {
+ if (!Visited.insert(OldPtr).second)
+ return;
+
+ // Debug records aren't on the use-list visited below, so retarget them here;
----------------
maleadt wrote:
Yes, we only need to run NVPTXLowerAlloca now, but that only became legal after having it lower a generic alloca into an AS5 alloca + cast back to AS0. Which indeed can result in byte-by-byte memcpy, which I figured is acceptable on O0.
https://github.com/llvm/llvm-project/pull/204346
More information about the llvm-commits
mailing list