================ @@ -683,6 +698,65 @@ struct AAAMDAttributesFunction : public AAAMDAttributes { return !A.checkForAllCallLikeInstructions(DoesNotRetrieve, *this, UsedAssumedInformation); } + + // Returns true if FlatScratchInit is needed, i.e., no-flat-scratch-init is + // not to be set. + bool needFlatScratchInit(Attributor &A) { + assert(isAssumed(FLAT_SCRATCH_INIT)); // only called if the bit is still set + + // Check all AddrSpaceCast instructions. FlatScratchInit is needed if + // there is a cast from PRIVATE_ADDRESS. + auto AddrSpaceCastNotFromPrivate = [](Instruction &I) { + return cast<AddrSpaceCastInst>(I).getSrcAddressSpace() != + AMDGPUAS::PRIVATE_ADDRESS; + }; + + bool UsedAssumedInformation = false; + if (!A.checkForAllInstructions(AddrSpaceCastNotFromPrivate, *this, + {Instruction::AddrSpaceCast}, + UsedAssumedInformation)) + return true; + + // Check for addrSpaceCast from PRIVATE_ADDRESS in constant expressions + auto &InfoCache = static_cast<AMDGPUInformationCache &>(A.getInfoCache()); + + Function *F = getAssociatedFunction(); + for (Instruction &I : instructions(F)) { + for (const Use &U : I.operands()) { + if (const auto *C = dyn_cast<Constant>(U)) { + if (InfoCache.checkConstForAddrSpaceCastFromPrivate(C)) + return true; + } + } + } + + // Finally check callees. + + // This is called on each callee; false means callee shouldn't have + // no-flat-scratch-init. + auto CheckForNoFlatScratchInit = [&](Instruction &I) { + const auto &CB = cast<CallBase>(I); + const Function *Callee = CB.getCalledFunction(); + + // Callee == 0 for inline asm or indirect call with known callees. + // In the latter case, updateImpl() already checked the callees and we + // know their FLAT_SCRATCH_INIT bit is set. + // If function has indirect call with unknown callees, the bit is + // already removed in updateImpl() and execution won't reach here. + if (!Callee) + return true; + + return Callee->getIntrinsicID() != ---------------- shiltian wrote:
IIUC, this attribute should propagate from callee to caller, so you will need to check all function calls, and ask Attributor whether the callee needs it or not. https://github.com/llvm/llvm-project/pull/94647 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits