@@ -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+
27452789MachineInstr *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