19
19
#include " llvm/CodeGen/LivePhysRegs.h"
20
20
#include " llvm/CodeGen/MachineFunctionPass.h"
21
21
#include " llvm/CodeGen/MachineInstrBuilder.h"
22
+ #include " llvm/MC/MCContext.h"
22
23
23
24
using namespace llvm ;
24
25
@@ -41,24 +42,18 @@ class RISCVExpandPseudo : public MachineFunctionPass {
41
42
42
43
private:
43
44
bool expandMBB (MachineBasicBlock &MBB);
44
- bool expandMI (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
45
- MachineBasicBlock::iterator &NextMBBI);
45
+ bool expandMI (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI);
46
46
bool expandAuipcInstPair (MachineBasicBlock &MBB,
47
47
MachineBasicBlock::iterator MBBI,
48
- MachineBasicBlock::iterator &NextMBBI,
49
48
unsigned FlagsHi, unsigned SecondOpcode);
50
49
bool expandLoadLocalAddress (MachineBasicBlock &MBB,
51
- MachineBasicBlock::iterator MBBI,
52
- MachineBasicBlock::iterator &NextMBBI);
50
+ MachineBasicBlock::iterator MBBI);
53
51
bool expandLoadAddress (MachineBasicBlock &MBB,
54
- MachineBasicBlock::iterator MBBI,
55
- MachineBasicBlock::iterator &NextMBBI);
52
+ MachineBasicBlock::iterator MBBI);
56
53
bool expandLoadTLSIEAddress (MachineBasicBlock &MBB,
57
- MachineBasicBlock::iterator MBBI,
58
- MachineBasicBlock::iterator &NextMBBI);
54
+ MachineBasicBlock::iterator MBBI);
59
55
bool expandLoadTLSGDAddress (MachineBasicBlock &MBB,
60
- MachineBasicBlock::iterator MBBI,
61
- MachineBasicBlock::iterator &NextMBBI);
56
+ MachineBasicBlock::iterator MBBI);
62
57
};
63
58
64
59
char RISCVExpandPseudo::ID = 0 ;
@@ -77,81 +72,64 @@ bool RISCVExpandPseudo::expandMBB(MachineBasicBlock &MBB) {
77
72
MachineBasicBlock::iterator MBBI = MBB.begin (), E = MBB.end ();
78
73
while (MBBI != E) {
79
74
MachineBasicBlock::iterator NMBBI = std::next (MBBI);
80
- Modified |= expandMI (MBB, MBBI, NMBBI );
75
+ Modified |= expandMI (MBB, MBBI);
81
76
MBBI = NMBBI;
82
77
}
83
78
84
79
return Modified;
85
80
}
86
81
87
82
bool RISCVExpandPseudo::expandMI (MachineBasicBlock &MBB,
88
- MachineBasicBlock::iterator MBBI,
89
- MachineBasicBlock::iterator &NextMBBI) {
83
+ MachineBasicBlock::iterator MBBI) {
90
84
switch (MBBI->getOpcode ()) {
91
85
case RISCV::PseudoLLA:
92
- return expandLoadLocalAddress (MBB, MBBI, NextMBBI );
86
+ return expandLoadLocalAddress (MBB, MBBI);
93
87
case RISCV::PseudoLA:
94
- return expandLoadAddress (MBB, MBBI, NextMBBI );
88
+ return expandLoadAddress (MBB, MBBI);
95
89
case RISCV::PseudoLA_TLS_IE:
96
- return expandLoadTLSIEAddress (MBB, MBBI, NextMBBI );
90
+ return expandLoadTLSIEAddress (MBB, MBBI);
97
91
case RISCV::PseudoLA_TLS_GD:
98
- return expandLoadTLSGDAddress (MBB, MBBI, NextMBBI );
92
+ return expandLoadTLSGDAddress (MBB, MBBI);
99
93
}
100
94
101
95
return false ;
102
96
}
103
97
104
- bool RISCVExpandPseudo::expandAuipcInstPair (
105
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
106
- MachineBasicBlock::iterator &NextMBBI, unsigned FlagsHi,
107
- unsigned SecondOpcode) {
98
+ bool RISCVExpandPseudo::expandAuipcInstPair (MachineBasicBlock &MBB,
99
+ MachineBasicBlock::iterator MBBI,
100
+ unsigned FlagsHi,
101
+ unsigned SecondOpcode) {
108
102
MachineFunction *MF = MBB.getParent ();
109
103
MachineInstr &MI = *MBBI;
110
104
DebugLoc DL = MI.getDebugLoc ();
111
105
112
106
Register DestReg = MI.getOperand (0 ).getReg ();
113
- const MachineOperand &Symbol = MI.getOperand (1 );
107
+ Register ScratchReg =
108
+ MF->getRegInfo ().createVirtualRegister (&RISCV::GPRRegClass);
114
109
115
- MachineBasicBlock *NewMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
110
+ MachineOperand &Symbol = MI.getOperand (1 );
111
+ Symbol.setTargetFlags (FlagsHi);
112
+ MCSymbol *AUIPCSymbol = MF->getContext ().createTempSymbol (false );
116
113
117
- // Tell AsmPrinter that we unconditionally want the symbol of this label to be
118
- // emitted.
119
- NewMBB-> setLabelMustBeEmitted ( );
114
+ MachineInstr *MIAUIPC =
115
+ BuildMI (MBB, MBBI, DL, TII-> get (RISCV::AUIPC), ScratchReg). add (Symbol);
116
+ MIAUIPC-> setPreInstrSymbol (*MF, AUIPCSymbol );
120
117
121
- MF->insert (++MBB.getIterator (), NewMBB);
118
+ BuildMI (MBB, MBBI, DL, TII->get (SecondOpcode), DestReg)
119
+ .addReg (ScratchReg)
120
+ .addSym (AUIPCSymbol, RISCVII::MO_PCREL_LO);
122
121
123
- BuildMI (NewMBB, DL, TII->get (RISCV::AUIPC), DestReg)
124
- .addDisp (Symbol, 0 , FlagsHi);
125
- BuildMI (NewMBB, DL, TII->get (SecondOpcode), DestReg)
126
- .addReg (DestReg)
127
- .addMBB (NewMBB, RISCVII::MO_PCREL_LO);
128
-
129
- // Move all the rest of the instructions to NewMBB.
130
- NewMBB->splice (NewMBB->end (), &MBB, std::next (MBBI), MBB.end ());
131
- // Update machine-CFG edges.
132
- NewMBB->transferSuccessorsAndUpdatePHIs (&MBB);
133
- // Make the original basic block fall-through to the new.
134
- MBB.addSuccessor (NewMBB);
135
-
136
- // Make sure live-ins are correctly attached to this new basic block.
137
- LivePhysRegs LiveRegs;
138
- computeAndAddLiveIns (LiveRegs, *NewMBB);
139
-
140
- NextMBBI = MBB.end ();
141
122
MI.eraseFromParent ();
142
123
return true ;
143
124
}
144
125
145
126
bool RISCVExpandPseudo::expandLoadLocalAddress (
146
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
147
- MachineBasicBlock::iterator &NextMBBI) {
148
- return expandAuipcInstPair (MBB, MBBI, NextMBBI, RISCVII::MO_PCREL_HI,
149
- RISCV::ADDI);
127
+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) {
128
+ return expandAuipcInstPair (MBB, MBBI, RISCVII::MO_PCREL_HI, RISCV::ADDI);
150
129
}
151
130
152
- bool RISCVExpandPseudo::expandLoadAddress (
153
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
154
- MachineBasicBlock::iterator &NextMBBI) {
131
+ bool RISCVExpandPseudo::expandLoadAddress (MachineBasicBlock &MBB,
132
+ MachineBasicBlock::iterator MBBI) {
155
133
MachineFunction *MF = MBB.getParent ();
156
134
157
135
unsigned SecondOpcode;
@@ -164,25 +142,21 @@ bool RISCVExpandPseudo::expandLoadAddress(
164
142
SecondOpcode = RISCV::ADDI;
165
143
FlagsHi = RISCVII::MO_PCREL_HI;
166
144
}
167
- return expandAuipcInstPair (MBB, MBBI, NextMBBI, FlagsHi, SecondOpcode);
145
+ return expandAuipcInstPair (MBB, MBBI, FlagsHi, SecondOpcode);
168
146
}
169
147
170
148
bool RISCVExpandPseudo::expandLoadTLSIEAddress (
171
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
172
- MachineBasicBlock::iterator &NextMBBI) {
149
+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) {
173
150
MachineFunction *MF = MBB.getParent ();
174
151
175
152
const auto &STI = MF->getSubtarget <RISCVSubtarget>();
176
153
unsigned SecondOpcode = STI.is64Bit () ? RISCV::LD : RISCV::LW;
177
- return expandAuipcInstPair (MBB, MBBI, NextMBBI, RISCVII::MO_TLS_GOT_HI,
178
- SecondOpcode);
154
+ return expandAuipcInstPair (MBB, MBBI, RISCVII::MO_TLS_GOT_HI, SecondOpcode);
179
155
}
180
156
181
157
bool RISCVExpandPseudo::expandLoadTLSGDAddress (
182
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
183
- MachineBasicBlock::iterator &NextMBBI) {
184
- return expandAuipcInstPair (MBB, MBBI, NextMBBI, RISCVII::MO_TLS_GD_HI,
185
- RISCV::ADDI);
158
+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) {
159
+ return expandAuipcInstPair (MBB, MBBI, RISCVII::MO_TLS_GD_HI, RISCV::ADDI);
186
160
}
187
161
188
162
} // end of anonymous namespace
0 commit comments