@@ -108,6 +108,8 @@ struct BlockSplitInfo {
108108 MachineInstr *OrigBranch;
109109 MachineInstr *SplitBefore;
110110 MachineInstr *SplitCond;
111+ unsigned OrigSubreg;
112+ unsigned SplitCondSubreg;
111113 bool InvertNewBranch;
112114 bool InvertOrigBranch;
113115 bool BranchToFallThrough;
@@ -220,7 +222,7 @@ static bool splitMBB(BlockSplitInfo &BSI) {
220222 // Add the branches to ThisMBB.
221223 BuildMI (*ThisMBB, ThisMBB->end (), BSI.SplitBefore ->getDebugLoc (),
222224 TII->get (NewBROpcode))
223- .addReg (BSI.SplitCond ->getOperand (0 ).getReg ())
225+ .addReg (BSI.SplitCond ->getOperand (0 ).getReg (), 0 , BSI. SplitCondSubreg )
224226 .addMBB (NewBRTarget);
225227 BuildMI (*ThisMBB, ThisMBB->end (), BSI.SplitBefore ->getDebugLoc (),
226228 TII->get (PPC::B))
@@ -234,6 +236,7 @@ static bool splitMBB(BlockSplitInfo &BSI) {
234236 assert (FirstTerminator->getOperand (0 ).isReg () &&
235237 " Can't update condition of unconditional branch." );
236238 FirstTerminator->getOperand (0 ).setReg (BSI.NewCond ->getOperand (0 ).getReg ());
239+ FirstTerminator->getOperand (0 ).setSubReg (BSI.OrigSubreg );
237240 }
238241 if (BSI.InvertOrigBranch )
239242 FirstTerminator->setDesc (TII->get (InvertedOpcode));
@@ -471,6 +474,8 @@ PPCReduceCRLogicals::createCRLogicalOpInfo(MachineInstr &MIParam) {
471474 } else {
472475 MachineInstr *Def1 = lookThroughCRCopy (MIParam.getOperand (1 ).getReg (),
473476 Ret.SubregDef1 , Ret.CopyDefs .first );
477+ if (Ret.SubregDef1 == 0 )
478+ Ret.SubregDef1 = MIParam.getOperand (1 ).getSubReg ();
474479 assert (Def1 && " Must be able to find a definition of operand 1." );
475480 Ret.DefsSingleUse &=
476481 MRI->hasOneNonDBGUse (Def1->getOperand (0 ).getReg ());
@@ -481,6 +486,8 @@ PPCReduceCRLogicals::createCRLogicalOpInfo(MachineInstr &MIParam) {
481486 MachineInstr *Def2 = lookThroughCRCopy (MIParam.getOperand (2 ).getReg (),
482487 Ret.SubregDef2 ,
483488 Ret.CopyDefs .second );
489+ if (Ret.SubregDef2 == 0 )
490+ Ret.SubregDef2 = MIParam.getOperand (2 ).getSubReg ();
484491 assert (Def2 && " Must be able to find a definition of operand 2." );
485492 Ret.DefsSingleUse &=
486493 MRI->hasOneNonDBGUse (Def2->getOperand (0 ).getReg ());
@@ -535,26 +542,17 @@ PPCReduceCRLogicals::createCRLogicalOpInfo(MachineInstr &MIParam) {
535542MachineInstr *PPCReduceCRLogicals::lookThroughCRCopy (unsigned Reg,
536543 unsigned &Subreg,
537544 MachineInstr *&CpDef) {
538- Subreg = -1 ;
539545 if (!Register::isVirtualRegister (Reg))
540546 return nullptr ;
541547 MachineInstr *Copy = MRI->getVRegDef (Reg);
542548 CpDef = Copy;
543549 if (!Copy->isCopy ())
544550 return Copy;
545551 Register CopySrc = Copy->getOperand (1 ).getReg ();
546- Subreg = Copy->getOperand (1 ).getSubReg ();
552+ // If the copy defines a register with a subreg, set that as the Subreg.
553+ Subreg = Copy->getOperand (0 ).getSubReg ();
547554 if (!CopySrc.isVirtual ()) {
548555 const TargetRegisterInfo *TRI = &TII->getRegisterInfo ();
549- // Set the Subreg
550- if (CopySrc == PPC::CR0EQ || CopySrc == PPC::CR6EQ)
551- Subreg = PPC::sub_eq;
552- if (CopySrc == PPC::CR0LT || CopySrc == PPC::CR6LT)
553- Subreg = PPC::sub_lt;
554- if (CopySrc == PPC::CR0GT || CopySrc == PPC::CR6GT)
555- Subreg = PPC::sub_gt;
556- if (CopySrc == PPC::CR0UN || CopySrc == PPC::CR6UN)
557- Subreg = PPC::sub_un;
558556 // Loop backwards and return the first MI that modifies the physical CR Reg.
559557 MachineBasicBlock::iterator Me = Copy, B = Copy->getParent ()->begin ();
560558 while (Me != B)
@@ -682,16 +680,21 @@ bool PPCReduceCRLogicals::splitBlockOnBinaryCROp(CRLogicalOpInfo &CRI) {
682680 computeBranchTargetAndInversion (Opc, Branch->getOpcode (), UsingDef1,
683681 InvertNewBranch, InvertOrigBranch,
684682 TargetIsFallThrough);
685- MachineInstr *SplitCond =
686- UsingDef1 ? CRI.CopyDefs .second : CRI.CopyDefs .first ;
683+ MachineInstr *NewCond = CRI.CopyDefs .first ;
684+ MachineInstr *SplitCond = CRI.CopyDefs .second ;
685+ if (!UsingDef1) {
686+ std::swap (NewCond, SplitCond);
687+ std::swap (CRI.SubregDef1 , CRI.SubregDef2 );
688+ }
687689 LLVM_DEBUG (dbgs () << " We will " << (InvertNewBranch ? " invert" : " copy" ));
688690 LLVM_DEBUG (dbgs () << " the original branch and the target is the "
689691 << (TargetIsFallThrough ? " fallthrough block\n "
690692 : " orig. target block\n " ));
691693 LLVM_DEBUG (dbgs () << " Original branch instruction: " ; Branch->dump ());
692- BlockSplitInfo BSI { Branch, SplitBefore, SplitCond, InvertNewBranch,
693- InvertOrigBranch, TargetIsFallThrough, MBPI, CRI.MI ,
694- UsingDef1 ? CRI.CopyDefs .first : CRI.CopyDefs .second };
694+ BlockSplitInfo BSI{
695+ Branch, SplitBefore, SplitCond, CRI.SubregDef1 ,
696+ CRI.SubregDef2 , InvertNewBranch, InvertOrigBranch, TargetIsFallThrough,
697+ MBPI, CRI.MI , NewCond};
695698 bool Changed = splitMBB (BSI);
696699 // If we've split on a CR logical that is fed by a CR logical,
697700 // recompute the source CR logical as it may be usable for splitting.
0 commit comments