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