cse.c (this_insn_cc0, [...]): New global variables, moved out from cse_insn.
authorSteven Bosscher <steven@gcc.gnu.org>
Sun, 17 Dec 2006 13:11:06 +0000 (13:11 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Sun, 17 Dec 2006 13:11:06 +0000 (13:11 +0000)
* cse.c (this_insn_cc0, this_insn_cc0_mode): New global
variables, moved out from cse_insn.
(prev_insn): Remove this global variable).
(new_basic_block): Don't set it.
(cse_insn): Idem. Also, move code to delete unused CC0-setter
insns and code to set prev_insn_cc0 and prev_insn_cc0_mode
from here...
(cse_extended_basic_block): ...to here.  Do not clear
prev_insn_cc0 until after recording equivalences from jumps.

From-SVN: r119984

gcc/ChangeLog
gcc/cse.c

index 3349ca493b2e297799d488c391d1d8281944dbeb..f837bb4bfa8a964d55cf2e549e25e9cbfa2baad3 100644 (file)
@@ -1,3 +1,15 @@
+2006-12-17  Steven Bosscher  <steven@gcc.gnu.org>
+
+       * cse.c (this_insn_cc0, this_insn_cc0_mode): New global
+       variables, moved out from cse_insn.
+       (prev_insn): Remove this global variable).
+       (new_basic_block): Don't set it.
+       (cse_insn): Idem. Also, move code to delete unused CC0-setter
+       insns and code to set prev_insn_cc0 and prev_insn_cc0_mode
+       from here...
+       (cse_extended_basic_block): ...to here.  Do not clear
+       prev_insn_cc0 until after recording equivalences from jumps.
+
 2006-12-16  Jan Hubicka  <jh@suse.cz>
 
        * cgraphunit.c (ipa_passes): Clear current_function_decl.
        are the left hand side, set the element's is_vector_lhs to true.
        (instantiate_element): For vector types which were on the left
        hand size, set DECL_GIMPLE_REG_P to false.
-       * tree-nested.c (create_tmp_var_for): Use the renamed DECL_GIMPLE_REG_P.        * tree-inline.c (declare_return_variable):  Use the renamed
-       DECL_GIMPLE_REG_P
-       and check for VECTOR_TYPE.
+       * tree-nested.c (create_tmp_var_for): Use the renamed
+       DECL_GIMPLE_REG_P.
+       * tree-inline.c (declare_return_variable):  Use the renamed
+       DECL_GIMPLE_REG_P and check for VECTOR_TYPE.
        (copy_decl_to_var):  Use the renamed DECL_GIMPLE_REG_P.
        (copy_result_decl_to_var): Likewise.
        * tree-vect-transform.c (vect_get_new_vect_var): For vector types,
index 015e1de66d4e471c8f71ad3cf05b0ee2ec33372c..fc6ffff11618b584eafbcae0db43e1e7e1e7f588 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -269,17 +269,13 @@ struct change_cc_mode_args
    table since its use is guaranteed to be the insn immediately following
    its definition and any other insn is presumed to invalidate it.
 
-   Instead, we store below the value last assigned to CC0.  If it should
-   happen to be a constant, it is stored in preference to the actual
-   assigned value.  In case it is a constant, we store the mode in which
-   the constant should be interpreted.  */
+   Instead, we store below the current and last value assigned to CC0.
+   If it should happen to be a constant, it is stored in preference
+   to the actual assigned value.  In case it is a constant, we store
+   the mode in which the constant should be interpreted.  */
 
-static rtx prev_insn_cc0;
-static enum machine_mode prev_insn_cc0_mode;
-
-/* Previous actual insn.  0 if at first insn of basic block.  */
-
-static rtx prev_insn;
+static rtx this_insn_cc0, prev_insn_cc0;
+static enum machine_mode this_insn_cc0_mode, prev_insn_cc0_mode;
 #endif
 
 /* Insn being scanned.  */
@@ -900,7 +896,6 @@ new_basic_block (void)
     }
 
 #ifdef HAVE_cc0
-  prev_insn = 0;
   prev_insn_cc0 = 0;
 #endif
 }
@@ -4022,8 +4017,8 @@ cse_insn (rtx insn, rtx libcall_insn)
 
 #ifdef HAVE_cc0
   /* Records what this insn does to set CC0.  */
-  rtx this_insn_cc0 = 0;
-  enum machine_mode this_insn_cc0_mode = VOIDmode;
+  this_insn_cc0 = 0;
+  this_insn_cc0_mode = VOIDmode;
 #endif
 
   rtx src_eqv = 0;
@@ -5644,20 +5639,6 @@ cse_insn (rtx insn, rtx libcall_insn)
     }
 
 done:;
-#ifdef HAVE_cc0
-  /* If the previous insn set CC0 and this insn no longer references CC0,
-     delete the previous insn.  Here we use the fact that nothing expects CC0
-     to be valid over an insn, which is true until the final pass.  */
-  if (prev_insn && NONJUMP_INSN_P (prev_insn)
-      && (tem = single_set (prev_insn)) != 0
-      && SET_DEST (tem) == cc0_rtx
-      && ! reg_mentioned_p (cc0_rtx, x))
-    delete_insn_and_edges (prev_insn);
-
-  prev_insn_cc0 = this_insn_cc0;
-  prev_insn_cc0_mode = this_insn_cc0_mode;
-  prev_insn = insn;
-#endif
 }
 \f
 /* Remove from the hash table all expressions that reference memory.  */
@@ -6096,19 +6077,39 @@ cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
                  && for_each_rtx (&PATTERN (insn), check_for_label_ref,
                                   (void *) insn))
                recorded_label_ref = 1;
+
+#ifdef HAVE_cc0
+             /* If the previous insn set CC0 and this insn no longer
+                references CC0, delete the previous insn.  Here we use
+                fact that nothing expects CC0 to be valid over an insn,
+                which is true until the final pass.  */
+             {
+               rtx prev_insn, tem;
+
+               prev_insn = PREV_INSN (insn);
+               if (prev_insn && NONJUMP_INSN_P (prev_insn)
+                   && (tem = single_set (prev_insn)) != 0
+                   && SET_DEST (tem) == cc0_rtx
+                   && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
+                 delete_insn (prev_insn);
+             }
+
+             /* If this insn is not the last insn in the basic block,
+                it will be PREV_INSN(insn) in the next iteration.  If
+                we recorded any CC0-related information for this insn,
+                remember it.  */
+             if (insn != BB_END (bb))
+               {
+                 prev_insn_cc0 = this_insn_cc0;
+                 prev_insn_cc0_mode = this_insn_cc0_mode;
+               }
+#endif
            }
        }
 
       /* Make sure that libcalls don't span multiple basic blocks.  */
       gcc_assert (libcall_insn == NULL_RTX);
 
-#ifdef HAVE_cc0
-      /* Clear the CC0-tracking related insns, they can't provide
-        useful information across basic block boundaries.  */
-      prev_insn_cc0 = 0;
-      prev_insn = 0;
-#endif
-
       /* If we changed a conditional jump, we may have terminated
         the path we are following.  Check that by verifying that
         the edge we would take still exists.  If the edge does
@@ -6133,6 +6134,12 @@ cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
          bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
          record_jump_equiv (insn, taken);
        }
+
+#ifdef HAVE_cc0
+      /* Clear the CC0-tracking related insns, they can't provide
+        useful information across basic block boundaries.  */
+      prev_insn_cc0 = 0;
+#endif
     }
 
   gcc_assert (next_qty <= max_qty);