diff options
Diffstat (limited to 'gcc/tree-ssa-loop-unswitch.c')
-rw-r--r-- | gcc/tree-ssa-loop-unswitch.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c index b63c209..8ece4ac 100644 --- a/gcc/tree-ssa-loop-unswitch.c +++ b/gcc/tree-ssa-loop-unswitch.c @@ -103,26 +103,29 @@ tree_ssa_unswitch_loops (void) static tree tree_may_unswitch_on (basic_block bb, struct loop *loop) { - tree stmt, def, cond, use; + gimple stmt, def; + tree cond, use; basic_block def_bb; ssa_op_iter iter; /* BB must end in a simple conditional jump. */ stmt = last_stmt (bb); - if (!stmt || TREE_CODE (stmt) != COND_EXPR) + if (!stmt || gimple_code (stmt) != GIMPLE_COND) return NULL_TREE; /* Condition must be invariant. */ FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) { def = SSA_NAME_DEF_STMT (use); - def_bb = bb_for_stmt (def); + def_bb = gimple_bb (def); if (def_bb && flow_bb_inside_loop_p (loop, def_bb)) return NULL_TREE; } - cond = COND_EXPR_COND (stmt); + cond = fold_build2 (gimple_cond_code (stmt), boolean_type_node, + gimple_cond_lhs (stmt), gimple_cond_rhs (stmt)); + /* To keep the things simple, we do not directly remove the conditions, but just replace tests with 0/1. Prevent the infinite loop where we would unswitch again on such a condition. */ @@ -140,14 +143,18 @@ static tree simplify_using_entry_checks (struct loop *loop, tree cond) { edge e = loop_preheader_edge (loop); - tree stmt; + gimple stmt; while (1) { stmt = last_stmt (e->src); if (stmt - && TREE_CODE (stmt) == COND_EXPR - && operand_equal_p (COND_EXPR_COND (stmt), cond, 0)) + && gimple_code (stmt) == GIMPLE_COND + && gimple_cond_code (stmt) == TREE_CODE (cond) + && operand_equal_p (gimple_cond_lhs (stmt), + TREE_OPERAND (cond, 0), 0) + && operand_equal_p (gimple_cond_rhs (stmt), + TREE_OPERAND (cond, 1), 0)) return (e->flags & EDGE_TRUE_VALUE ? boolean_true_node : boolean_false_node); @@ -171,7 +178,8 @@ tree_unswitch_single_loop (struct loop *loop, int num) basic_block *bbs; struct loop *nloop; unsigned i; - tree cond = NULL_TREE, stmt; + tree cond = NULL_TREE; + gimple stmt; bool changed = false; /* Do not unswitch too much. */ @@ -220,13 +228,13 @@ tree_unswitch_single_loop (struct loop *loop, int num) if (integer_nonzerop (cond)) { /* Remove false path. */ - COND_EXPR_COND (stmt) = boolean_true_node; + gimple_cond_set_condition_from_tree (stmt, boolean_true_node); changed = true; } else if (integer_zerop (cond)) { /* Remove true path. */ - COND_EXPR_COND (stmt) = boolean_false_node; + gimple_cond_set_condition_from_tree (stmt, boolean_false_node); changed = true; } else |