summaryrefslogtreecommitdiff
path: root/gcc/c-gimplify.c
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2004-12-06 17:24:16 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2004-12-06 17:24:16 +0000
commit7763668f10a838af2169f67c0894da9414a040f5 (patch)
treef74af4b0c552ada8c4014524ef63c52b6957b4be /gcc/c-gimplify.c
parente0ed20425583348855a51af0dd9e094e9d292aea (diff)
downloadgcc-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.c53
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);