diff options
author | Roger Sayle <roger@eyesopen.com> | 2004-12-06 17:24:16 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-12-06 17:24:16 +0000 |
commit | b086a2eaf8ae0e915c0db1343687b924c680d2b8 (patch) | |
tree | f74af4b0c552ada8c4014524ef63c52b6957b4be /gcc/c-gimplify.c | |
parent | ff8b369ad3ebb96866bc3fa10cdeaafc293e1a1c (diff) | |
download | gcc-b086a2eaf8ae0e915c0db1343687b924c680d2b8.zip gcc-b086a2eaf8ae0e915c0db1343687b924c680d2b8.tar.gz gcc-b086a2eaf8ae0e915c0db1343687b924c680d2b8.tar.bz2 |
c-gimplify.c (gimplify_c_loop): Improve initial implementations for loops whose conditions are known at...
* c-gimplify.c (gimplify_c_loop): Improve initial implementations
for loops whose conditions are known at compile-time.
* gimplify.c (append_to_statement_list_1): Remove side_effects
parameter, this function should never be called if its false.
(append_to_statement_list): Only call append_to_statement_list_1
if t is non-NULL tree with side-effects.
(append_to_statement_list_force): Likewise, if t is not NULL.
From-SVN: r91784
Diffstat (limited to 'gcc/c-gimplify.c')
-rw-r--r-- | gcc/c-gimplify.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/gcc/c-gimplify.c b/gcc/c-gimplify.c index d77d75c..db6cd88 100644 --- a/gcc/c-gimplify.c +++ b/gcc/c-gimplify.c @@ -338,10 +338,23 @@ gimplify_c_loop (tree cond, tree body, tree incr, bool cond_is_first) location_t stmt_locus; stmt_locus = input_location; + stmt_list = NULL_TREE; + entry = NULL_TREE; - /* Detect do { ... } while (0) and don't generate loop construct. */ - if (!cond_is_first && cond && integer_zerop (cond)) - top = cond = NULL; + break_block = begin_bc_block (bc_break); + cont_block = begin_bc_block (bc_continue); + + /* If condition is zero don't generate a loop construct. */ + if (cond && integer_zerop (cond)) + { + top = NULL_TREE; + exit = NULL_TREE; + if (cond_is_first) + { + t = build_bc_goto (bc_break); + append_to_statement_list (t, &stmt_list); + } + } else { /* If we use a LOOP_EXPR here, we have to feed the whole thing @@ -349,45 +362,37 @@ gimplify_c_loop (tree cond, tree body, tree incr, bool cond_is_first) have to gimplify the loop body NOW so that we can resolve break/continue stmts, seems easier to just expand to gotos. */ top = build1 (LABEL_EXPR, void_type_node, NULL_TREE); - } - - break_block = begin_bc_block (bc_break); - if (top) - { /* If we have an exit condition, then we build an IF with gotos either out of the loop, or to the top of it. If there's no exit condition, then we just build a jump back to the top. */ exit = build_and_jump (&LABEL_EXPR_LABEL (top)); - if (cond) + if (cond && !integer_nonzerop (cond)) { t = build_bc_goto (bc_break); exit = build3 (COND_EXPR, void_type_node, cond, exit, t); exit = fold (exit); gimplify_stmt (&exit); + + if (cond_is_first) + { + if (incr) + { + entry = build1 (LABEL_EXPR, void_type_node, NULL_TREE); + t = build_and_jump (&LABEL_EXPR_LABEL (entry)); + } + else + t = build_bc_goto (bc_continue); + append_to_statement_list (t, &stmt_list); + } } } - else - exit = NULL_TREE; - - cont_block = begin_bc_block (bc_continue); gimplify_stmt (&body); gimplify_stmt (&incr); body = finish_bc_block (cont_block, body); - stmt_list = NULL; - - if (cond_is_first && cond) - { - entry = build1 (LABEL_EXPR, void_type_node, NULL_TREE); - t = build_and_jump (&LABEL_EXPR_LABEL (entry)); - append_to_statement_list (t, &stmt_list); - } - else - entry = NULL_TREE; - append_to_statement_list (top, &stmt_list); append_to_statement_list (body, &stmt_list); append_to_statement_list (incr, &stmt_list); |