[llvm] [SelectionDAG][GlobalISel] Move `to_tframeindex` & `renderFrameIndex` from targets into common code. (PR #210896)
Demetrius Kanios via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 21 00:52:34 PDT 2026
https://github.com/QuantumSegfault updated https://github.com/llvm/llvm-project/pull/210896
>From b117644b7ac6a2dcbffa820c764267cc40ca52b5 Mon Sep 17 00:00:00 2001
From: Demetrius Kanios <demetrius at kanios.net>
Date: Tue, 21 Jul 2026 00:28:06 -0700
Subject: [PATCH 1/2] Move `to_tframeindex` & `renderFrameIndex`
---
.../llvm/CodeGen/GlobalISel/InstructionSelector.h | 4 ++++
.../llvm/Target/GlobalISel/SelectionDAGCompat.td | 3 +++
llvm/include/llvm/Target/TargetSelectionDAG.td | 4 ++++
llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp | 8 ++++++++
llvm/lib/Target/AMDGPU/AMDGPUGISel.td | 3 ---
llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp | 6 ------
llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h | 3 ---
llvm/lib/Target/AMDGPU/SIInstrInfo.td | 5 -----
llvm/lib/Target/AMDGPU/SIInstructions.td | 4 ++--
llvm/lib/Target/CSKY/CSKYInstrInfo.td | 5 -----
llvm/lib/Target/NVPTX/NVPTXInstrInfo.td | 4 ----
.../Target/RISCV/GISel/RISCVInstructionSelector.cpp | 10 ----------
llvm/lib/Target/RISCV/RISCVInstrInfo.td | 8 --------
llvm/lib/Target/Sparc/SparcInstrInfo.td | 3 ---
llvm/test/TableGen/GlobalISelEmitter/frameindex.td | 5 -----
15 files changed, 21 insertions(+), 54 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
index 483afb426fa10..deb94d93bac23 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
@@ -41,6 +41,10 @@ class LLVM_ABI InstructionSelector : public GIMatchTableExecutor {
/// changingInstr() and changedInstr() will never be called on these
/// observers.
GISelObserverWrapper *AllObservers = nullptr;
+
+protected:
+ void renderFrameIndex(MachineInstrBuilder &MIB, const MachineInstr &MI,
+ int OpIdx) const;
};
} // namespace llvm
diff --git a/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td b/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
index c483d2310b8d2..e06c96fa837df 100644
--- a/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
+++ b/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
@@ -312,3 +312,6 @@ class GIComplexPatternEquiv<ComplexPattern seldag> {
class GISDNodeXFormEquiv<SDNodeXForm seldag> {
SDNodeXForm SelDAGEquivalent = seldag;
}
+
+def : GICustomOperandRenderer<"renderFrameIndex">,
+ GISDNodeXFormEquiv<to_tframeindex>;
diff --git a/llvm/include/llvm/Target/TargetSelectionDAG.td b/llvm/include/llvm/Target/TargetSelectionDAG.td
index 69be608107359..8bebbbcce17be 100644
--- a/llvm/include/llvm/Target/TargetSelectionDAG.td
+++ b/llvm/include/llvm/Target/TargetSelectionDAG.td
@@ -1024,6 +1024,10 @@ class SDNodeXForm<SDNode opc, code xformFunction> {
// The default transform does not change the matched node.
def NOOP_SDNodeXForm : SDNodeXForm<imm, [{}]>;
+def to_tframeindex : SDNodeXForm<frameindex, [{
+ return CurDAG->getTargetFrameIndex(N->getIndex(), N->getValueType(0));
+}]>;
+
//===----------------------------------------------------------------------===//
// Selection DAG Pattern Fragments.
//
diff --git a/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp b/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp
index c48591cc2f02f..9a13b9979fca9 100644
--- a/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp
@@ -13,4 +13,12 @@ namespace llvm {
// vtable anchor
InstructionSelector::~InstructionSelector() = default;
+void InstructionSelector::renderFrameIndex(MachineInstrBuilder &MIB,
+ const MachineInstr &MI,
+ int OpIdx) const {
+ assert(MI.getOpcode() == TargetOpcode::G_FRAME_INDEX && OpIdx == -1 &&
+ "Expected G_FRAME_INDEX");
+ MIB.add(MI.getOperand(1));
+}
+
} // namespace llvm
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUGISel.td b/llvm/lib/Target/AMDGPU/AMDGPUGISel.td
index a88322df79036..5df9834f4ef80 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUGISel.td
+++ b/llvm/lib/Target/AMDGPU/AMDGPUGISel.td
@@ -474,9 +474,6 @@ def gi_extract_swz : GICustomOperandRenderer<"renderExtractSWZ">,
def gi_extract_cpol_set_glc : GICustomOperandRenderer<"renderExtractCpolSetGLC">,
GISDNodeXFormEquiv<extract_cpol_set_glc>;
-def gi_frameindex_to_targetframeindex : GICustomOperandRenderer<"renderFrameIndex">,
- GISDNodeXFormEquiv<frameindex_to_targetframeindex>;
-
def gi_fp_pow2_to_exponent : GICustomOperandRenderer<"renderFPPow2ToExponent">,
GISDNodeXFormEquiv<FPPow2ToExponentXForm>;
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
index a2497e5e4189c..d4373ece5fbf6 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
@@ -7601,12 +7601,6 @@ void AMDGPUInstructionSelector::renderExtractCpolSetGLC(
MIB.addImm(Cpol | AMDGPU::CPol::GLC);
}
-void AMDGPUInstructionSelector::renderFrameIndex(MachineInstrBuilder &MIB,
- const MachineInstr &MI,
- int OpIdx) const {
- MIB.addFrameIndex(MI.getOperand(1).getIndex());
-}
-
void AMDGPUInstructionSelector::renderFPPow2ToExponent(MachineInstrBuilder &MIB,
const MachineInstr &MI,
int OpIdx) const {
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h
index bd8ec0a769398..1f9531ce2fa13 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h
@@ -417,9 +417,6 @@ class AMDGPUInstructionSelector final : public InstructionSelector {
void renderExtractCpolSetGLC(MachineInstrBuilder &MIB, const MachineInstr &MI,
int OpIdx) const;
- void renderFrameIndex(MachineInstrBuilder &MIB, const MachineInstr &MI,
- int OpIdx) const;
-
void renderFPPow2ToExponent(MachineInstrBuilder &MIB, const MachineInstr &MI,
int OpIdx) const;
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td
index 7be067c085b5f..fcb731bc6fe91 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td
@@ -881,11 +881,6 @@ return CurDAG->getTargetConstant(
N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i32);
}]>;
-def frameindex_to_targetframeindex : SDNodeXForm<frameindex, [{
- auto FI = cast<FrameIndexSDNode>(N);
- return CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32);
-}]>;
-
// Copied from the AArch64 backend:
def bitcast_fpimm_to_i64 : SDNodeXForm<fpimm, [{
return CurDAG->getTargetConstant(
diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td
index d978735a92db8..f04373d3163a9 100644
--- a/llvm/lib/Target/AMDGPU/SIInstructions.td
+++ b/llvm/lib/Target/AMDGPU/SIInstructions.td
@@ -2580,12 +2580,12 @@ foreach vt = Reg32Types.types in {
// unnecessary copy from SGPR to VGPR.
def : GCNPat <
(VGPRImm<(p5 frameindex)>:$fi),
- (V_MOV_B32_e32 (p5 (frameindex_to_targetframeindex $fi)))
+ (V_MOV_B32_e32 (p5 (to_tframeindex $fi)))
>;
def : GCNPat <
(p5 frameindex:$fi),
- (S_MOV_B32 (p5 (frameindex_to_targetframeindex $fi)))
+ (S_MOV_B32 (p5 (to_tframeindex $fi)))
>;
def : GCNPat <
diff --git a/llvm/lib/Target/CSKY/CSKYInstrInfo.td b/llvm/lib/Target/CSKY/CSKYInstrInfo.td
index 82e271e5b5565..c5c15462eb3e1 100644
--- a/llvm/lib/Target/CSKY/CSKYInstrInfo.td
+++ b/llvm/lib/Target/CSKY/CSKYInstrInfo.td
@@ -72,11 +72,6 @@ class OImmAsmOperand<int width, string suffix = "">
: ImmAsmOperand<"O", width, suffix> {
}
-def to_tframeindex : SDNodeXForm<frameindex, [{
- auto FI = cast<FrameIndexSDNode>(N);
- return CurDAG->getTargetFrameIndex(FI->getIndex(), TLI->getPointerTy(CurDAG->getDataLayout()));
-}]>;
-
def to_tconstpool : SDNodeXForm<constpool, [{
auto CP = cast<ConstantPoolSDNode>(N);
return CurDAG->getTargetConstantPool(CP->getConstVal(), TLI->getPointerTy(CurDAG->getDataLayout()),
diff --git a/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td b/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td
index dcf89f9a73956..45e2935020d71 100644
--- a/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td
+++ b/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td
@@ -1773,10 +1773,6 @@ def to_texternsym : SDNodeXForm<externalsym, [{
N->getTargetFlags());
}]>;
-def to_tframeindex : SDNodeXForm<frameindex, [{
- return CurDAG->getTargetFrameIndex(N->getIndex(), N->getValueType(0));
-}]>;
-
def : Pat<(i32 globaladdr:$dst), (MOV_B32_sym (to_tglobaladdr $dst))>;
def : Pat<(i64 globaladdr:$dst), (MOV_B64_sym (to_tglobaladdr $dst))>;
diff --git a/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp b/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp
index bf91c53270067..16af89c715861 100644
--- a/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp
+++ b/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp
@@ -144,8 +144,6 @@ class RISCVInstructionSelector : public InstructionSelector {
int OpIdx) const;
void renderImmPlus1(MachineInstrBuilder &MIB, const MachineInstr &MI,
int OpIdx) const;
- void renderFrameIndex(MachineInstrBuilder &MIB, const MachineInstr &MI,
- int OpIdx) const;
void renderTrailingZeros(MachineInstrBuilder &MIB, const MachineInstr &MI,
int OpIdx) const;
@@ -1554,14 +1552,6 @@ void RISCVInstructionSelector::renderImmPlus1(MachineInstrBuilder &MIB,
MIB.addImm(CstVal + 1);
}
-void RISCVInstructionSelector::renderFrameIndex(MachineInstrBuilder &MIB,
- const MachineInstr &MI,
- int OpIdx) const {
- assert(MI.getOpcode() == TargetOpcode::G_FRAME_INDEX && OpIdx == -1 &&
- "Expected G_FRAME_INDEX");
- MIB.add(MI.getOperand(1));
-}
-
void RISCVInstructionSelector::renderTrailingZeros(MachineInstrBuilder &MIB,
const MachineInstr &MI,
int OpIdx) const {
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
index e10ee7389db0e..9b4f805880f29 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -1552,14 +1552,6 @@ def PseudoAddTPRel : Pseudo<(outs GPR:$rd),
/// FrameIndex calculations
-// Transforms frameindex -> tframeindex.
-def to_tframeindex : SDNodeXForm<frameindex, [{
- return CurDAG->getTargetFrameIndex(N->getIndex(), N->getValueType(0));
-}]>;
-
-def : GICustomOperandRenderer<"renderFrameIndex">,
- GISDNodeXFormEquiv<to_tframeindex>;
-
def : Pat<(frameindex:$fi), (ADDI (iPTR (to_tframeindex $fi)), 0)>;
def : Pat<(riscv_add_like frameindex:$fi, simm12_lo:$offset),
diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td
index 40af4dae8783b..99cb89ea342e8 100644
--- a/llvm/lib/Target/Sparc/SparcInstrInfo.td
+++ b/llvm/lib/Target/Sparc/SparcInstrInfo.td
@@ -1945,9 +1945,6 @@ def : Pat<(i32 imm:$val),
(ORri (SETHIi (HI22 imm:$val)), (LO10 imm:$val))>;
// Frame index.
-def to_tframeindex : SDNodeXForm<frameindex, [{
- return CurDAG->getTargetFrameIndex(N->getIndex(), N->getValueType(0));
-}]>;
def : Pat<(i32 (frameindex:$ptr)), (ADDri (i32 (to_tframeindex $ptr)), (i32 0))>;
def : Pat<(i64 (frameindex:$ptr)), (ADDri (i64 (to_tframeindex $ptr)), (i64 0))>;
diff --git a/llvm/test/TableGen/GlobalISelEmitter/frameindex.td b/llvm/test/TableGen/GlobalISelEmitter/frameindex.td
index 27784526a65ba..7e5bf0a6cdbdb 100644
--- a/llvm/test/TableGen/GlobalISelEmitter/frameindex.td
+++ b/llvm/test/TableGen/GlobalISelEmitter/frameindex.td
@@ -5,11 +5,6 @@ include "GlobalISelEmitterCommon.td"
def ADDI : I<(outs GPR32:$dst), (ins GPR32:$src1, i32imm:$src2), []>;
-def to_tframeindex : SDNodeXForm<frameindex, [{}]>;
-
-def : GICustomOperandRenderer<"renderFrameIndex">,
- GISDNodeXFormEquiv<to_tframeindex>;
-
def : Pat<(frameindex:$fi), (ADDI (to_tframeindex $fi), 0)>;
def : Pat<(ptradd frameindex:$fi, (i32 imm:$offset)),
>From d735dbcee69996104a0c1436bf3f09a2af55aef9 Mon Sep 17 00:00:00 2001
From: Demetrius Kanios <demetrius at kanios.net>
Date: Tue, 21 Jul 2026 00:52:21 -0700
Subject: [PATCH 2/2] Add missing `#include`
---
llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h | 2 ++
llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp | 1 +
2 files changed, 3 insertions(+)
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
index deb94d93bac23..09cade01bdadb 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
@@ -14,6 +14,8 @@
#define LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
diff --git a/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp b/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp
index 9a13b9979fca9..bac9ce5a7a0fe 100644
--- a/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/InstructionSelector.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
+#include "llvm/CodeGen/TargetOpcodes.h"
namespace llvm {
More information about the llvm-commits
mailing list