aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/c-semantics.c31
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. */