20
20
#include " X86InstrBuilder.h"
21
21
#include " X86InstrInfo.h"
22
22
#include " X86Subtarget.h"
23
- #include " llvm/CodeGen/LiveRegUnits.h"
24
23
#include " llvm/CodeGen/MachineBasicBlock.h"
25
24
#include " llvm/CodeGen/MachineFrameInfo.h"
26
25
#include " llvm/CodeGen/MachineFunction.h"
@@ -73,16 +72,10 @@ FunctionPass *llvm::createX86LowerTileCopyPass() {
73
72
bool X86LowerTileCopy::runOnMachineFunction (MachineFunction &MF) {
74
73
const X86Subtarget &ST = MF.getSubtarget <X86Subtarget>();
75
74
const X86InstrInfo *TII = ST.getInstrInfo ();
76
- const TargetRegisterInfo *TRI = ST.getRegisterInfo ();
77
- BitVector GR64Regs =
78
- TRI->getAllocatableSet (MF, TRI->getRegClass (X86::GR64RegClassID));
79
75
bool Changed = false ;
80
76
81
77
for (MachineBasicBlock &MBB : MF) {
82
- LiveRegUnits UsedRegs (*TRI);
83
- UsedRegs.addLiveOuts (MBB);
84
- for (MachineInstr &MI : llvm::make_early_inc_range (reverse (MBB))) {
85
- UsedRegs.stepBackward (MI);
78
+ for (MachineInstr &MI : llvm::make_early_inc_range (MBB)) {
86
79
if (!MI.isCopy ())
87
80
continue ;
88
81
MachineOperand &DstMO = MI.getOperand (0 );
@@ -92,41 +85,27 @@ bool X86LowerTileCopy::runOnMachineFunction(MachineFunction &MF) {
92
85
if (!X86::TILERegClass.contains (DstReg, SrcReg))
93
86
continue ;
94
87
88
+ const TargetRegisterInfo *TRI = ST.getRegisterInfo ();
95
89
// Allocate stack slot for tile register
96
90
unsigned Size = TRI->getSpillSize (X86::TILERegClass);
97
91
Align Alignment = TRI->getSpillAlign (X86::TILERegClass);
98
92
int TileSS = MF.getFrameInfo ().CreateSpillStackObject (Size , Alignment);
93
+ // Allocate stack slot for stride register
94
+ Size = TRI->getSpillSize (X86::GR64RegClass);
95
+ Alignment = TRI->getSpillAlign (X86::GR64RegClass);
96
+ int StrideSS = MF.getFrameInfo ().CreateSpillStackObject (Size , Alignment);
99
97
100
- int StrideSS = 0 ;
101
-
102
- // Pick a killed register to avoid a save/reload.
103
- Register GR64Cand = X86::NoRegister;
104
- for (auto RegT : GR64Regs.set_bits ()) {
105
- if (UsedRegs.available (RegT)) {
106
- GR64Cand = RegT;
107
- break ;
108
- }
109
- }
98
+ // TODO: Pick a killed regiter to avoid save/reload. There is problem
99
+ // to get live interval in this stage.
100
+ Register GR64Cand = X86::RAX;
110
101
111
102
const DebugLoc &DL = MI.getDebugLoc ();
112
- if (GR64Cand) {
113
- // mov 64 %reg
114
- BuildMI (MBB, MI, DL, TII->get (X86::MOV64ri), GR64Cand).addImm (64 );
115
- } else {
116
- // No available register? Save RAX and reload it after use.
117
-
118
- // Allocate stack slot for stride register
119
- Size = TRI->getSpillSize (X86::GR64RegClass);
120
- Alignment = TRI->getSpillAlign (X86::GR64RegClass);
121
- StrideSS = MF.getFrameInfo ().CreateSpillStackObject (Size , Alignment);
122
-
123
- // mov %reg (%sp)
124
- addFrameReference (BuildMI (MBB, MI, DL, TII->get (X86::MOV64mr)),
125
- StrideSS)
126
- .addReg (X86::RAX);
127
- // mov 64 %reg
128
- BuildMI (MBB, MI, DL, TII->get (X86::MOV64ri), X86::RAX).addImm (64 );
129
- }
103
+ // mov %rax (%sp)
104
+ BuildMI (MBB, MI, DL, TII->get (X86::IMPLICIT_DEF), GR64Cand);
105
+ addFrameReference (BuildMI (MBB, MI, DL, TII->get (X86::MOV64mr)), StrideSS)
106
+ .addReg (GR64Cand);
107
+ // mov 64 %rax
108
+ BuildMI (MBB, MI, DL, TII->get (X86::MOV64ri), GR64Cand).addImm (64 );
130
109
// tilestored %tmm, (%sp, %idx)
131
110
#define GET_EGPR_IF_ENABLED (OPC ) (ST.hasEGPR() ? OPC##_EVEX : OPC)
132
111
unsigned Opc = GET_EGPR_IF_ENABLED (X86::TILESTORED);
@@ -141,12 +120,10 @@ bool X86LowerTileCopy::runOnMachineFunction(MachineFunction &MF) {
141
120
#undef GET_EGPR_IF_ENABLED
142
121
NewMI = addFrameReference (BuildMI (MBB, MI, DL, TII->get (Opc), DstReg),
143
122
TileSS);
144
- if (!GR64Cand) {
145
- // restore %rax
146
- // mov (%sp) %rax
147
- addFrameReference (
148
- BuildMI (MBB, MI, DL, TII->get (X86::MOV64rm), GR64Cand), StrideSS);
149
- }
123
+ // restore %rax
124
+ // mov (%sp) %rax
125
+ addFrameReference (BuildMI (MBB, MI, DL, TII->get (X86::MOV64rm), GR64Cand),
126
+ StrideSS);
150
127
MI.eraseFromParent ();
151
128
Changed = true ;
152
129
}
0 commit comments