]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Remove conditions in the code generation of if-conversion.
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 May 2010 16:46:49 +0000 (16:46 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 May 2010 16:46:49 +0000 (16:46 +0000)
2010-05-26  Sebastian Pop  <sebastian.pop@amd.com>

* tree-if-conv.c (tree_if_convert_cond_stmt): Do not remove
statements in the analysis part.
(tree_if_convert_stmt): Update comment.
(remove_conditions_and_labels): New.
(combine_blocks): Call remove_conditions_and_labels.
(tree_if_conversion): Update comment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159885 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-if-conv.c

index 657e1e2610265e9788f7252db76335790b40a9ae..5360dcabcebee9f7efcc49787b8b44b33c8adac9 100644 (file)
@@ -1,3 +1,12 @@
+2010-05-26  Sebastian Pop  <sebastian.pop@amd.com>
+
+       * tree-if-conv.c (tree_if_convert_cond_stmt): Do not remove
+       statements in the analysis part.
+       (tree_if_convert_stmt): Update comment.
+       (remove_conditions_and_labels): New.
+       (combine_blocks): Call remove_conditions_and_labels.
+       (tree_if_conversion): Update comment.
+
 2010-05-26  Sebastian Pop  <sebastian.pop@amd.com>
 
        * tree-if-conv.c (if_convertible_bb_p): Don't handle BBs with more
index 0c2e96fe71ab249a8f70fd6bca02fc26a0a57acd..60033e25fc602cfa6471daba53dab20813162fd6 100644 (file)
@@ -207,7 +207,6 @@ bb_with_exit_edge_p (struct loop *loop, basic_block bb)
 }
 
 /* STMT is a GIMPLE_COND.  Update two destination's predicate list.
-   Remove COND_EXPR, if it is not the exit condition of LOOP.
    Otherwise update the exit condition of LOOP appropriately.  GSI
    points to the statement STMT.  */
 
@@ -232,24 +231,12 @@ tree_if_convert_cond_stmt (struct loop *loop, gimple stmt, tree cond,
   /* If C is false, then FALSE_EDGE is taken.  */
   c2 = invert_truthvalue_loc (loc, unshare_expr (c));
   add_to_dst_predicate_list (loop, false_edge, cond, c2, gsi);
-
-  /* Now this conditional statement is redundant.  Remove it.  But, do
-     not remove the exit condition!  Update the exit condition using
-     the new condition.  */
-  if (!bb_with_exit_edge_p (loop, gimple_bb (stmt)))
-    {
-      gsi_remove (gsi, true);
-      cond = NULL_TREE;
-    }
 }
 
 /* If-convert stmt T which is part of LOOP.
 
-   If T is a GIMPLE_ASSIGN then it is converted into a conditional
-   modify expression using COND.  For conditional expressions, add
-   a condition in the destination basic block's predicate list and
-   remove the conditional expression itself.  GSI points to the
-   statement T.  */
+   For conditional expressions, add a condition in the destination
+   basic block's predicate list.  GSI points to the statement T.  */
 
 static tree
 tree_if_convert_stmt (struct loop *loop, gimple t, tree cond,
@@ -286,8 +273,6 @@ tree_if_convert_stmt (struct loop *loop, gimple t, tree cond,
       break;
 
     case GIMPLE_COND:
-      /* Update destination blocks' predicate list and remove this
-        condition expression.  */
       tree_if_convert_cond_stmt (loop, t, cond, gsi);
       cond = NULL_TREE;
       break;
@@ -911,6 +896,32 @@ process_phi_nodes (struct loop *loop)
     }
 }
 
+/* Remove all GIMPLE_CONDs and GIMPLE_LABELs of all the basic blocks
+   other than the exit and latch of the LOOP.  */
+
+static void
+remove_conditions_and_labels (loop_p loop)
+{
+  gimple_stmt_iterator gsi;
+  unsigned int i;
+
+  for (i = 0; i < loop->num_nodes; i++)
+    {
+      basic_block bb = ifc_bbs [i];
+
+      if (bb_with_exit_edge_p (loop, bb)
+        || bb == loop->latch)
+      continue;
+
+      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
+      if (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
+          || gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
+        gsi_remove (&gsi, true);
+      else
+        gsi_next (&gsi);
+    }
+}
+
 /* Combine all the basic blocks from LOOP into one or two super basic
    blocks.  Replace PHI nodes with conditional modify expressions.  */
 
@@ -923,6 +934,8 @@ combine_blocks (struct loop *loop)
   edge e;
   edge_iterator ei;
 
+  remove_conditions_and_labels (loop);
+
   /* Process phi nodes to prepare blocks for merge.  */
   process_phi_nodes (loop);
 
@@ -988,17 +1001,9 @@ combine_blocks (struct loop *loop)
       if (bb == exit_bb || bb == loop->latch)
        continue;
 
-      /* Remove labels and make stmts member of loop->header.  */
-      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
-       {
-         if (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
-           gsi_remove (&gsi, true);
-         else
-           {
-             gimple_set_bb (gsi_stmt (gsi), merge_target_bb);
-             gsi_next (&gsi);
-           }
-       }
+      /* Make stmts member of loop->header.  */
+      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+       gimple_set_bb (gsi_stmt (gsi), merge_target_bb);
 
       /* Update stmt list.  */
       last = gsi_last_bb (merge_target_bb);
@@ -1049,9 +1054,8 @@ tree_if_conversion (struct loop *loop)
       basic_block bb = ifc_bbs [i];
       tree cond = (tree) bb->aux;
 
-      /* Process all the statements in this basic block.
-        Remove conditional expression, if any, and annotate
-        destination basic block(s) appropriately.  */
+      /* Predicate basic block(s) with the condition expressions
+        leading to their execution.  */
       for (itr = gsi_start_bb (bb); !gsi_end_p (itr); /* empty */)
        {
          gimple t = gsi_stmt (itr);