Skip to content

Commit bfc07e5

Browse files
committed
Fix return value calculation
Upon calculating NewSP we end up with a biased SP again, so we need to account for that in NewVal return.
1 parent cc2a061 commit bfc07e5

File tree

3 files changed

+7
-9
lines changed

3 files changed

+7
-9
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,18 +2819,16 @@ static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
28192819
regSpillArea = 96;
28202820
}
28212821

2822-
// If we are allocating overaligned memory then the bias is already accounted
2823-
// for in AlignedPtr calculation, so:
2824-
// - We do not need to adjust the regSpillArea; but
2825-
// - We do need to decrement AlignedPtr by bias to obtain the new SP.
2826-
regSpillArea += IsOveraligned ? 0 : Bias;
2822+
// If we are allocating overaligned memory then the AlignedPtr calculation
2823+
// adds the bias into SP, so we need to restore biased SP by decrementing
2824+
// AlignedPtr back here.
28272825
SDValue NewSP =
28282826
DAG.getNode(ISD::SUB, dl, VT, AlignedPtr,
28292827
DAG.getConstant(IsOveraligned ? Bias : 0, dl, VT));
28302828
Chain = DAG.getCopyToReg(SP.getValue(1), dl, SPReg, NewSP);
28312829

28322830
SDValue NewVal = DAG.getNode(ISD::ADD, dl, VT, NewSP,
2833-
DAG.getConstant(regSpillArea, dl, VT));
2831+
DAG.getConstant(regSpillArea + Bias, dl, VT));
28342832
SDValue Ops[2] = { NewVal, Chain };
28352833
return DAG.getMergeValues(Ops, dl);
28362834
}

llvm/test/CodeGen/SPARC/alloca-align.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ define void @variable_alloca_with_overalignment(i32 %num) nounwind {
2525
; CHECK64-NEXT: add %sp, 1967, %i1
2626
; CHECK64-NEXT: and %i1, -64, %i1
2727
; CHECK64-NEXT: add %i1, -2047, %sp
28-
; CHECK64-NEXT: add %i1, -1919, %o0
28+
; CHECK64-NEXT: add %i1, 128, %o0
2929
; CHECK64-NEXT: srl %i0, 0, %i0
3030
; CHECK64-NEXT: add %i0, 15, %i0
3131
; CHECK64-NEXT: sethi 4194303, %i1
@@ -82,7 +82,7 @@ define void @variable_alloca_with_overalignment_2(i32 %num) nounwind {
8282
; CHECK64-NEXT: add %i0, 1983, %i0
8383
; CHECK64-NEXT: and %i0, -64, %i0
8484
; CHECK64-NEXT: add %i0, -2047, %sp
85-
; CHECK64-NEXT: add %i0, -1919, %o1
85+
; CHECK64-NEXT: add %i0, 128, %o1
8686
; CHECK64-NEXT: add %sp, -48, %sp
8787
; CHECK64-NEXT: call foo
8888
; CHECK64-NEXT: mov %g0, %o0

llvm/test/CodeGen/SPARC/stack-align.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ define void @stack_realign(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %
2727
; CHECK64-NEXT: add %sp, 1967, %i0
2828
; CHECK64-NEXT: and %i0, -64, %i0
2929
; CHECK64-NEXT: add %i0, -2047, %sp
30-
; CHECK64-NEXT: add %i0, -1919, %o1
30+
; CHECK64-NEXT: add %i0, 128, %o1
3131
; CHECK64-NEXT: add %sp, -48, %sp
3232
; CHECK64-NEXT: call stack_realign_helper
3333
; CHECK64-NEXT: ld [%fp+2227], %o0

0 commit comments

Comments
 (0)