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