mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-27 12:26:08 +00:00
[FastISel][AArch64] Use the correct register class for branches.
Also constrain the register class for branches. This fixes rdar://problem/18181496. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216804 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2182,15 +2182,16 @@ bool AArch64FastISel::FastLowerCall(CallLoweringInfo &CLI) {
|
|||||||
// Issue the call.
|
// Issue the call.
|
||||||
MachineInstrBuilder MIB;
|
MachineInstrBuilder MIB;
|
||||||
if (CM == CodeModel::Small) {
|
if (CM == CodeModel::Small) {
|
||||||
unsigned CallOpc = Addr.getReg() ? AArch64::BLR : AArch64::BL;
|
const MCInstrDesc &II = TII.get(Addr.getReg() ? AArch64::BLR : AArch64::BL);
|
||||||
MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(CallOpc));
|
MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II);
|
||||||
if (SymName)
|
if (SymName)
|
||||||
MIB.addExternalSymbol(SymName, 0);
|
MIB.addExternalSymbol(SymName, 0);
|
||||||
else if (Addr.getGlobalValue())
|
else if (Addr.getGlobalValue())
|
||||||
MIB.addGlobalAddress(Addr.getGlobalValue(), 0, 0);
|
MIB.addGlobalAddress(Addr.getGlobalValue(), 0, 0);
|
||||||
else if (Addr.getReg())
|
else if (Addr.getReg()) {
|
||||||
MIB.addReg(Addr.getReg());
|
unsigned Reg = constrainOperandRegClass(II, Addr.getReg(), 0);
|
||||||
else
|
MIB.addReg(Reg);
|
||||||
|
} else
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
unsigned CallReg = 0;
|
unsigned CallReg = 0;
|
||||||
@@ -2214,8 +2215,9 @@ bool AArch64FastISel::FastLowerCall(CallLoweringInfo &CLI) {
|
|||||||
if (!CallReg)
|
if (!CallReg)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
const MCInstrDesc &II = TII.get(AArch64::BLR);
|
||||||
TII.get(AArch64::BLR)).addReg(CallReg);
|
CallReg = constrainOperandRegClass(II, CallReg, 0);
|
||||||
|
MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II).addReg(CallReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add implicit physical register uses to the call.
|
// Add implicit physical register uses to the call.
|
||||||
|
@@ -252,3 +252,18 @@ define void @call_arguments9(i8 %a1, i16 %a2, i32 %a3, i64 %a4, float %a5, doubl
|
|||||||
; CHECK-LABEL: call_arguments9
|
; CHECK-LABEL: call_arguments9
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Test that we use the correct register class for the branch.
|
||||||
|
define void @call_blr(i64 %Fn, i1 %c) {
|
||||||
|
; CHECK-LABEL: call_blr
|
||||||
|
; CHECK: blr
|
||||||
|
br i1 %c, label %bb1, label %bb2
|
||||||
|
bb1:
|
||||||
|
%1 = inttoptr i64 %Fn to void (i64)*
|
||||||
|
br label %bb2
|
||||||
|
bb2:
|
||||||
|
%2 = phi void (i64)* [ %1, %bb1 ], [ undef, %0 ]
|
||||||
|
call void %2(i64 1)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user