diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-05-29 16:33:47 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-05-29 16:33:47 +0000 |
commit | 0b82d59c030f40cc0d65beda7ead902cb4402bb0 (patch) | |
tree | 314f9412171f5d0b15479435232d46e12b33f62b /gcc/c-semantics.c | |
parent | 86f6262d6107ad53fe70b80be0efb4d4e26d4df2 (diff) | |
download | gcc-0b82d59c030f40cc0d65beda7ead902cb4402bb0.zip gcc-0b82d59c030f40cc0d65beda7ead902cb4402bb0.tar.gz gcc-0b82d59c030f40cc0d65beda7ead902cb4402bb0.tar.bz2 |
c-semantics.c (genrtl_do_stmt_1): New function split out from...
* c-semantics.c (genrtl_do_stmt_1): New function split out from...
(gen_rtl_do_stmt): ... here. Call genrtl_do_stmt_1.
(expand_unreachable_stmt): Expand unreachable while statements
using genrtl_do_stmt_1.
* gcc.dg/duff-4.c: New test case.
From-SVN: r67224
Diffstat (limited to 'gcc/c-semantics.c')
-rw-r--r-- | gcc/c-semantics.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index a5cf775..374e9f1 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -56,6 +56,7 @@ static tree find_reachable_label_1 PARAMS ((tree *, int *, void *)); static tree find_reachable_label PARAMS ((tree)); static bool expand_unreachable_if_stmt PARAMS ((tree)); static tree expand_unreachable_stmt PARAMS ((tree, int)); +static void genrtl_do_stmt_1 PARAMS ((tree, tree)); /* Create an empty statement tree rooted at T. */ @@ -463,14 +464,13 @@ genrtl_while_stmt (t) expand_end_loop (); } -/* Generate the RTL for T, which is a DO_STMT. */ +/* Generate the RTL for a DO_STMT with condition COND and loop BODY + body. This is reused for expanding unreachable WHILE_STMTS. */ -void -genrtl_do_stmt (t) - tree t; +static void +genrtl_do_stmt_1 (cond, body) + tree cond, body; { - tree cond = DO_COND (t); - /* Recognize the common special-case of do { ... } while (0) and do not emit the loop widgetry in this case. In particular this avoids cluttering the rtl with dummy loop notes, which can affect @@ -479,7 +479,7 @@ genrtl_do_stmt (t) if (!cond || integer_zerop (cond)) { expand_start_null_loop (); - expand_stmt (DO_BODY (t)); + expand_stmt (body); expand_end_null_loop (); } else if (integer_nonzerop (cond)) @@ -488,7 +488,7 @@ genrtl_do_stmt (t) emit_line_note (input_filename, input_line); expand_start_loop (1); - expand_stmt (DO_BODY (t)); + expand_stmt (body); emit_line_note (input_filename, input_line); expand_end_loop (); @@ -499,7 +499,7 @@ genrtl_do_stmt (t) emit_line_note (input_filename, input_line); expand_start_loop_continue_elsewhere (1); - expand_stmt (DO_BODY (t)); + expand_stmt (body); expand_loop_continue_here (); cond = expand_cond (cond); @@ -509,6 +509,15 @@ genrtl_do_stmt (t) } } +/* Generate the RTL for T, which is a DO_STMT. */ + +void +genrtl_do_stmt (t) + tree t; +{ + genrtl_do_stmt_1 (DO_COND (t), DO_BODY (t)); +} + /* Build the node for a return statement and return it. */ tree @@ -1059,6 +1068,13 @@ expand_unreachable_stmt (t, warn) return TREE_CHAIN (t); break; + case WHILE_STMT: + /* If the start of a while statement is unreachable, there is + no need to rotate the loop, instead the WHILE_STMT can be + expanded like a DO_STMT. */ + genrtl_do_stmt_1 (WHILE_COND (t), WHILE_BODY (t)); + return TREE_CHAIN (t); + case COMPOUND_STMT: { tree n; |