summaryrefslogtreecommitdiff
path: root/gcc/c-semantics.c
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2003-05-29 16:33:47 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2003-05-29 16:33:47 +0000
commit6060c5a7c68926be34842a070041743a7c6d6be8 (patch)
tree314f9412171f5d0b15479435232d46e12b33f62b /gcc/c-semantics.c
parent481fca456a283bde417a135ec974a4cb31998f26 (diff)
downloadgcc-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.c34
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;