[llvm] [Target] Remove `Target::resetTargetOptions` (PR #201825)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 5 22:39:44 PDT 2026
https://github.com/paperchalice updated https://github.com/llvm/llvm-project/pull/201825
>From 240fa2b7f5fd3bc616c0a94358b47d3a40865b8a Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Fri, 5 Jun 2026 20:09:05 +0800
Subject: [PATCH 1/2] [Target] Remove `Target::resetTargetOptions`
---
llvm/include/llvm/Target/TargetMachine.h | 7 +------
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 1 -
.../lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 12 ------------
llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | 4 ----
llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 4 ----
llvm/lib/Target/AMDGPU/R600TargetMachine.cpp | 7 +------
llvm/lib/Target/ARM/ARMTargetMachine.cpp | 4 ----
llvm/lib/Target/CSKY/CSKYTargetMachine.cpp | 4 ----
llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp | 7 +------
.../Target/LoongArch/LoongArchTargetMachine.cpp | 4 ----
llvm/lib/Target/M68k/M68kTargetMachine.cpp | 7 +------
llvm/lib/Target/Mips/MipsTargetMachine.cpp | 4 ----
llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 4 ----
llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 4 ----
llvm/lib/Target/Sparc/SparcTargetMachine.cpp | 7 +------
llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp | 4 ----
llvm/lib/Target/TargetMachine.cpp | 15 ---------------
.../WebAssembly/WebAssemblyTargetMachine.cpp | 5 -----
llvm/lib/Target/X86/X86TargetMachine.cpp | 4 ----
llvm/lib/Target/Xtensa/XtensaTargetMachine.cpp | 7 +------
20 files changed, 6 insertions(+), 109 deletions(-)
diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h
index b5d804d8fe942..8f5721a031aed 100644
--- a/llvm/include/llvm/Target/TargetMachine.h
+++ b/llvm/include/llvm/Target/TargetMachine.h
@@ -121,7 +121,7 @@ class LLVM_ABI TargetMachine {
std::optional<PGOOptions> PGOOption;
public:
- mutable TargetOptions Options;
+ TargetOptions Options;
TargetMachine(const TargetMachine &) = delete;
void operator=(const TargetMachine &) = delete;
@@ -231,11 +231,6 @@ class LLVM_ABI TargetMachine {
return DL.getPointerSize(DL.getAllocaAddrSpace());
}
- /// Reset the target options based on the function's attributes.
- // FIXME: Remove TargetOptions that affect per-function code generation
- // from TargetMachine.
- void resetTargetOptions(const Function &F) const;
-
/// Return target specific asm information.
const MCAsmInfo &getMCAsmInfo() const { return *AsmInfo; }
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index a14b6cfe2dca3..28755da8327aa 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -4254,7 +4254,6 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {
MRI = &MF->getRegInfo();
DL = &F.getDataLayout();
const TargetMachine &TM = MF->getTarget();
- TM.resetTargetOptions(F);
EnableOpts = OptLevel != CodeGenOptLevel::None && !skipFunction(F);
FuncInfo.MF = MF;
if (EnableOpts) {
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 3dc599b556ddd..5ae52cae771fb 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -384,12 +384,6 @@ bool SelectionDAGISelLegacy::runOnMachineFunction(MachineFunction &MF) {
// we change the optimisation level.
MF.setUseDebugInstrRef(MF.shouldUseDebugInstrRef());
- // Reset the target options before resetting the optimization
- // level below.
- // FIXME: This is a horrible hack and should be processed via
- // codegen looking at the optimization level explicitly when
- // it wants to look at it.
- Selector->TM.resetTargetOptions(MF.getFunction());
// Reset OptLevel to None for optnone functions.
CodeGenOptLevel NewOptLevel = skipFunction(MF.getFunction())
? CodeGenOptLevel::None
@@ -457,12 +451,6 @@ SelectionDAGISelPass::run(MachineFunction &MF,
// we change the optimisation level.
MF.setUseDebugInstrRef(MF.shouldUseDebugInstrRef());
- // Reset the target options before resetting the optimization
- // level below.
- // FIXME: This is a horrible hack and should be processed via
- // codegen looking at the optimization level explicitly when
- // it wants to look at it.
- Selector->TM.resetTargetOptions(MF.getFunction());
// Reset OptLevel to None for optnone functions.
// TODO: Add a function analysis to handle this.
Selector->MF = &MF;
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index b8cc69f7569d6..f65bdb0737fef 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -491,10 +491,6 @@ AArch64TargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[Key];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<AArch64Subtarget>(
TargetTriple, CPU, TuneCPU, FS, *this, isLittle, MinSVEVectorSize,
MaxSVEVectorSize, IsStreaming, IsStreamingCompatible, HasMinSize,
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index b572e47ce0f21..b078e0835a90e 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
@@ -1281,10 +1281,6 @@ GCNTargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[SubtargetKey];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<GCNSubtarget>(TargetTriple, GPU, FS, *this, BufRelaxed,
TBufRelaxed);
}
diff --git a/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp b/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
index f6b5e049c41e4..2d7dd12a94a56 100644
--- a/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
@@ -92,13 +92,8 @@ R600TargetMachine::getSubtargetImpl(const Function &F) const {
SubtargetKey.append(FS);
auto &I = SubtargetMap[SubtargetKey];
- if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
+ if (!I)
I = std::make_unique<R600Subtarget>(TargetTriple, GPU, FS, *this);
- }
return I.get();
}
diff --git a/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/llvm/lib/Target/ARM/ARMTargetMachine.cpp
index 2df33f4da5d27..ad6ceacb9933e 100644
--- a/llvm/lib/Target/ARM/ARMTargetMachine.cpp
+++ b/llvm/lib/Target/ARM/ARMTargetMachine.cpp
@@ -237,10 +237,6 @@ ARMBaseTargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[Key];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<ARMSubtarget>(TargetTriple, CPU, FS, *this, isLittle,
F.hasMinSize(), DM);
diff --git a/llvm/lib/Target/CSKY/CSKYTargetMachine.cpp b/llvm/lib/Target/CSKY/CSKYTargetMachine.cpp
index d0058b9af14be..326dedfa08328 100644
--- a/llvm/lib/Target/CSKY/CSKYTargetMachine.cpp
+++ b/llvm/lib/Target/CSKY/CSKYTargetMachine.cpp
@@ -62,10 +62,6 @@ CSKYTargetMachine::getSubtargetImpl(const Function &F) const {
std::string Key = CPU + TuneCPU + FS;
auto &I = SubtargetMap[Key];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<CSKYSubtarget>(TargetTriple, CPU, TuneCPU, FS, *this);
if (I->useHardFloat() && !I->hasAnyFloatExt())
errs() << "Hard-float can't be used with current CPU,"
diff --git a/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp b/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp
index e42fb0b9866b3..5c72b6cb20883 100644
--- a/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp
@@ -262,13 +262,8 @@ HexagonTargetMachine::getSubtargetImpl(const Function &F) const {
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
auto &I = SubtargetMap[CPU + FS];
- if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
+ if (!I)
I = std::make_unique<HexagonSubtarget>(TargetTriple, CPU, FS, *this);
- }
return I.get();
}
diff --git a/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp b/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp
index 10fb0d39481b1..fb0053b7077e4 100644
--- a/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp
@@ -121,10 +121,6 @@ LoongArchTargetMachine::getSubtargetImpl(const Function &F) const {
std::string Key = CPU + TuneCPU + FS;
auto &I = SubtargetMap[Key];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
auto ABIName = Options.MCOptions.getABIName();
if (const MDString *ModuleTargetABI = dyn_cast_or_null<MDString>(
F.getParent()->getModuleFlag("target-abi"))) {
diff --git a/llvm/lib/Target/M68k/M68kTargetMachine.cpp b/llvm/lib/Target/M68k/M68kTargetMachine.cpp
index f525d43dea41c..72f476298a02f 100644
--- a/llvm/lib/Target/M68k/M68kTargetMachine.cpp
+++ b/llvm/lib/Target/M68k/M68kTargetMachine.cpp
@@ -87,13 +87,8 @@ M68kTargetMachine::getSubtargetImpl(const Function &F) const {
auto FS = FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
auto &I = SubtargetMap[CPU + FS];
- if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
+ if (!I)
I = std::make_unique<M68kSubtarget>(TargetTriple, CPU, FS, *this);
- }
return I.get();
}
diff --git a/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/llvm/lib/Target/Mips/MipsTargetMachine.cpp
index 9e605d165e705..17b9555b16a52 100644
--- a/llvm/lib/Target/Mips/MipsTargetMachine.cpp
+++ b/llvm/lib/Target/Mips/MipsTargetMachine.cpp
@@ -171,10 +171,6 @@ MipsTargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[CPU + FS];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<MipsSubtarget>(
TargetTriple, CPU, FS, isLittle, *this,
MaybeAlign(F.getParent()->getOverrideStackAlignment()));
diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
index 915ca5fc44db1..de06683fd31cf 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
@@ -340,10 +340,6 @@ PPCTargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[CPU + TuneCPU + FS];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<PPCSubtarget>(
TargetTriple, CPU, TuneCPU,
// FIXME: It would be good to have the subtarget additions here
diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
index 3d47a27a9628c..c0de8fe473ae1 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
@@ -251,10 +251,6 @@ RISCVTargetMachine::getSubtargetImpl(const Function &F) const {
<< CPU << TuneCPU << FS;
auto &I = SubtargetMap[Key];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
auto ABIName = Options.MCOptions.getABIName();
if (const MDString *ModuleTargetABI = dyn_cast_or_null<MDString>(
F.getParent()->getModuleFlag("target-abi"))) {
diff --git a/llvm/lib/Target/Sparc/SparcTargetMachine.cpp b/llvm/lib/Target/Sparc/SparcTargetMachine.cpp
index b9f1ad5331d4b..f92f173e689dd 100644
--- a/llvm/lib/Target/Sparc/SparcTargetMachine.cpp
+++ b/llvm/lib/Target/Sparc/SparcTargetMachine.cpp
@@ -112,13 +112,8 @@ SparcTargetMachine::getSubtargetImpl(const Function &F) const {
FS += FS.empty() ? "+soft-float" : ",+soft-float";
auto &I = SubtargetMap[CPU + FS];
- if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
+ if (!I)
I = std::make_unique<SparcSubtarget>(CPU, TuneCPU, FS, *this);
- }
return I.get();
}
diff --git a/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp b/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp
index 110ba5b46fe60..5158077716d9f 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp
@@ -162,10 +162,6 @@ SystemZTargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[CPU + TuneCPU + FS];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<SystemZSubtarget>(TargetTriple, CPU, TuneCPU, FS,
*this);
}
diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp
index f22afb831f11d..9ec10b5be0fd4 100644
--- a/llvm/lib/Target/TargetMachine.cpp
+++ b/llvm/lib/Target/TargetMachine.cpp
@@ -144,21 +144,6 @@ bool TargetMachine::isPositionIndependent() const {
return getRelocationModel() == Reloc::PIC_;
}
-/// Reset the target options based on the function's attributes.
-/// setFunctionAttributes should have made the raw attribute value consistent
-/// with the command line flag if used.
-//
-// FIXME: This function needs to go away for a number of reasons:
-// a) global state on the TargetMachine is terrible in general,
-// b) these target options should be passed only on the function
-// and not on the TargetMachine (via TargetOptions) at all.
-void TargetMachine::resetTargetOptions(const Function &F) const {
-#define RESET_OPTION(X, Y) \
- do { \
- Options.X = F.getFnAttribute(Y).getValueAsBool(); \
- } while (0)
-}
-
/// Returns the code generation relocation model. The choices are static, PIC,
/// and dynamic-no-pic.
Reloc::Model TargetMachine::getRelocationModel() const { return RM; }
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 1361dd99b7072..886ea0a8ab574 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -250,11 +250,6 @@ WebAssemblyTargetMachine::getSubtargetImpl(const Function &F) const {
std::string FS =
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
-
return getSubtargetImpl(CPU, FS);
}
diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp
index 924c20e48c672..5e729b89ad630 100644
--- a/llvm/lib/Target/X86/X86TargetMachine.cpp
+++ b/llvm/lib/Target/X86/X86TargetMachine.cpp
@@ -290,10 +290,6 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const {
auto &I = SubtargetMap[Key];
if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
I = std::make_unique<X86Subtarget>(
TargetTriple, CPU, TuneCPU, FS, *this,
MaybeAlign(F.getParent()->getOverrideStackAlignment()),
diff --git a/llvm/lib/Target/Xtensa/XtensaTargetMachine.cpp b/llvm/lib/Target/Xtensa/XtensaTargetMachine.cpp
index 72cb61b5e864e..b523678cca14e 100644
--- a/llvm/lib/Target/Xtensa/XtensaTargetMachine.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaTargetMachine.cpp
@@ -70,13 +70,8 @@ XtensaTargetMachine::getSubtargetImpl(const Function &F) const {
auto FS = FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
auto &I = SubtargetMap[CPU + FS];
- if (!I) {
- // This needs to be done before we create a new subtarget since any
- // creation will depend on the TM and the code generation flags on the
- // function that reside in TargetOptions.
- resetTargetOptions(F);
+ if (!I)
I = std::make_unique<XtensaSubtarget>(TargetTriple, CPU, FS, *this);
- }
return I.get();
}
>From 4f90ee44e4dbd7c2d66535b96803e23379fbb1ab Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Sat, 6 Jun 2026 13:39:28 +0800
Subject: [PATCH 2/2] make Options const
---
llvm/include/llvm/Target/TargetMachine.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h
index 8f5721a031aed..818854ee8a896 100644
--- a/llvm/include/llvm/Target/TargetMachine.h
+++ b/llvm/include/llvm/Target/TargetMachine.h
@@ -121,7 +121,7 @@ class LLVM_ABI TargetMachine {
std::optional<PGOOptions> PGOOption;
public:
- TargetOptions Options;
+ const TargetOptions Options;
TargetMachine(const TargetMachine &) = delete;
void operator=(const TargetMachine &) = delete;
More information about the llvm-commits
mailing list