aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira.c
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-10-28 11:52:11 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2012-10-28 11:52:11 +0000
commit10e09d09ae79cf194761ddb4054ba4687670bd7a (patch)
tree33dd73f7055ebe2827ac8d5bbc019cafd1b54a0e /gcc/ira.c
parent588d995f14022d421a4f89d6ada1c5ed069169fb (diff)
PR rtl-optimization/38711
* ira.c (ira): Remove DF_LIVE if the problem is in the stack. (do_reload): Add it back at the end for -O2 and higher. * function.c (thread_prologue_and_epilogue_insns): Use REG_SET_TO_HARD_REG_SET instead of CLEAR_HARD_REG_SET and reg_set_to_hard_reg_set. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@192890 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ira.c')
-rw-r--r--gcc/ira.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ira.c b/gcc/ira.c
index 9a8b098cf48..8dcdbf57549 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -4399,6 +4399,16 @@ ira (FILE *f)
setup_prohibited_mode_move_regs ();
df_note_add_problem ();
+
+ /* DF_LIVE can't be used in the register allocator, too many other
+ parts of the compiler depend on using the "classic" liveness
+ interpretation of the DF_LR problem. See PR38711.
+ Remove the problem, so that we don't spend time updating it in
+ any of the df_analyze() calls during IRA/LRA. */
+ if (optimize > 1)
+ df_remove_problem (df_live);
+ gcc_checking_assert (df_live == NULL);
+
#ifdef ENABLE_CHECKING
df->changeable_flags |= DF_VERIFY_SCHEDULED;
#endif
@@ -4678,6 +4688,12 @@ do_reload (void)
df_scan_alloc (NULL);
df_scan_blocks ();
+ if (optimize > 1)
+ {
+ df_live_add_problem ();
+ df_live_set_all_dirty ();
+ }
+
if (optimize)
df_analyze ();