[llvm] [CodeGen] Add -force-emit-call-site-info LLVM flag (PR #206668)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 30 00:31:49 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64

@llvm/pr-subscribers-backend-mips

Author: Zhaoxuan Jiang (nocchijiang)

<details>
<summary>Changes</summary>

Add a cl::opt flag to enable call site info production without requiring the frontend to set EmitCallSiteInfo. This allows any frontend to opt in via its LLVM flag passthrough without source changes.

Introduce TargetOptions::ShouldEmitCallSiteInfo() as a helper that combines the frontend-controlled EmitCallSiteInfo flag with the new -force-emit-call-site-info option, and replace all direct checks of EmitCallSiteInfo with the helper.

---
Full diff: https://github.com/llvm/llvm-project/pull/206668.diff


12 Files Affected:

- (modified) llvm/include/llvm/Target/TargetOptions.h (+8) 
- (modified) llvm/lib/CodeGen/MIRParser/MIRParser.cpp (+2-2) 
- (modified) llvm/lib/CodeGen/MachineFunction.cpp (+2-1) 
- (modified) llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp (+1-1) 
- (modified) llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp (+1-1) 
- (modified) llvm/lib/CodeGen/TargetOptionsImpl.cpp (+10) 
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+1-1) 
- (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+1-1) 
- (modified) llvm/lib/Target/Mips/MipsISelLowering.cpp (+1-1) 
- (modified) llvm/lib/Target/RISCV/RISCVISelLowering.cpp (+1-1) 
- (modified) llvm/lib/Target/X86/X86ISelLoweringCall.cpp (+1-1) 
- (added) llvm/test/CodeGen/Generic/force-emit-call-site-info.ll (+21) 


``````````diff
diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h
index 4b589926615fd..64f17cf651ccb 100644
--- a/llvm/include/llvm/Target/TargetOptions.h
+++ b/llvm/include/llvm/Target/TargetOptions.h
@@ -293,7 +293,15 @@ class TargetOptions {
   /// The flag enables call site info production. It is used only for debug
   /// info, and it is restricted only to optimized code. This can be used for
   /// something else, so that should be controlled in the frontend.
+  /// This flag should never be checked directly, always use
+  /// \ref ShouldEmitCallSiteInfo instead.
   unsigned EmitCallSiteInfo : 1;
+  /// Returns true when call site info should be emitted. This combines
+  /// the frontend-controlled EmitCallSiteInfo flag with the
+  /// -force-emit-call-site-info LLVM option, which allows enabling call site
+  /// info production without requiring frontend source changes.
+  LLVM_ABI bool ShouldEmitCallSiteInfo() const;
+
   /// Set if the target supports the debug entry values by default.
   unsigned SupportsDebugEntryValues : 1;
   /// When set to true, the EnableDebugEntryValues option forces production
diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
index 6f1e7594f34da..643ccd5e84272 100644
--- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
@@ -534,12 +534,12 @@ bool MIRParserImpl::initializeCallSiteInfo(
       }
     }
 
-    if (TM.Options.EmitCallSiteInfo || TM.Options.EmitCallGraphSection)
+    if (TM.Options.ShouldEmitCallSiteInfo() || TM.Options.EmitCallGraphSection)
       MF.addCallSiteInfo(&*CallI, std::move(CSInfo));
   }
 
   if (!YamlMF.CallSitesInfo.empty() &&
-      !(TM.Options.EmitCallSiteInfo || TM.Options.EmitCallGraphSection))
+      !(TM.Options.ShouldEmitCallSiteInfo() || TM.Options.EmitCallGraphSection))
     return error("call site info provided but not used");
   return false;
 }
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp
index b0ffdb36f21be..c9783f72a948d 100644
--- a/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/llvm/lib/CodeGen/MachineFunction.cpp
@@ -986,7 +986,8 @@ MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
   assert(MI->isCandidateForAdditionalCallInfo() &&
          "Call site info refers only to call (MI) candidates");
 
-  if (!Target.Options.EmitCallSiteInfo && !Target.Options.EmitCallGraphSection)
+  if (!Target.Options.ShouldEmitCallSiteInfo() &&
+      !Target.Options.EmitCallGraphSection)
     return CallSitesInfo.end();
   return CallSitesInfo.find(MI);
 }
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
index 58101f415ce51..c7941f4594877 100644
--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
@@ -885,7 +885,7 @@ EmitSchedule(MachineBasicBlock::iterator &InsertPos) {
     }
 
     if (MI->isCandidateForAdditionalCallInfo()) {
-      if (DAG->getTarget().Options.EmitCallSiteInfo ||
+      if (DAG->getTarget().Options.ShouldEmitCallSiteInfo() ||
           DAG->getTarget().Options.EmitCallGraphSection)
         MF.addCallSiteInfo(MI, DAG->getCallSiteInfo(Node));
 
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 00153ef66cf2c..be3516ca90698 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -14290,6 +14290,6 @@ void TargetLowering::setTypeIdForCallsiteInfo(
     MachineFunction::CallSiteInfo &CSInfo) const {
   if (CB && CB->isIndirectCall() &&
       (MF.getTarget().Options.EmitCallGraphSection ||
-       MF.getTarget().Options.EmitCallSiteInfo))
+       MF.getTarget().Options.ShouldEmitCallSiteInfo()))
     CSInfo = MachineFunction::CallSiteInfo(*CB);
 }
diff --git a/llvm/lib/CodeGen/TargetOptionsImpl.cpp b/llvm/lib/CodeGen/TargetOptionsImpl.cpp
index 2dbde46ac62e3..93471a12fab19 100644
--- a/llvm/lib/CodeGen/TargetOptionsImpl.cpp
+++ b/llvm/lib/CodeGen/TargetOptionsImpl.cpp
@@ -15,9 +15,15 @@
 #include "llvm/CodeGen/TargetFrameLowering.h"
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/IR/Function.h"
+#include "llvm/Support/CommandLine.h"
 #include "llvm/Target/TargetOptions.h"
 using namespace llvm;
 
+static cl::opt<bool>
+    ForceEmitCallSiteInfo("force-emit-call-site-info",
+                          cl::desc("Force emission of call site info"),
+                          cl::init(false), cl::Hidden);
+
 /// DisableFramePointerElim - This returns true if frame pointer elimination
 /// optimization should be disabled for the given machine function.
 bool TargetOptions::DisableFramePointerElim(const MachineFunction &MF) const {
@@ -65,3 +71,7 @@ bool TargetOptions::ShouldEmitDebugEntryValues() const {
   return (SupportsDebugEntryValues && DebuggerTuning != DebuggerKind::SCE) ||
          EnableDebugEntryValues;
 }
+
+bool TargetOptions::ShouldEmitCallSiteInfo() const {
+  return EmitCallSiteInfo || ForceEmitCallSiteInfo;
+}
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index e883c8bb5e96e..7ba486441a7ea 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -10480,7 +10480,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
         RegsToPass.emplace_back(VA.getLocReg(), Arg);
         RegsUsed.insert(VA.getLocReg());
         const TargetOptions &Options = DAG.getTarget().Options;
-        if (Options.EmitCallSiteInfo)
+        if (Options.ShouldEmitCallSiteInfo())
           CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), i);
       }
     } else {
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 577e97e736c25..abeb4ce9e9d45 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -2333,7 +2333,7 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
         isThisReturn = true;
       }
       const TargetOptions &Options = DAG.getTarget().Options;
-      if (Options.EmitCallSiteInfo)
+      if (Options.ShouldEmitCallSiteInfo())
         CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), i);
       RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
     } else if (isByVal) {
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp
index 4389f0c8a649a..5e639e678c85b 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.cpp
+++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp
@@ -3514,7 +3514,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
 
       // Collect CSInfo about which register passes which parameter.
       const TargetOptions &Options = DAG.getTarget().Options;
-      if (Options.EmitCallSiteInfo)
+      if (Options.ShouldEmitCallSiteInfo())
         CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), i);
 
       continue;
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 080a3a007f643..2a304103f02c6 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -25527,7 +25527,7 @@ SDValue RISCVTargetLowering::LowerCall(CallLoweringInfo &CLI,
       RegsToPass.push_back(std::make_pair(VA.getLocReg(), ArgValue));
 
       const TargetOptions &Options = DAG.getTarget().Options;
-      if (Options.EmitCallSiteInfo)
+      if (Options.ShouldEmitCallSiteInfo())
         CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), i);
     } else {
       assert(VA.isMemLoc() && "Argument not register or memory");
diff --git a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
index 7c068115df481..df0f101b9a075 100644
--- a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
+++ b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
@@ -2362,7 +2362,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
     } else if (VA.isRegLoc()) {
       RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
       const TargetOptions &Options = DAG.getTarget().Options;
-      if (Options.EmitCallSiteInfo)
+      if (Options.ShouldEmitCallSiteInfo())
         CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), I);
       if (isVarArg && IsWin64) {
         // Win64 ABI requires argument XMM reg to be copied to the corresponding
diff --git a/llvm/test/CodeGen/Generic/force-emit-call-site-info.ll b/llvm/test/CodeGen/Generic/force-emit-call-site-info.ll
new file mode 100644
index 0000000000000..89733154cc87c
--- /dev/null
+++ b/llvm/test/CodeGen/Generic/force-emit-call-site-info.ll
@@ -0,0 +1,21 @@
+; RUN: llc -mtriple=aarch64-linux-gnu %s -o - -stop-before=finalize-isel | FileCheck %s --check-prefix=WITHOUT
+; RUN: llc -mtriple=aarch64-linux-gnu -force-emit-call-site-info %s -o - -stop-before=finalize-isel | FileCheck %s --check-prefix=WITH
+
+; Verify that -force-emit-call-site-info enables call site info production
+; without requiring the frontend to set EmitCallSiteInfo.
+
+; WITHOUT: callSites:       []
+; WITH: callSites:
+; WITH-NEXT:   - { bb: {{.*}}, offset: {{.*}}, fwdArgRegs:
+; WITH-NEXT:       - { arg: 0, reg: '$w0' }
+; WITH-NEXT:       - { arg: 1, reg: '$w1' }
+; WITH-NEXT:       - { arg: 2, reg: '$w2' } }
+
+define i32 @caller(i32 %a, i32 %b, i32 %c) {
+entry:
+  %add = add nsw i32 %b, %a
+  %call = tail call i32 @callee(i32 %add, i32 %c, i32 10)
+  ret i32 %call
+}
+
+declare i32 @callee(i32, i32, i32)

``````````

</details>


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


More information about the llvm-commits mailing list