diff options
author | Richard Henderson <rth@redhat.com> | 2000-10-31 17:31:06 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-10-31 17:31:06 -0800 |
commit | d599b81f46dd2f76deb23313b92a82e8f64bec84 (patch) | |
tree | 55374d4a060bf50c26ed3ef478b1f462ccfa5e6e /gcc/c-semantics.c | |
parent | 1426f761420d7726479d9a1174a6f97e3fb79acb (diff) | |
download | gcc-d599b81f46dd2f76deb23313b92a82e8f64bec84.zip gcc-d599b81f46dd2f76deb23313b92a82e8f64bec84.tar.gz gcc-d599b81f46dd2f76deb23313b92a82e8f64bec84.tar.bz2 |
* c-semantics.c (genrtl_do_stmt): Special case do/while(0).
From-SVN: r37177
Diffstat (limited to 'gcc/c-semantics.c')
-rw-r--r-- | gcc/c-semantics.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index f852841..ccc3c7d 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -480,19 +480,28 @@ void genrtl_do_stmt (t) tree t; { - tree cond; - emit_nop (); - emit_line_note (input_filename, lineno); - expand_start_loop_continue_elsewhere (1); + 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 + alignment of adjacent labels. */ + if (cond == integer_zero_node) + expand_stmt (DO_BODY (t)); + else + { + emit_nop (); + emit_line_note (input_filename, lineno); + expand_start_loop_continue_elsewhere (1); - expand_stmt (DO_BODY (t)); + expand_stmt (DO_BODY (t)); - expand_loop_continue_here (); - - cond = expand_cond (DO_COND (t)); - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (0, cond); - expand_end_loop (); + expand_loop_continue_here (); + cond = expand_cond (cond); + emit_line_note (input_filename, lineno); + expand_exit_loop_if_false (0, cond); + expand_end_loop (); + } } /* Build the node for a return statement and return it. */ |