http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54961



--- Comment #2 from Steven Bosscher <steven at gcc dot gnu.org> 2012-10-19 
21:57:54 UTC ---

Something I'm going to test:



Index: ira-lives.c

===================================================================

--- ira-lives.c (revision 192571)

+++ ira-lives.c (working copy)

@@ -1373,6 +1373,19 @@ process_bb_node_lives (ira_loop_tree_nod

       if (bb_has_abnormal_pred (bb))

        {

 #ifdef STACK_REGS

+         /* Mark all stack mode registers and stack hard registers live

+            so that they will conflict and allocation across the abnormal

+            edge is impossible.

+            Stack registers must be treated as live in the traditional,

+            DF_LR-like sense, because compensation code may have to be

+            introduced on edges.  The register allocator treats the stack

+            registers like all other, non-stack registers.  It doesn't

+            know that stack shuffling may be required and may allocate

+            a partially available stack reg in ways that result in the

+            need for compensation code on abnormal edges.  See PR54961.  */

+         EXECUTE_IF_SET_IN_BITMAP (DF_LR_IN (bb), FIRST_PSEUDO_REGISTER, j,

bi)

+           if (IS_STACK_MODE (GET_MODE (regno_reg_rtx[j])))

+             mark_pseudo_regno_live (j);

          EXECUTE_IF_SET_IN_SPARSESET (objects_live, px)

            { 

              ira_allocno_t a = OBJECT_ALLOCNO (ira_object_id_map[px]);

Reply via email to