summaryrefslogtreecommitdiff
path: root/gcc/tree-if-conv.c
diff options
context:
space:
mode:
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-26 16:46:49 +0000
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-26 16:46:49 +0000
commit01c40c0ba32353e9954a265254ce3f67d91cb977 (patch)
treef153e2d09d17a98b23f7f08a350a44a45e06b4eb /gcc/tree-if-conv.c
parentcedd9a279aaa2b3c54dc83f5ddce499a547c4631 (diff)
downloadgcc-01c40c0ba32353e9954a265254ce3f67d91cb977.tar.gz
Remove conditions in the code generation of if-conversion.
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
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r--gcc/tree-if-conv.c66
1 files changed, 35 insertions, 31 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 0c2e96fe71a..60033e25fc6 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -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);