rtl.h (struct rtx_def): Add a comment for member unchanging.
authorVladimir Makarov <vmakarov@redhat.com>
Sun, 28 Oct 2012 20:02:59 +0000 (20:02 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Sun, 28 Oct 2012 20:02:59 +0000 (20:02 +0000)
2012-10-28  Vladimir Makarov  <vmakarov@redhat.com>

* rtl.h (struct rtx_def): Add a comment for member unchanging.
* lra-int.h (LRA_TEMP_CLOBBER_P): New macro.
(lra_hard_reg_substitution): Rename to lra_final_code_change.
* lra-constraints.c (match_reload): Mark temporary clobbers.
* lra-spill.c (lra_hard_reg_substitution): Rename to
lra_final_code_change.  Remove temporary clobbers.
* lra.c (lra): Rename to lra_final_code_change.

From-SVN: r192897

gcc/ChangeLog
gcc/lra-constraints.c
gcc/lra-int.h
gcc/lra-spills.c
gcc/lra.c
gcc/rtl.h

index 1e30bc1e7eaf3173fd8f17982eea4d28138cd1ce..e3119c22a52da5d8cf59002ea0ecd4af92acb00e 100644 (file)
@@ -1,3 +1,13 @@
+2012-10-28  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * rtl.h (struct rtx_def): Add a comment for member unchanging.
+       * lra-int.h (LRA_TEMP_CLOBBER_P): New macro.
+       (lra_hard_reg_substitution): Rename to lra_final_code_change.
+       * lra-constraints.c (match_reload): Mark temporary clobbers.
+       * lra-spill.c (lra_hard_reg_substitution): Rename to
+       lra_final_code_change.  Remove temporary clobbers.
+       * lra.c (lra): Rename to lra_final_code_change.
+
 2012-10-28  Jan Hubicka  <jh@suse.cz>
 
        * gcc.dg/ipa/inlinehint-3.c: New testcase.
index 9e4d3b1f6def1946af7ce69d4465c433c1579f0f..4b3dbc01ec30e4646e96ec04a30cb0662bbee2d7 100644 (file)
@@ -663,7 +663,7 @@ match_reload (signed char out, signed char *ins, enum reg_class goal_class,
              rtx *before, rtx *after)
 {
   int i, in;
-  rtx new_in_reg, new_out_reg, reg;
+  rtx new_in_reg, new_out_reg, reg, clobber;
   enum machine_mode inmode, outmode;
   rtx in_rtx = *curr_id->operand_loc[ins[0]];
   rtx out_rtx = *curr_id->operand_loc[out];
@@ -694,8 +694,10 @@ match_reload (signed char out, signed char *ins, enum reg_class goal_class,
            new_in_reg = gen_rtx_SUBREG (inmode, reg, 0);
          /* NEW_IN_REG is non-paradoxical subreg.  We don't want
             NEW_OUT_REG living above.  We add clobber clause for
-            this.  */
-         emit_clobber (new_out_reg);
+            this.  This is just a temporary clobber.  We can remove
+            it at the end of LRA work.  */
+         clobber = emit_clobber (new_out_reg);
+         LRA_TEMP_CLOBBER_P (PATTERN (clobber)) = 1;
        }
     }
   else
index f88145b7e73d3f52f88f3e47085ac972358a363d..8a9865087d084528de69e13a1ac57465e7807dfe 100644 (file)
@@ -241,6 +241,10 @@ struct lra_insn_recog_data
 
 typedef struct lra_insn_recog_data *lra_insn_recog_data_t;
 
+/* Whether the clobber is used temporary in LRA.  */
+#define LRA_TEMP_CLOBBER_P(x) \
+  (RTL_FLAG_CHECK1 ("TEMP_CLOBBER_P", (x), CLOBBER)->unchanging)
+
 /* lra.c: */
 
 extern FILE *lra_dump_file;
@@ -346,7 +350,7 @@ extern bool lra_coalesce (void);
 
 extern bool lra_need_for_spills_p (void);
 extern void lra_spill (void);
-extern void lra_hard_reg_substitution (void);
+extern void lra_final_code_change (void);
 
 
 /* lra-elimination.c: */
index 8ff91d811394436a9c6303ffb31dcc0f95f2c397..af21c480f7771f3e4b61fe2ac39f77e98cc53bda 100644 (file)
@@ -614,13 +614,13 @@ alter_subregs (rtx *loc, bool final_p)
 }
 
 /* Final change of pseudos got hard registers into the corresponding
-   hard registers.  */
+   hard registers and removing temporary clobbers.  */
 void
-lra_hard_reg_substitution (void)
+lra_final_code_change (void)
 {
   int i, hard_regno;
   basic_block bb;
-  rtx insn;
+  rtx insn, curr;
   int max_regno = max_reg_num ();
 
   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -628,9 +628,21 @@ lra_hard_reg_substitution (void)
        && (hard_regno = lra_get_regno_hard_regno (i)) >= 0)
       SET_REGNO (regno_reg_rtx[i], hard_regno);
   FOR_EACH_BB (bb)
-    FOR_BB_INSNS (bb, insn)
+    FOR_BB_INSNS_SAFE (bb, insn, curr)
       if (INSN_P (insn))
        {
+         rtx pat = PATTERN (insn);
+
+         if (GET_CODE (pat) == CLOBBER && LRA_TEMP_CLOBBER_P (pat))
+           {
+             /* Remove clobbers temporarily created in LRA.  We don't
+                need them anymore and don't want to waste compiler
+                time processing them in a few subsequent passes.  */
+             lra_invalidate_insn_data (insn);
+             remove_insn (insn);
+             continue;
+           }
+
          lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
          bool insn_change_p = false;
 
index a56da78380b56e224a095b7d9909d869bac67181..9c4e5bf5cfed0a6a19433d616dae8ac819fafdc3 100644 (file)
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -2334,7 +2334,7 @@ lra (FILE *f)
     }
   restore_scratches ();
   lra_eliminate (true);
-  lra_hard_reg_substitution ();
+  lra_final_code_change ();
   lra_in_progress = 0;
   lra_clear_live_ranges ();
   lra_live_ranges_finish ();
index 43a49c44ed7c412ac63f502aedc45d6212785401..4ee27d99cfec485dd5373932b820dcda5cb28d63 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -283,7 +283,8 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"),
      1 in a NOTE, or EXPR_LIST for a const call.
      1 in a JUMP_INSN of an annulling branch.
      1 in a CONCAT is VAL_EXPR_IS_CLOBBERED in var-tracking.c.
-     1 in a preserved VALUE is PRESERVED_VALUE_P in cselib.c.  */
+     1 in a preserved VALUE is PRESERVED_VALUE_P in cselib.c.
+     1 in a clobber temporarily created for LRA.  */
   unsigned int unchanging : 1;
   /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is volatile.
      1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE