@@ -12731,23 +12731,37 @@ void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12731
12731
// increase in virtreg number from there. If a callbr has no outputs, then it
12732
12732
// should not have a corresponding callbr landingpad; in fact, the callbr
12733
12733
// landingpad would not even be able to refer to such a callbr.
12734
- static Register FollowCopyChain (MachineRegisterInfo &MRI, Register Reg) {
12734
+ static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg,
12735
+ MachineBasicBlock *CallBrMBB) {
12735
12736
MachineInstr *MI = MRI.def_begin(Reg)->getParent();
12736
12737
// There is definitely at least one copy.
12737
12738
assert(MI->getOpcode() == TargetOpcode::COPY &&
12738
12739
"start of copy chain MUST be COPY");
12739
12740
Reg = MI->getOperand(1).getReg();
12741
+
12742
+ // If the copied register in the first copy must be virtual.
12743
+ assert(Reg.isVirtual() && "expected COPY of virtual register");
12740
12744
MI = MRI.def_begin(Reg)->getParent();
12745
+
12741
12746
// There may be an optional second copy.
12742
12747
if (MI->getOpcode() == TargetOpcode::COPY) {
12743
12748
assert(Reg.isVirtual() && "expected COPY of virtual register");
12744
12749
Reg = MI->getOperand(1).getReg();
12745
12750
assert(Reg.isPhysical() && "expected COPY of physical register");
12746
- MI = MRI.def_begin (Reg)->getParent ();
12751
+
12752
+ // Look for the machine callbr instruction.
12753
+ for (auto Def : MRI.def_operands(Reg))
12754
+ if (Def.getParent()->getOpcode() == TargetOpcode::INLINEASM_BR &&
12755
+ Def.getParent()->getParent() == CallBrMBB) {
12756
+ MI = Def.getParent();
12757
+ break;
12758
+ }
12747
12759
}
12760
+
12748
12761
// The start of the chain must be an INLINEASM_BR.
12749
12762
assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
12750
12763
"end of copy chain MUST be INLINEASM_BR");
12764
+
12751
12765
return Reg;
12752
12766
}
12753
12767
@@ -12766,6 +12780,7 @@ void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12766
12780
MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
12767
12781
12768
12782
Register InitialDef = FuncInfo.ValueMap[CBR];
12783
+ MachineBasicBlock *CallBrMBB = FuncInfo.getMBB(CBR->getParent());
12769
12784
SDValue Chain = DAG.getRoot();
12770
12785
12771
12786
// Re-parse the asm constraints string.
@@ -12789,7 +12804,7 @@ void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12789
12804
// getRegistersForValue may produce 1 to many registers based on whether
12790
12805
// the OpInfo.ConstraintVT is legal on the target or not.
12791
12806
for (Register &Reg : OpInfo.AssignedRegs.Regs) {
12792
- Register OriginalDef = FollowCopyChain (MRI, InitialDef++);
12807
+ Register OriginalDef = FollowCopyChain(MRI, InitialDef++, CallBrMBB );
12793
12808
if (OriginalDef.isPhysical())
12794
12809
FuncInfo.MBB->addLiveIn(OriginalDef);
12795
12810
// Update the assigned registers to use the original defs.
0 commit comments