[llvm] [NVPTX] Check Before inserting AddrSpaceCastInst in NVPTXLoweringAlloca (PR #106127)
weiwei chen via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 4 09:01:31 PDT 2024
================
@@ -72,12 +72,26 @@ bool NVPTXLowerAlloca::runOnFunction(Function &F) {
Changed = true;
auto ETy = allocaInst->getAllocatedType();
auto LocalAddrTy = PointerType::get(ETy, ADDRESS_SPACE_LOCAL);
- auto NewASCToLocal = new AddrSpaceCastInst(allocaInst, LocalAddrTy, "");
- auto GenericAddrTy = PointerType::get(ETy, ADDRESS_SPACE_GENERIC);
- auto NewASCToGeneric =
- new AddrSpaceCastInst(NewASCToLocal, GenericAddrTy, "");
- NewASCToLocal->insertAfter(allocaInst);
- NewASCToGeneric->insertAfter(NewASCToLocal);
+ PointerType *AllocInstPtrTy =
+ cast<PointerType>(allocaInst->getType()->getScalarType());
+ Instruction *NewASCToGeneric = allocaInst;
+ unsigned AllocAddrSpace = AllocInstPtrTy->getAddressSpace();
+ assert((AllocAddrSpace == ADDRESS_SPACE_GENERIC ||
+ AllocAddrSpace == ADDRESS_SPACE_LOCAL) &&
+ "AllocaInst can only be in Generic or Local address space for "
+ "NVPTX.");
+ if (AllocAddrSpace != ADDRESS_SPACE_LOCAL) {
+ // Only insert a new AddrSpaceCastInst if
+ // allocaInst is not already in ADDRESS_SPACE_LOCAL.
+ auto NewASCToLocal =
+ new AddrSpaceCastInst(allocaInst, LocalAddrTy, "");
+ auto GenericAddrTy = PointerType::get(ETy, ADDRESS_SPACE_GENERIC);
----------------
weiweichen wrote:
Oh, actually, I found out that `-infer-address-spaces` won't work properly if the extra ASCast to LOCAL is not inserted if `alloca` is already in Generic . So even `alloca` is already in generic, we still need to insert two ASCast to make go to `local` and back to `generic` to make `-infer-address-spaces` work properly (i.e. pass the test) 🤯 🤯 🤯 .
https://github.com/llvm/llvm-project/pull/106127
More information about the llvm-commits
mailing list