* c-semantics.c (genrtl_while_stmt): Improve initial RTL generation
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Jan 2003 17:44:37 +0000 (17:44 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Jan 2003 17:44:37 +0000 (17:44 +0000)
when loop condition is known true, i.e.  "while (1) { ... }".
(genrtl_for_stmt): Similarly for "for" statements.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61338 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-semantics.c

index 503ad57..06387e8 100644 (file)
@@ -1,5 +1,11 @@
 2003-01-15  Roger Sayle  <roger@eyesopen.com>
 
+       * c-semantics.c (genrtl_while_stmt):  Improve initial RTL generation
+       when loop condition is known true, i.e.  "while (1) { ... }".
+       (genrtl_for_stmt): Similarly for "for" statements.
+
+2003-01-15  Roger Sayle  <roger@eyesopen.com>
+
        * real.c (real_sqrt): Return a bool result indicating whether
        a floating point exception or trap should be raised.
        * real.h (real_sqrt): Update function prototype.
index 769c116..e19e73e 100644 (file)
@@ -1,7 +1,7 @@
 /* This file contains the definitions and documentation for the common
    tree codes used in the GNU C and C++ compilers (see c-common.def
    for the standard codes).  
-   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    Written by Benjamin Chelf (chelf@codesourcery.com).
 
 This file is part of GCC.
@@ -424,16 +424,20 @@ void
 genrtl_while_stmt (t)
      tree t;
 {
-  tree cond;
+  tree cond = WHILE_COND (t);
+
   emit_nop ();
   emit_line_note (input_filename, lineno);
   expand_start_loop (1); 
   genrtl_do_pushlevel ();
 
-  cond = expand_cond (WHILE_COND (t));
-  emit_line_note (input_filename, lineno);
-  expand_exit_loop_top_cond (0, cond);
-  genrtl_do_pushlevel ();
+  if (cond && !integer_nonzerop (cond))
+    {
+      cond = expand_cond (cond);
+      emit_line_note (input_filename, lineno);
+      expand_exit_loop_top_cond (0, cond);
+      genrtl_do_pushlevel ();
+    }
   
   expand_stmt (WHILE_BODY (t));
 
@@ -522,7 +526,7 @@ void
 genrtl_for_stmt (t)
      tree t;
 {
-  tree cond;
+  tree cond = FOR_COND (t);
   const char *saved_filename;
   int saved_lineno;
 
@@ -539,7 +543,6 @@ genrtl_for_stmt (t)
   else
     expand_start_loop (1);
   genrtl_do_pushlevel ();
-  cond = expand_cond (FOR_COND (t));
 
   /* Save the filename and line number so that we expand the FOR_EXPR
      we can reset them back to the saved values.  */
@@ -547,12 +550,15 @@ genrtl_for_stmt (t)
   saved_lineno = lineno;
 
   /* Expand the condition.  */
-  emit_line_note (input_filename, lineno);
-  if (cond)
-    expand_exit_loop_top_cond (0, cond);
+  if (cond && !integer_nonzerop (cond))
+    {
+      cond = expand_cond (cond);
+      emit_line_note (input_filename, lineno);
+      expand_exit_loop_top_cond (0, cond);
+      genrtl_do_pushlevel ();
+    }
 
   /* Expand the body.  */
-  genrtl_do_pushlevel ();
   expand_stmt (FOR_BODY (t));
 
   /* Expand the increment expression.  */