ifcvt.c (struct noce_if_info): Add a Boolean b_unconditional field.
authorRoger Sayle <roger@eyesopen.com>
Tue, 6 Jul 2004 21:50:47 +0000 (21:50 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 6 Jul 2004 21:50:47 +0000 (21:50 +0000)
* ifcvt.c (struct noce_if_info): Add a Boolean b_unconditional field.
(noce_try_sign_mask): Tweak rtx_cost check if t is evaluated anyway.
(noce_process_if_block): Initialize if_info.b_unconditional if insn_b
is currently executed unconditionally, i.e. not in "else_bb".

From-SVN: r84172

gcc/ChangeLog
gcc/ifcvt.c

index 998580493f3e1e9dff6e848e355da81d119cc24c..eb2dc4e67d0978a55dd7232c63f41012d5681f0f 100644 (file)
@@ -1,3 +1,10 @@
+2004-07-06  Roger Sayle  <roger@eyesopen.com>
+
+       * ifcvt.c (struct noce_if_info): Add a Boolean b_unconditional field.
+       (noce_try_sign_mask): Tweak rtx_cost check if t is evaluated anyway.
+       (noce_process_if_block): Initialize if_info.b_unconditional if insn_b
+       is currently executed unconditionally, i.e. not in "else_bb".
+
 2004-07-06  Steven Bosscher  <stevenb@suse.de>
 
        * config/alpha/alpha.c (alpha_use_dfa_pipeline_interface): Remove.
index 0be64727d350d58df41bcfaffcdd2d77ccdaf44e..03efaba2ebbcb3eb5870a028661274142e571929 100644 (file)
@@ -579,6 +579,8 @@ struct noce_if_info
   rtx insn_a, insn_b;
   rtx x, a, b;
   rtx jump, cond, cond_earliest;
+  /* True if "b" was originally evaluated unconditionally.  */
+  bool b_unconditional;
 };
 
 static rtx noce_emit_store_flag (struct noce_if_info *, rtx, int, int);
@@ -1730,8 +1732,11 @@ noce_try_sign_mask (struct noce_if_info *if_info)
   if (GET_MODE (m) != mode)
     return FALSE;
 
-  /* This is only profitable if T is cheap.  */
-  if (rtx_cost (t, SET) >= COSTS_N_INSNS (2))
+  /* This is only profitable if T is cheap, or T is unconditionally
+     executed/evaluated in the original insn sequence.  */
+  if (rtx_cost (t, SET) >= COSTS_N_INSNS (2)
+      && (!if_info->b_unconditional
+          || t != if_info->b))
     return FALSE;
 
   start_sequence ();
@@ -1983,6 +1988,7 @@ noce_process_if_block (struct ce_if_block * ce_info)
   if_info.x = x;
   if_info.a = a;
   if_info.b = b;
+  if_info.b_unconditional = else_bb == 0;
 
   /* Try optimizations in some approximation of a useful order.  */
   /* ??? Should first look to see if X is live incoming at all.  If it