22
22
#include " llvm/CodeGen/MachineInstrBuilder.h"
23
23
#include " llvm/CodeGen/MachineInstrBundle.h"
24
24
#include " llvm/CodeGen/MachineOperand.h"
25
+ #include " llvm/CodeGen/ReachingDefAnalysis.h"
25
26
#include " llvm/IR/DebugLoc.h"
26
27
#include " llvm/MC/MCInstrDesc.h"
27
- #include " llvm/MC/MCRegisterInfo.h"
28
28
#include " llvm/Support/Debug.h"
29
29
#include < cassert>
30
30
#include < new>
@@ -37,16 +37,21 @@ namespace {
37
37
class MVEVPTBlock : public MachineFunctionPass {
38
38
public:
39
39
static char ID;
40
- const Thumb2InstrInfo *TII;
41
- const TargetRegisterInfo *TRI;
42
40
43
41
MVEVPTBlock () : MachineFunctionPass(ID) {}
44
42
45
43
bool runOnMachineFunction (MachineFunction &Fn) override ;
46
44
45
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
46
+ AU.setPreservesCFG ();
47
+ AU.addRequired <ReachingDefAnalysis>();
48
+ MachineFunctionPass::getAnalysisUsage (AU);
49
+ }
50
+
47
51
MachineFunctionProperties getRequiredProperties () const override {
48
52
return MachineFunctionProperties ().set (
49
- MachineFunctionProperties::Property::NoVRegs);
53
+ MachineFunctionProperties::Property::NoVRegs).set (
54
+ MachineFunctionProperties::Property::TracksLiveness);
50
55
}
51
56
52
57
StringRef getPassName () const override {
@@ -55,6 +60,9 @@ namespace {
55
60
56
61
private:
57
62
bool InsertVPTBlocks (MachineBasicBlock &MBB);
63
+
64
+ const Thumb2InstrInfo *TII = nullptr ;
65
+ ReachingDefAnalysis *RDA = nullptr ;
58
66
};
59
67
60
68
char MVEVPTBlock::ID = 0 ;
@@ -134,35 +142,25 @@ static unsigned VCMPOpcodeToVPT(unsigned Opcode) {
134
142
}
135
143
}
136
144
137
- static MachineInstr *findVCMPToFoldIntoVPST (MachineBasicBlock::iterator MI,
138
- const TargetRegisterInfo *TRI ,
145
+ static MachineInstr *findVCMPToFoldIntoVPST (MachineInstr * MI,
146
+ ReachingDefAnalysis *RDA ,
139
147
unsigned &NewOpcode) {
140
- // Search backwards to the instruction that defines VPR. This may or not
141
- // be a VCMP, we check that after this loop. If we find another instruction
142
- // that reads cpsr, we return nullptr.
143
- MachineBasicBlock::iterator CmpMI = MI;
144
- while (CmpMI != MI->getParent ()->begin ()) {
145
- --CmpMI;
146
- if (CmpMI->modifiesRegister (ARM::VPR, TRI))
147
- break ;
148
- if (CmpMI->readsRegister (ARM::VPR, TRI))
149
- break ;
150
- }
151
-
152
- if (CmpMI == MI)
153
- return nullptr ;
154
- NewOpcode = VCMPOpcodeToVPT (CmpMI->getOpcode ());
155
- if (NewOpcode == 0 )
148
+ // First, search backwards to the instruction that defines VPR
149
+ auto *Def = RDA->getReachingMIDef (MI, ARM::VPR);
150
+ if (!Def)
156
151
return nullptr ;
157
152
158
- // Search forward from CmpMI to MI, checking if either register was def'd
159
- if (registerDefinedBetween (CmpMI->getOperand (1 ).getReg (), std::next (CmpMI),
160
- MI, TRI))
153
+ // Now check that Def is a VCMP
154
+ if (!(NewOpcode = VCMPOpcodeToVPT (Def->getOpcode ())))
161
155
return nullptr ;
162
- if (registerDefinedBetween (CmpMI->getOperand (2 ).getReg (), std::next (CmpMI),
163
- MI, TRI))
156
+
157
+ // Check that Def's operands are not defined between the VCMP and MI, i.e.
158
+ // check that they have the same reaching def.
159
+ if (!RDA->hasSameReachingDef (Def, MI, Def->getOperand (1 ).getReg ()) ||
160
+ !RDA->hasSameReachingDef (Def, MI, Def->getOperand (2 ).getReg ()))
164
161
return nullptr ;
165
- return &*CmpMI;
162
+
163
+ return Def;
166
164
}
167
165
168
166
bool MVEVPTBlock::InsertVPTBlocks (MachineBasicBlock &Block) {
@@ -230,7 +228,7 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) {
230
228
// a VPST directly
231
229
MachineInstrBuilder MIBuilder;
232
230
unsigned NewOpcode;
233
- MachineInstr *VCMP = findVCMPToFoldIntoVPST (MI, TRI , NewOpcode);
231
+ MachineInstr *VCMP = findVCMPToFoldIntoVPST (MI, RDA , NewOpcode);
234
232
if (VCMP) {
235
233
LLVM_DEBUG (dbgs () << " folding VCMP into VPST: " ; VCMP->dump ());
236
234
MIBuilder = BuildMI (Block, MI, dl, TII->get (NewOpcode));
@@ -260,7 +258,7 @@ bool MVEVPTBlock::runOnMachineFunction(MachineFunction &Fn) {
260
258
return false ;
261
259
262
260
TII = static_cast <const Thumb2InstrInfo *>(STI.getInstrInfo ());
263
- TRI = STI. getRegisterInfo ();
261
+ RDA = &getAnalysis<ReachingDefAnalysis> ();
264
262
265
263
LLVM_DEBUG (dbgs () << " ********** ARM MVE VPT BLOCKS **********\n "
266
264
<< " ********** Function: " << Fn.getName () << ' \n ' );
0 commit comments