@@ -2655,22 +2655,35 @@ const unsigned *PPCInstrInfo::getLoadOpcodesForSpillArray() const {
2655
2655
return LoadSpillOpcodesArray[getSpillTarget ()];
2656
2656
}
2657
2657
2658
- void PPCInstrInfo::fixupIsDeadOrKill (MachineInstr & StartMI, MachineInstr & EndMI,
2658
+ void PPCInstrInfo::fixupIsDeadOrKill (MachineInstr * StartMI, MachineInstr * EndMI,
2659
2659
unsigned RegNo) const {
2660
2660
// Conservatively clear kill flag for the register if the instructions are in
2661
2661
// different basic blocks and in SSA form, because the kill flag may no longer
2662
2662
// be right. There is no need to bother with dead flags since defs with no
2663
2663
// uses will be handled by DCE.
2664
- MachineRegisterInfo &MRI = StartMI. getParent ()->getParent ()->getRegInfo ();
2665
- if (MRI.isSSA () && (StartMI. getParent () != EndMI. getParent ())) {
2664
+ MachineRegisterInfo &MRI = StartMI-> getParent ()->getParent ()->getRegInfo ();
2665
+ if (MRI.isSSA () && (StartMI-> getParent () != EndMI-> getParent ())) {
2666
2666
MRI.clearKillFlags (RegNo);
2667
2667
return ;
2668
2668
}
2669
2669
2670
2670
// Instructions between [StartMI, EndMI] should be in same basic block.
2671
- assert ((StartMI. getParent () == EndMI. getParent ()) &&
2671
+ assert ((StartMI-> getParent () == EndMI-> getParent ()) &&
2672
2672
" Instructions are not in same basic block" );
2673
2673
2674
+ // If before RA, StartMI may be def through COPY, we need to adjust it to the
2675
+ // real def. See function getForwardingDefMI.
2676
+ if (MRI.isSSA ()) {
2677
+ bool Reads, Writes;
2678
+ std::tie (Reads, Writes) = StartMI->readsWritesVirtualRegister (RegNo);
2679
+ if (!Reads && !Writes) {
2680
+ assert (Register::isVirtualRegister (RegNo) &&
2681
+ " Must be a virtual register" );
2682
+ // Get real def and ignore copies.
2683
+ StartMI = MRI.getVRegDef (RegNo);
2684
+ }
2685
+ }
2686
+
2674
2687
bool IsKillSet = false ;
2675
2688
2676
2689
auto clearOperandKillInfo = [=] (MachineInstr &MI, unsigned Index) {
@@ -2683,21 +2696,21 @@ void PPCInstrInfo::fixupIsDeadOrKill(MachineInstr &StartMI, MachineInstr &EndMI,
2683
2696
// Set killed flag for EndMI.
2684
2697
// No need to do anything if EndMI defines RegNo.
2685
2698
int UseIndex =
2686
- EndMI. findRegisterUseOperandIdx (RegNo, false , &getRegisterInfo ());
2699
+ EndMI-> findRegisterUseOperandIdx (RegNo, false , &getRegisterInfo ());
2687
2700
if (UseIndex != -1 ) {
2688
- EndMI. getOperand (UseIndex).setIsKill (true );
2701
+ EndMI-> getOperand (UseIndex).setIsKill (true );
2689
2702
IsKillSet = true ;
2690
2703
// Clear killed flag for other EndMI operands related to RegNo. In some
2691
2704
// upexpected cases, killed may be set multiple times for same register
2692
2705
// operand in same MI.
2693
- for (int i = 0 , e = EndMI. getNumOperands (); i != e; ++i)
2706
+ for (int i = 0 , e = EndMI-> getNumOperands (); i != e; ++i)
2694
2707
if (i != UseIndex)
2695
- clearOperandKillInfo (EndMI, i);
2708
+ clearOperandKillInfo (* EndMI, i);
2696
2709
}
2697
2710
2698
2711
// Walking the inst in reverse order (EndMI -> StartMI].
2699
- MachineBasicBlock::reverse_iterator It = EndMI;
2700
- MachineBasicBlock::reverse_iterator E = EndMI. getParent ()->rend ();
2712
+ MachineBasicBlock::reverse_iterator It = * EndMI;
2713
+ MachineBasicBlock::reverse_iterator E = EndMI-> getParent ()->rend ();
2701
2714
// EndMI has been handled above, skip it here.
2702
2715
It++;
2703
2716
MachineOperand *MO = nullptr ;
@@ -2723,13 +2736,13 @@ void PPCInstrInfo::fixupIsDeadOrKill(MachineInstr &StartMI, MachineInstr &EndMI,
2723
2736
} else if ((MO = It->findRegisterDefOperand (RegNo, false , true ,
2724
2737
&getRegisterInfo ()))) {
2725
2738
// No use found, set dead for its def.
2726
- assert (&*It == & StartMI && " No new def between StartMI and EndMI." );
2739
+ assert (&*It == StartMI && " No new def between StartMI and EndMI." );
2727
2740
MO->setIsDead (true );
2728
2741
break ;
2729
2742
}
2730
2743
}
2731
2744
2732
- if ((&*It) == & StartMI)
2745
+ if ((&*It) == StartMI)
2733
2746
break ;
2734
2747
}
2735
2748
// Ensure RegMo liveness is killed after EndMI.
@@ -3860,7 +3873,7 @@ bool PPCInstrInfo::simplifyToLI(MachineInstr &MI, MachineInstr &DefMI,
3860
3873
// ForwardingOperandReg = LI imm1
3861
3874
// y = op2 imm2, ForwardingOperandReg(killed)
3862
3875
if (IsForwardingOperandKilled)
3863
- fixupIsDeadOrKill (DefMI, MI, ForwardingOperandReg);
3876
+ fixupIsDeadOrKill (& DefMI, & MI, ForwardingOperandReg);
3864
3877
3865
3878
LLVM_DEBUG (dbgs () << " With:\n " );
3866
3879
LLVM_DEBUG (MI.dump ());
@@ -3952,9 +3965,9 @@ bool PPCInstrInfo::transformToNewImmFormFedByAdd(
3952
3965
3953
3966
// Update kill flag
3954
3967
if (RegMO->isKill () || IsKilledFor (RegMO->getReg ()))
3955
- fixupIsDeadOrKill (DefMI, MI, RegMO->getReg ());
3968
+ fixupIsDeadOrKill (& DefMI, & MI, RegMO->getReg ());
3956
3969
if (ForwardKilledOperandReg != ~0U )
3957
- fixupIsDeadOrKill (DefMI, MI, ForwardKilledOperandReg);
3970
+ fixupIsDeadOrKill (& DefMI, & MI, ForwardKilledOperandReg);
3958
3971
}
3959
3972
3960
3973
LLVM_DEBUG (dbgs () << " With:\n " );
@@ -4065,12 +4078,12 @@ bool PPCInstrInfo::transformToImmFormFedByAdd(
4065
4078
// x = ADD reg(killed), imm
4066
4079
// y = XOP 0, x
4067
4080
if (IsFwdFeederRegKilled || RegMO->isKill ())
4068
- fixupIsDeadOrKill (DefMI, MI, RegMO->getReg ());
4081
+ fixupIsDeadOrKill (& DefMI, & MI, RegMO->getReg ());
4069
4082
// Pattern 3:
4070
4083
// ForwardKilledOperandReg = ADD reg, imm
4071
4084
// y = XOP 0, ForwardKilledOperandReg(killed)
4072
4085
if (ForwardKilledOperandReg != ~0U )
4073
- fixupIsDeadOrKill (DefMI, MI, ForwardKilledOperandReg);
4086
+ fixupIsDeadOrKill (& DefMI, & MI, ForwardKilledOperandReg);
4074
4087
4075
4088
LLVM_DEBUG (dbgs () << " With:\n " );
4076
4089
LLVM_DEBUG (MI.dump ());
@@ -4226,7 +4239,7 @@ bool PPCInstrInfo::transformToImmFormFedByLI(MachineInstr &MI,
4226
4239
// ForwardKilledOperandReg = LI imm
4227
4240
// y = XOP reg, ForwardKilledOperandReg(killed)
4228
4241
if (ForwardKilledOperandReg != ~0U )
4229
- fixupIsDeadOrKill (DefMI, MI, ForwardKilledOperandReg);
4242
+ fixupIsDeadOrKill (& DefMI, & MI, ForwardKilledOperandReg);
4230
4243
return true ;
4231
4244
}
4232
4245
0 commit comments