summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-08-11 11:17:04 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-08-11 14:32:11 -0700
commit78ed00c779cc1716d587becf19876a11be3d8121 (patch)
tree45076441528dcc5f1693cf4a3001b5236d03ca83
parent0eb79e8b9e076e5b9656d10f9a8db39a3d120370 (diff)
downloadgcc-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.c36
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;
}