[clang] [HLSL] Appropriately set function attribute optnone (PR #125937)

S. Bharadwaj Yadavalli via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 10 08:02:14 PST 2025


================
@@ -345,6 +345,9 @@ void clang::CodeGen::CGHLSLRuntime::setHLSLEntryAttributes(
                 WaveSizeAttr->getPreferred());
     Fn->addFnAttr(WaveSizeKindStr, WaveSizeStr);
   }
+  if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
+    Fn->addFnAttr(llvm::Attribute::OptimizeNone);
+  }
   Fn->addFnAttr(llvm::Attribute::NoInline);
----------------
bharadwajy wrote:

> Given that these already have "noinline", I'm surprised that the logic in "SetLLVMFunctionAttributesForDefinition" doesn't already put optnone on these functions. Is something undoing this later?

The entry function that is created and whose attribute is set to `noinline` in this function is different from that `SetLLVMFunctionAttributesForDefinition()` looks at.

`GenerateCode(GlobalFnDecl, MangledFn, ...)` calls `StartFunction(GlobalFnDecl, ResTy, MangledFn, ...)` which in turn calls `emitEntryFunction(FnDecl, MangledFn)`. `emitEntryFunction(FnDecl, MangledFn, ...)` constructs a new entry function `EntryFn`, sets linkage of `MangledFn` to be `internal` to arrange it to be inlined in `EntryFn` etc., and calls `setHLSLEntryAttributes(FnDecl, EntryFn)` to set attributes of `EntryFn`.

`SetLLVMFunctionAttributesForDefinition(...)` sets attributes of `MangledFn`. So the logic in that function checks attributes for `MangledFn` and not for the created `EntryFn`.

Hence setting optnone attribute in `setHLSLEntryAttributes(FnDecl, EntryFn)` of `EntryFn` at the time of its set up seemed appropriate - if optimizations are disabled.


https://github.com/llvm/llvm-project/pull/125937


More information about the cfe-commits mailing list