Skip to content

Commit

Permalink
[AArch64] Fixed a bug on AArch64MIPeepholeOpt
Browse files Browse the repository at this point in the history
Create new virtual register for the definition of new AND instruction and
replace old register by the new one to keep SSA form.

Differential Revision: https://reviews.llvm.org/D109963
  • Loading branch information
jaykang10 committed Oct 18, 2021
1 parent f383c53 commit 3f0b178
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions llvm/lib/Target/AArch64/AArch64MIPeepholeOpt.cpp
Expand Up @@ -127,11 +127,16 @@ bool AArch64MIPeepholeOpt::visitAND(

// Check whether AND's operand is MOV with immediate.
MachineInstr *MovMI = MRI->getUniqueVRegDef(MI.getOperand(2).getReg());
if (!MovMI)
return false;

MachineInstr *SubregToRegMI = nullptr;
// If it is SUBREG_TO_REG, check its operand.
if (MovMI->getOpcode() == TargetOpcode::SUBREG_TO_REG) {
SubregToRegMI = MovMI;
MovMI = MRI->getUniqueVRegDef(MovMI->getOperand(2).getReg());
if (!MovMI)
return false;
}

if (MovMI->getOpcode() != AArch64::MOVi32imm &&
Expand Down Expand Up @@ -165,18 +170,24 @@ bool AArch64MIPeepholeOpt::visitAND(
Register DstReg = MI.getOperand(0).getReg();
Register SrcReg = MI.getOperand(1).getReg();
Register NewTmpReg = MRI->createVirtualRegister(ANDImmRC);
Register NewDstReg = MRI->createVirtualRegister(ANDImmRC);
unsigned Opcode = (RegSize == 32) ? AArch64::ANDWri : AArch64::ANDXri;

MRI->constrainRegClass(NewTmpReg, MRI->getRegClass(SrcReg));
BuildMI(*MBB, MI, DL, TII->get(Opcode), NewTmpReg)
.addReg(SrcReg)
.addImm(Imm1Enc);

MRI->constrainRegClass(DstReg, ANDImmRC);
BuildMI(*MBB, MI, DL, TII->get(Opcode), DstReg)
MRI->constrainRegClass(NewDstReg, MRI->getRegClass(DstReg));
BuildMI(*MBB, MI, DL, TII->get(Opcode), NewDstReg)
.addReg(NewTmpReg)
.addImm(Imm2Enc);

MRI->replaceRegWith(DstReg, NewDstReg);
// replaceRegWith changes MI's definition register. Keep it for SSA form until
// deleting MI.
MI.getOperand(0).setReg(DstReg);

ToBeRemoved.insert(&MI);
if (SubregToRegMI)
ToBeRemoved.insert(SubregToRegMI);
Expand Down

0 comments on commit 3f0b178

Please sign in to comment.