From d599b81f46dd2f76deb23313b92a82e8f64bec84 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 31 Oct 2000 17:31:06 -0800 Subject: [PATCH] * c-semantics.c (genrtl_do_stmt): Special case do/while(0). From-SVN: r37177 --- gcc/ChangeLog | 4 ++++ gcc/c-semantics.c | 31 ++++++++++++++++++++----------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b689ad9967f..3b12182d7d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2000-10-31 Richard Henderson + + * c-semantics.c (genrtl_do_stmt): Special case do/while(0). + 2000-10-31 Nick Clifton * config/arm/unknown-elf.h (UNIQUE_SECTION_P): Do not allow diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index f8528415722..ccc3c7d4e77 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. */ -- 2.30.2