diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c-semantics.c | 31 |
2 files changed, 24 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b689ad9..3b12182 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2000-10-31 Richard Henderson <rth@redhat.com> + + * c-semantics.c (genrtl_do_stmt): Special case do/while(0). + 2000-10-31 Nick Clifton <nickc@redhat.com> * config/arm/unknown-elf.h (UNIQUE_SECTION_P): Do not allow 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. */ |