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"
26
25
#include " llvm/IR/DebugLoc.h"
27
26
#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,21 +37,16 @@ namespace {
37
37
class MVEVPTBlock : public MachineFunctionPass {
38
38
public:
39
39
static char ID;
40
+ const Thumb2InstrInfo *TII;
41
+ const TargetRegisterInfo *TRI;
40
42
41
43
MVEVPTBlock () : MachineFunctionPass(ID) {}
42
44
43
45
bool runOnMachineFunction (MachineFunction &Fn) override ;
44
46
45
- void getAnalysisUsage (AnalysisUsage &AU) const override {
46
- AU.setPreservesCFG ();
47
- AU.addRequired <ReachingDefAnalysis>();
48
- MachineFunctionPass::getAnalysisUsage (AU);
49
- }
50
-
51
47
MachineFunctionProperties getRequiredProperties () const override {
52
48
return MachineFunctionProperties ().set (
53
- MachineFunctionProperties::Property::NoVRegs).set (
54
- MachineFunctionProperties::Property::TracksLiveness);
49
+ MachineFunctionProperties::Property::NoVRegs);
55
50
}
56
51
57
52
StringRef getPassName () const override {
@@ -60,9 +55,6 @@ namespace {
60
55
61
56
private:
62
57
bool InsertVPTBlocks (MachineBasicBlock &MBB);
63
-
64
- const Thumb2InstrInfo *TII = nullptr ;
65
- ReachingDefAnalysis *RDA = nullptr ;
66
58
};
67
59
68
60
char MVEVPTBlock::ID = 0 ;
@@ -142,25 +134,35 @@ static unsigned VCMPOpcodeToVPT(unsigned Opcode) {
142
134
}
143
135
}
144
136
145
- static MachineInstr *findVCMPToFoldIntoVPST (MachineInstr * MI,
146
- ReachingDefAnalysis *RDA ,
137
+ static MachineInstr *findVCMPToFoldIntoVPST (MachineBasicBlock::iterator MI,
138
+ const TargetRegisterInfo *TRI ,
147
139
unsigned &NewOpcode) {
148
- // First, search backwards to the instruction that defines VPR
149
- auto *Def = RDA->getReachingMIDef (MI, ARM::VPR);
150
- if (!Def)
151
- return nullptr ;
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
+ }
152
151
153
- // Now check that Def is a VCMP
154
- if (!(NewOpcode = VCMPOpcodeToVPT (Def->getOpcode ())))
152
+ if (CmpMI == MI)
155
153
return nullptr ;
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 ()))
154
+ NewOpcode = VCMPOpcodeToVPT (CmpMI->getOpcode ());
155
+ if (NewOpcode == 0 )
161
156
return nullptr ;
162
157
163
- return Def;
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))
161
+ return nullptr ;
162
+ if (registerDefinedBetween (CmpMI->getOperand (2 ).getReg (), std::next (CmpMI),
163
+ MI, TRI))
164
+ return nullptr ;
165
+ return &*CmpMI;
164
166
}
165
167
166
168
bool MVEVPTBlock::InsertVPTBlocks (MachineBasicBlock &Block) {
@@ -228,7 +230,7 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) {
228
230
// a VPST directly
229
231
MachineInstrBuilder MIBuilder;
230
232
unsigned NewOpcode;
231
- MachineInstr *VCMP = findVCMPToFoldIntoVPST (MI, RDA , NewOpcode);
233
+ MachineInstr *VCMP = findVCMPToFoldIntoVPST (MI, TRI , NewOpcode);
232
234
if (VCMP) {
233
235
LLVM_DEBUG (dbgs () << " folding VCMP into VPST: " ; VCMP->dump ());
234
236
MIBuilder = BuildMI (Block, MI, dl, TII->get (NewOpcode));
@@ -258,7 +260,7 @@ bool MVEVPTBlock::runOnMachineFunction(MachineFunction &Fn) {
258
260
return false ;
259
261
260
262
TII = static_cast <const Thumb2InstrInfo *>(STI.getInstrInfo ());
261
- RDA = &getAnalysis<ReachingDefAnalysis> ();
263
+ TRI = STI. getRegisterInfo ();
262
264
263
265
LLVM_DEBUG (dbgs () << " ********** ARM MVE VPT BLOCKS **********\n "
264
266
<< " ********** Function: " << Fn.getName () << ' \n ' );
0 commit comments