mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
bugfix: sometimes the spiller puts a load between the "mov lr, pc" and "bx" of a CALL_NOLINK.
llvm-svn: 35381
This commit is contained in:
parent
64622a0ddf
commit
8b2e32de5a
@ -555,10 +555,10 @@ SDOperand ARMTargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG) {
|
||||
CallOpc = (isDirect || Subtarget->hasV5TOps())
|
||||
? ARMISD::CALL : ARMISD::CALL_NOLINK;
|
||||
}
|
||||
if (CallOpc == ARMISD::CALL_NOLINK) {
|
||||
// On CALL_NOLINK we must move PC to LR
|
||||
if (CallOpc == ARMISD::CALL_NOLINK && !Subtarget->isThumb()) {
|
||||
// implicit def LR - LR mustn't be allocated as GRP:$dst of CALL_NOLINK
|
||||
Chain = DAG.getCopyToReg(Chain, ARM::LR,
|
||||
DAG.getRegister(ARM::PC, MVT::i32), InFlag);
|
||||
DAG.getNode(ISD::UNDEF, MVT::i32), InFlag);
|
||||
InFlag = Chain.getValue(1);
|
||||
}
|
||||
|
||||
|
@ -370,6 +370,8 @@ class AI3<dag ops, string asm, list<dag> pattern>
|
||||
: I<ops, AddrMode3, Size4Bytes, IndexModeNone, asm, "", pattern>;
|
||||
class AI4<dag ops, string asm, list<dag> pattern>
|
||||
: I<ops, AddrMode4, Size4Bytes, IndexModeNone, asm, "", pattern>;
|
||||
class AIx2<dag ops, string asm, list<dag> pattern>
|
||||
: I<ops, AddrModeNone, Size8Bytes, IndexModeNone, asm, "", pattern>;
|
||||
class AI1x2<dag ops, string asm, list<dag> pattern>
|
||||
: I<ops, AddrMode1, Size8Bytes, IndexModeNone, asm, "", pattern>;
|
||||
|
||||
@ -546,9 +548,9 @@ let isCall = 1, noResults = 1,
|
||||
[(ARMcall GPR:$dst)]>, Requires<[IsARM, HasV5T]>;
|
||||
let Uses = [LR] in {
|
||||
// ARMv4T
|
||||
def BX : AI<(ops GPR:$dst, variable_ops),
|
||||
"bx $dst",
|
||||
[(ARMcall_nolink GPR:$dst)]>;
|
||||
def BX : AIx2<(ops GPR:$dst, variable_ops),
|
||||
"mov lr, pc\n\tbx $dst",
|
||||
[(ARMcall_nolink GPR:$dst)]>;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -189,12 +189,10 @@ let isCall = 1, noResults = 1,
|
||||
def tBLXr : TI<(ops GPR:$dst, variable_ops),
|
||||
"blx $dst",
|
||||
[(ARMtcall GPR:$dst)]>, Requires<[HasV5T]>;
|
||||
let Uses = [LR] in {
|
||||
// ARMv4T
|
||||
def tBX : TI<(ops GPR:$dst, variable_ops),
|
||||
"bx $dst",
|
||||
// ARMv4T
|
||||
def tBX : TIx2<(ops GPR:$dst, variable_ops),
|
||||
"cpy lr, pc\n\tbx $dst",
|
||||
[(ARMcall_nolink GPR:$dst)]>;
|
||||
}
|
||||
}
|
||||
|
||||
let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
|
||||
|
Loading…
Reference in New Issue
Block a user