diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-08-11 11:17:04 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-08-11 14:32:11 -0700 |
commit | 78ed00c779cc1716d587becf19876a11be3d8121 (patch) | |
tree | 45076441528dcc5f1693cf4a3001b5236d03ca83 | |
parent | 0eb79e8b9e076e5b9656d10f9a8db39a3d120370 (diff) | |
download | gcc-hjl/pr81820/master.tar.gz |
i386: Replace frame pointer with stack pointer in debug insnshjl/pr81820/master
When we eliminate frame pointer, we should also replace frame pointer
with stack pointer - UNITS_PER_WORD in debug insns. This patch fixed:
FAIL: gcc.dg/guality/pr58791-5.c -Os line pr58791-5.c:20 b1 == 9
FAIL: gcc.dg/guality/pr58791-5.c -Os line pr58791-5.c:20 b2 == 73
FAIL: gcc.dg/guality/pr58791-5.c -Os line pr58791-5.c:20 b3 == 585
FAIL: gcc.dg/guality/pr58791-5.c -Os line pr58791-5.c:20 b4 == 4681
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:17 s1.f == 5.0
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:17 s1.g == 6.0
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:17 s2.g == 6.0
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:20 s1.f == 5.0
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:20 s1.g == 6.0
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:20 s2.f == 5.0
FAIL: gcc.dg/guality/pr59776.c -Os line pr59776.c:20 s2.g == 6.0
on Linux/i386.
PR target/81820
* config/i386/i386.c (ix86_finalize_stack_frame_flags): Replace
frame pointer with stack pointer - UNITS_PER_WORD in debug insns.
-rw-r--r-- | gcc/config/i386/i386.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b04321a8d40..0094f2c4441 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -14281,6 +14281,42 @@ ix86_finalize_stack_frame_flags (void) df_scan_blocks (); df_compute_regs_ever_live (true); df_analyze (); + + if (flag_var_tracking) + { + /* Since frame pointer is no longer needed, replace it with + stack pointer - UNITS_PER_WORD in debug insns. */ + df_ref ref, next; + for (ref = DF_REG_USE_CHAIN (HARD_FRAME_POINTER_REGNUM); + ref; ref = next) + { + rtx_insn *insn = DF_REF_INSN (ref); + /* Make sure the next ref is for a different instruction, + so that we're not affected by the rescan. */ + next = DF_REF_NEXT_REG (ref); + while (next && DF_REF_INSN (next) == insn) + next = DF_REF_NEXT_REG (next); + + if (DEBUG_INSN_P (insn)) + { + bool changed = false; + for (; ref != next; ref = DF_REF_NEXT_REG (ref)) + { + rtx *loc = DF_REF_LOC (ref); + if (*loc == hard_frame_pointer_rtx) + { + *loc = plus_constant (Pmode, + stack_pointer_rtx, + -UNITS_PER_WORD); + changed = true; + } + } + if (changed) + df_insn_rescan (insn); + } + } + } + recompute_frame_layout_p = true; } |