[llvm] [AMDGPU][Attributor] Infer `inreg` attribute in `AMDGPUAttributor` (PR #101609)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 26 00:22:44 PDT 2025
================
@@ -1363,6 +1494,64 @@ static bool updateWavesPerEU(Module &M, TargetMachine &TM) {
return Changed;
}
+/// Emit the readfirstlane intrinsic for all inreg uniform function arguments at
+/// each call site. The inreg uniform attribute combination is set by
+/// AAAMDGPUUniform. This function provides a workaround for a downstream issue
+/// where failing to emit a waterfall loop for 'inreg' arguments may result in
+/// an invalid VGPR-to-SGPR copy. However, we intentionally avoid a waterfall
+/// loop for inreg uniform arguments here, because the 'inreg' attribute set by
+/// AAAMDGPUUniform guarantees uniformity, making the readfirstlane intrinsic
+/// appropriate.
+static bool emitReadFirstLaneForInregUniformArgs(Module &M) {
+ bool Changed = false;
+ std::vector<std::pair<CallBase *, unsigned>> WorkList;
+
+ for (Function &F : M) {
+ if (F.isDeclaration())
+ continue;
+ for (Argument &Arg : F.args()) {
+ if (!Arg.hasAttribute(Attribute::InReg) || !Arg.hasAttribute("uniform"))
+ continue;
+ unsigned ArgNo = Arg.getArgNo();
+ for (Use &U : F.uses()) {
+ auto *CB = dyn_cast<CallBase>(U.getUser());
+ if (!CB)
+ continue;
+ Value *CSArg = CB->getArgOperand(ArgNo);
+ // We don't need readfirstvalue for a global value.
+ if (isa<GlobalValue>(CSArg))
+ continue;
----------------
arsenm wrote:
Any constant, or really any isTriviallyUniform
https://github.com/llvm/llvm-project/pull/101609
More information about the llvm-commits
mailing list