Skip to content

Commit ced57f0

Browse files
committed
Rework fixupBlendComponents to simplify later reuse
1 parent e5ae3ed commit ced57f0

File tree

2 files changed

+47
-32
lines changed

2 files changed

+47
-32
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3384,21 +3384,40 @@ static MachineInstr *stripAndAccumulateOffset(const MachineRegisterInfo &MRI,
33843384
return nullptr;
33853385
}
33863386

3387-
static std::pair<Register, unsigned>
3388-
detectBlendComponents(const MachineRegisterInfo &MRI, Register Reg) {
3387+
void AArch64TargetLowering::fixupBlendComponents(
3388+
MachineInstr &MI, MachineBasicBlock *BB, MachineOperand &IntDiscOp,
3389+
MachineOperand &AddrDiscOp, const TargetRegisterClass *AddrDiscRC) const {
3390+
const TargetInstrInfo *TII = Subtarget->getInstrInfo();
3391+
MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
3392+
const DebugLoc &DL = MI.getDebugLoc();
3393+
3394+
Register AddrDisc = AddrDiscOp.getReg();
3395+
int64_t IntDisc = IntDiscOp.getImm();
3396+
3397+
assert(IntDisc == 0 && "Blend components are already expanded");
3398+
33893399
int64_t Offset = 0;
3390-
MachineInstr *MaybeBlend = stripAndAccumulateOffset(MRI, Reg, Offset);
3391-
// This should be a plain copy, without adding any offset.
3392-
if (!MaybeBlend || Offset != 0)
3393-
return std::make_pair(Reg, 0);
3400+
MachineInstr *MaybeBlend = stripAndAccumulateOffset(MRI, AddrDisc, Offset);
3401+
3402+
// Detect blend(addr, imm) which is lowered as MOVK addr, #imm, #48.
3403+
// The result of MOVK may be copied, but without adding any offset.
3404+
if (MaybeBlend && Offset == 0 && MaybeBlend->getOpcode() == AArch64::MOVKXi &&
3405+
MaybeBlend->getOperand(3).getImm() == 48) {
3406+
AddrDisc = MaybeBlend->getOperand(1).getReg();
3407+
IntDisc = MaybeBlend->getOperand(2).getImm();
3408+
}
33943409

3395-
// Detect blend(addr, imm) which is lowered as MOVK addr, #imm, 48.
3396-
if (MaybeBlend->getOpcode() != AArch64::MOVKXi ||
3397-
MaybeBlend->getOperand(3).getImm() != 48)
3398-
return std::make_pair(Reg, 0);
3410+
if (AddrDisc == AArch64::NoRegister)
3411+
AddrDisc = AArch64::XZR;
33993412

3400-
return std::make_pair(MaybeBlend->getOperand(1).getReg(),
3401-
MaybeBlend->getOperand(2).getImm());
3413+
if (AddrDisc != AArch64::XZR && MRI.getRegClass(AddrDisc) != AddrDiscRC) {
3414+
Register TmpReg = MRI.createVirtualRegister(AddrDiscRC);
3415+
BuildMI(*BB, MI, DL, TII->get(AArch64::COPY), TmpReg).addReg(AddrDisc);
3416+
AddrDisc = TmpReg;
3417+
}
3418+
3419+
AddrDiscOp.setReg(AddrDisc);
3420+
IntDiscOp.setImm(IntDisc);
34023421
}
34033422

34043423
MachineBasicBlock *
@@ -3430,26 +3449,17 @@ AArch64TargetLowering::tryRewritingPAC(MachineInstr &MI,
34303449
const GlobalValue *GV = AddrOp.getGlobal();
34313450
AddrOffset += AddrOp.getOffset();
34323451

3433-
// Analyze the discriminator operand.
3434-
Register OriginalDisc = isPACWithZeroDisc(MI.getOpcode())
3435-
? AArch64::XZR
3436-
: MI.getOperand(2).getReg();
3437-
auto [AddrDisc, IntDisc] = detectBlendComponents(MRI, OriginalDisc);
3438-
3439-
// MOVaddrPAC and LOADgotPAC pseudos are expanded so that they use X16/X17
3440-
// internally, thus their restrictions on the register class of $AddrDisc
3441-
// operand are stricter than those of MOVKXi and PAC* instructions.
3442-
if (AddrDisc != AArch64::XZR) {
3443-
Register TmpReg = MRI.createVirtualRegister(&AArch64::GPR64noipRegClass);
3444-
BuildMI(*BB, MI, DL, TII->get(AArch64::COPY), TmpReg).addReg(AddrDisc);
3445-
AddrDisc = TmpReg;
3446-
}
3447-
3448-
BuildMI(*BB, MI, DL, TII->get(NewOpcode))
3449-
.addGlobalAddress(GV, AddrOffset, TargetFlags)
3450-
.addImm(getKeyForPACOpcode(MI.getOpcode()))
3451-
.addReg(AddrDisc)
3452-
.addImm(IntDisc);
3452+
Register DiscReg = isPACWithZeroDisc(MI.getOpcode())
3453+
? AArch64::XZR
3454+
: MI.getOperand(2).getReg();
3455+
3456+
MachineInstr *NewMI = BuildMI(*BB, MI, DL, TII->get(NewOpcode))
3457+
.addGlobalAddress(GV, AddrOffset, TargetFlags)
3458+
.addImm(getKeyForPACOpcode(MI.getOpcode()))
3459+
.addReg(DiscReg)
3460+
.addImm(0);
3461+
fixupBlendComponents(*NewMI, BB, NewMI->getOperand(3), NewMI->getOperand(2),
3462+
&AArch64::GPR64noipRegClass);
34533463

34543464
BuildMI(*BB, MI, DL, TII->get(AArch64::COPY), MI.getOperand(0).getReg())
34553465
.addReg(AArch64::X16);

llvm/lib/Target/AArch64/AArch64ISelLowering.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,11 @@ class AArch64TargetLowering : public TargetLowering {
680680
MachineBasicBlock *EmitGetSMESaveSize(MachineInstr &MI,
681681
MachineBasicBlock *BB) const;
682682

683+
void fixupBlendComponents(MachineInstr &MI, MachineBasicBlock *BB,
684+
MachineOperand &IntDiscOp,
685+
MachineOperand &AddrDiscOp,
686+
const TargetRegisterClass *AddrDiscRC) const;
687+
683688
MachineBasicBlock *tryRewritingPAC(MachineInstr &MI,
684689
MachineBasicBlock *BB) const;
685690

0 commit comments

Comments
 (0)