diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-06 17:24:16 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-06 17:24:16 +0000 |
commit | 7763668f10a838af2169f67c0894da9414a040f5 (patch) | |
tree | f74af4b0c552ada8c4014524ef63c52b6957b4be /gcc/c-gimplify.c | |
parent | e0ed20425583348855a51af0dd9e094e9d292aea (diff) | |
download | gcc-7763668f10a838af2169f67c0894da9414a040f5.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91784 138bc75d-0d04-0410-961f-82ee72b054a4
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 d77d75c2f77..db6cd88fd9b 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); |