Skip to content

Commit 1caeb5d

Browse files
committed
added swap for imm values and global values
1 parent 37ce3c2 commit 1caeb5d

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2742,6 +2742,50 @@ static MachineInstr *swapRegAndNonRegOperand(MachineInstr &MI,
27422742
return &MI;
27432743
}
27442744

2745+
static MachineInstr *swapNonRegOperands(MachineInstr &MI,
2746+
MachineOperand &NonRegOp1,
2747+
MachineOperand &NonRegOp2) {
2748+
if (NonRegOp1.isImm() && NonRegOp2.isImm()){
2749+
auto TargetFlags = NonRegOp1.getTargetFlags();
2750+
auto NonRegVal = NonRegOp1.getImm();
2751+
2752+
NonRegOp1.setImm(NonRegOp2.getImm());
2753+
NonRegOp2.setImm(NonRegVal);
2754+
NonRegOp1.setTargetFlags(NonRegOp2.getTargetFlags());
2755+
NonRegOp2.setTargetFlags(TargetFlags);
2756+
}
2757+
// --> Still working on the FrameInfo case :)
2758+
// else if (NonRegOp1.isFI() && NonRegOp2.isFI()){
2759+
// auto TargetFlags = NonRegOp 1.getTargetFlags();
2760+
// auto FrameIndex = NonRegOp1.getIndex();
2761+
// NonRegOp1.ChangeToFrameIndex(NonRegOp2.getIndex());
2762+
// NonRegOp2.ChangeToFrameIndex(FrameIndex);
2763+
// NonRegOp1.setTargetFlags(NonRegOp2.getTargetFlags());
2764+
// NonRegOp2.setTargetFlags(TargetFlags);
2765+
// }
2766+
else if (NonRegOp1.isGlobal() && NonRegOp2.isImm()){
2767+
auto TargetFlags = NonRegOp1.getTargetFlags();
2768+
auto GlobalVal = NonRegOp1.getGlobal();
2769+
auto GlobalOffset = NonRegOp1.getOffset();
2770+
NonRegOp1.ChangeToImmediate(NonRegOp2.getImm());
2771+
NonRegOp1.setTargetFlags(NonRegOp2.getTargetFlags());
2772+
NonRegOp2.ChangeToGA(GlobalVal, GlobalOffset, TargetFlags);
2773+
NonRegOp2.setTargetFlags(TargetFlags);
2774+
}
2775+
else if (NonRegOp1.isImm() && NonRegOp2.isGlobal()){
2776+
auto TargetFlags = NonRegOp2.getTargetFlags();
2777+
auto GlobalVal = NonRegOp2.getGlobal();
2778+
auto GlobalOffset = NonRegOp2.getOffset();
2779+
NonRegOp2.ChangeToImmediate(NonRegOp1.getImm());
2780+
NonRegOp2.setTargetFlags(NonRegOp1.getTargetFlags());
2781+
NonRegOp1.ChangeToGA(GlobalVal, GlobalOffset, TargetFlags);
2782+
NonRegOp1.setTargetFlags(TargetFlags);
2783+
}
2784+
else
2785+
return nullptr;
2786+
return &MI;
2787+
}
2788+
27452789
MachineInstr *SIInstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
27462790
unsigned Src0Idx,
27472791
unsigned Src1Idx) const {
@@ -2780,8 +2824,7 @@ MachineInstr *SIInstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
27802824
if (isOperandLegal(MI, Src1Idx, &Src0))
27812825
CommutedMI = swapRegAndNonRegOperand(MI, Src1, Src0);
27822826
} else {
2783-
// FIXME: Found two non registers to commute. This does happen.
2784-
return nullptr;
2827+
CommutedMI = swapNonRegOperands(MI, Src1, Src0);
27852828
}
27862829

27872830
if (CommutedMI) {

0 commit comments

Comments
 (0)