Skip to content

Commit b22127b

Browse files
committed
Refine the code and update test
1 parent a078f6e commit b22127b

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

llvm/lib/Target/X86/X86SuppressAPXForReloc.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,8 @@ FunctionPass *llvm::createX86SuppressAPXForRelocationPass() {
6565
return new X86SuppressAPXForRelocationPass();
6666
}
6767

68-
static void suppressEGPRRegClass(MachineFunction &MF, MachineInstr &MI,
68+
static void suppressEGPRRegClass(MachineRegisterInfo *MRI, MachineInstr &MI,
6969
const X86Subtarget &ST, unsigned int OpNum) {
70-
MachineRegisterInfo *MRI = &MF.getRegInfo();
7170
Register Reg = MI.getOperand(OpNum).getReg();
7271
if (!Reg.isVirtual()) {
7372
assert(!X86II::isApxExtendedReg(Reg) && "APX EGPR is used unexpectedly.");
@@ -77,29 +76,22 @@ static void suppressEGPRRegClass(MachineFunction &MF, MachineInstr &MI,
7776
const X86RegisterInfo *RI = ST.getRegisterInfo();
7877
const TargetRegisterClass *NewRC = RI->constrainRegClassToNonRex2(RC);
7978
MRI->setRegClass(Reg, NewRC);
79+
}
8080

81-
for (MachineInstr &Use : MRI->use_instructions(Reg)) {
82-
switch (Use.getOpcode()) {
83-
case X86::PHI: {
84-
Register DstReg = Use.getOperand(0).getReg();
85-
if (!DstReg.isVirtual()) {
86-
assert(!X86II::isApxExtendedReg(DstReg) && "APX EGPR is used unexpectedly.");
87-
return;
88-
}
89-
const TargetRegisterClass *DstRC = MRI->getRegClass(DstReg);
90-
const TargetRegisterClass *NewDstRC = RI->constrainRegClassToNonRex2(DstRC);
91-
MRI->setRegClass(DstReg, NewDstRC);
92-
break;
93-
}
94-
}
95-
}
81+
static void suppressEGPRRegClassInRegUses(MachineRegisterInfo *MRI,
82+
const X86Subtarget &ST,
83+
Register Reg) {
84+
for (MachineInstr &Use : MRI->use_instructions(Reg))
85+
if (Use.getOpcode() == X86::PHI)
86+
suppressEGPRRegClass(MRI, Use, ST, 0);
9687
}
9788

9889
static bool handleInstructionWithEGPR(MachineFunction &MF,
9990
const X86Subtarget &ST) {
10091
if (!ST.hasEGPR())
10192
return false;
10293

94+
MachineRegisterInfo *MRI = &MF.getRegInfo();
10395
auto suppressEGPRInInstrWithReloc = [&](MachineInstr &MI,
10496
ArrayRef<unsigned> OpNoArray) {
10597
int MemOpNo = X86II::getMemoryOperandNo(MI.getDesc().TSFlags) +
@@ -110,7 +102,7 @@ static bool handleInstructionWithEGPR(MachineFunction &MF,
110102
LLVM_DEBUG(dbgs() << "Transform instruction with relocation type:\n "
111103
<< MI);
112104
for (unsigned OpNo : OpNoArray)
113-
suppressEGPRRegClass(MF, MI, ST, OpNo);
105+
suppressEGPRRegClass(MRI, MI, ST, OpNo);
114106
LLVM_DEBUG(dbgs() << "to:\n " << MI << "\n");
115107
}
116108
};
@@ -133,6 +125,7 @@ static bool handleInstructionWithEGPR(MachineFunction &MF,
133125
case X86::MOV32rm:
134126
case X86::MOV64rm: {
135127
suppressEGPRInInstrWithReloc(MI, {0});
128+
suppressEGPRRegClassInRegUses(MRI, ST, MI.getOperand(0).getReg());
136129
break;
137130
}
138131
case X86::ADC32rm:
@@ -150,6 +143,7 @@ static bool handleInstructionWithEGPR(MachineFunction &MF,
150143
case X86::SUB64rm:
151144
case X86::XOR64rm: {
152145
suppressEGPRInInstrWithReloc(MI, {0, 1});
146+
suppressEGPRRegClassInRegUses(MRI, ST, MI.getOperand(0).getReg());
153147
break;
154148
}
155149
}
@@ -195,7 +189,8 @@ static bool handleNDDOrNFInstructions(MachineFunction &MF,
195189
MI.getOperand(1).setReg(Reg);
196190
const MCInstrDesc &NewDesc = TII->get(X86::ADD64rm);
197191
MI.setDesc(NewDesc);
198-
suppressEGPRRegClass(MF, MI, ST, 0);
192+
suppressEGPRRegClass(MRI, MI, ST, 0);
193+
suppressEGPRRegClassInRegUses(MRI, ST, MI.getOperand(0).getReg());
199194
MI.tieOperands(0, 1);
200195
LLVM_DEBUG(dbgs() << "to:\n " << *CopyMIB << "\n");
201196
LLVM_DEBUG(dbgs() << " " << MI << "\n");
@@ -208,7 +203,8 @@ static bool handleNDDOrNFInstructions(MachineFunction &MF,
208203
if (MO.getTargetFlags() == X86II::MO_GOTTPOFF) {
209204
LLVM_DEBUG(dbgs() << "Transform instruction with relocation type:\n "
210205
<< MI);
211-
suppressEGPRRegClass(MF, MI, ST, 0);
206+
suppressEGPRRegClass(MRI, MI, ST, 0);
207+
suppressEGPRRegClassInRegUses(MRI, ST, MI.getOperand(0).getReg());
212208
Register Reg = MRI->createVirtualRegister(&X86::GR64_NOREX2RegClass);
213209
[[maybe_unused]] MachineInstrBuilder CopyMIB =
214210
BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(TargetOpcode::COPY),

llvm/test/CodeGen/X86/apx/reloc-regclass.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ declare <8 x i32> @llvm.x86.avx2.maskload.d.256(ptr, <8 x i32>)
139139
; APX relocation which is not recognized by the builtin linker on released OS.
140140

141141
; CHECK-LABEL: test_mem_fold
142-
; NOAPXREL: movq (%rip), %r12
142+
; NOAPXREL: movq (%rip), %rbx
143143
; NOAPXREL-NEXT: R_X86_64_REX_GOTPCRELX gvar3-0x4
144144
; NOAPXREL-NOT: R_X86_64_CODE_4_GOTPCRELX gvar3-0x4
145145

0 commit comments

Comments
 (0)