diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-29 16:33:47 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-29 16:33:47 +0000 |
commit | 6060c5a7c68926be34842a070041743a7c6d6be8 (patch) | |
tree | 314f9412171f5d0b15479435232d46e12b33f62b /gcc/c-semantics.c | |
parent | 481fca456a283bde417a135ec974a4cb31998f26 (diff) | |
download | gcc-6060c5a7c68926be34842a070041743a7c6d6be8.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@67224 138bc75d-0d04-0410-961f-82ee72b054a4
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 a5cf7754a60..374e9f13dec 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; |