mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
[mips] Make sure there is a chain edge dependency between loads that read
formal arguments on the stack and stores created afterwards. We need this to ensure tail call optimized function calls do not write over the argument area of the stack before it is read out. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194309 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ceb0d9c085
commit
95830221bd
@ -2650,9 +2650,11 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||||||
|
|
||||||
// Create load nodes to retrieve arguments from the stack
|
// Create load nodes to retrieve arguments from the stack
|
||||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||||
InVals.push_back(DAG.getLoad(ValVT, DL, Chain, FIN,
|
SDValue Load = DAG.getLoad(ValVT, DL, Chain, FIN,
|
||||||
MachinePointerInfo::getFixedStack(FI),
|
MachinePointerInfo::getFixedStack(FI),
|
||||||
false, false, false, 0));
|
false, false, false, 0);
|
||||||
|
InVals.push_back(Load);
|
||||||
|
OutChains.push_back(Load.getValue(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
define void @f1(i64 %ll1, float %f, i64 %ll, i32 %i, float %f2) nounwind {
|
define void @f1(i64 %ll1, float %f, i64 %ll, i32 %i, float %f2) nounwind {
|
||||||
entry:
|
entry:
|
||||||
; CHECK: move $[[R1:[0-9]+]], $5
|
; CHECK-DAG: lw $[[R2:[0-9]+]], 80($sp)
|
||||||
; CHECK: move $[[R0:[0-9]+]], $4
|
; CHECK-DAG: lw $[[R3:[0-9]+]], 84($sp)
|
||||||
; CHECK: ori $6, ${{[0-9]+}}, 3855
|
; CHECK-DAG: move $[[R1:[0-9]+]], $5
|
||||||
; CHECK: ori $7, ${{[0-9]+}}, 22136
|
; CHECK-DAG: move $[[R0:[0-9]+]], $4
|
||||||
; CHECK: lw $25, %call16(ff1)
|
; CHECK-DAG: ori $6, ${{[0-9]+}}, 3855
|
||||||
|
; CHECK-DAG: ori $7, ${{[0-9]+}}, 22136
|
||||||
|
; CHECK-DAG: lw $25, %call16(ff1)
|
||||||
; CHECK: jalr
|
; CHECK: jalr
|
||||||
tail call void @ff1(i32 %i, i64 1085102592623924856) nounwind
|
tail call void @ff1(i32 %i, i64 1085102592623924856) nounwind
|
||||||
; CHECK-DAG: lw $25, %call16(ff2)
|
; CHECK-DAG: lw $25, %call16(ff2)
|
||||||
; CHECK-DAG: lw $[[R2:[0-9]+]], 80($sp)
|
|
||||||
; CHECK-DAG: lw $[[R3:[0-9]+]], 84($sp)
|
|
||||||
; CHECK-DAG: move $4, $[[R2]]
|
; CHECK-DAG: move $4, $[[R2]]
|
||||||
; CHECK-DAG: move $5, $[[R3]]
|
; CHECK-DAG: move $5, $[[R3]]
|
||||||
; CHECK: jalr $25
|
; CHECK: jalr $25
|
||||||
|
@ -243,3 +243,16 @@ entry:
|
|||||||
ret i32 %call
|
ret i32 %call
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Check that there is a chain edge between the load and store nodes.
|
||||||
|
;
|
||||||
|
; PIC32-LABEL: caller14:
|
||||||
|
; PIC32: lw ${{[0-9]+}}, 16($sp)
|
||||||
|
; PIC32: sw $4, 16($sp)
|
||||||
|
|
||||||
|
define void @caller14(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
|
||||||
|
entry:
|
||||||
|
tail call void @callee14(i32 %e, i32 %b, i32 %c, i32 %d, i32 %a)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @callee14(i32, i32, i32, i32, i32)
|
||||||
|
Loading…
Reference in New Issue
Block a user