This should fix PR57081 - the problem is that number-of-iteration
estimates are not freed by DCE and thus possibly dead stmts are looked
at in loop prediction.  The fix is to always free number-of-iteration
estimates at loop_optimizer_finalize time (this is the behavior
from before preserving loops at all).

Bootstrap & regtest pending on x86_64-unknown-linux-gnu.

Richard.

2013-04-26  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/57081
        * loop-init.c: Include tree-flow.h.
        (loop_optimizer_finalize): Free number of iteration estimates.
        * Makefile.in (loop-init.o): Add $(TREE_FLOW_H) dependency.

        * gcc.dg/torture/pr57081.c: New testcase.

Index: gcc/loop-init.c
===================================================================
*** gcc/loop-init.c     (revision 198334)
--- gcc/loop-init.c     (working copy)
*************** along with GCC; see the file COPYING3.
*** 30,35 ****
--- 30,36 ----
  #include "flags.h"
  #include "df.h"
  #include "ggc.h"
+ #include "tree-flow.h"
  
  
  /* Apply FLAGS to the loop state.  */
*************** loop_optimizer_finalize (void)
*** 142,147 ****
--- 143,150 ----
    if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
      release_recorded_exits ();
  
+   free_numbers_of_iterations_estimates ();
+ 
    /* If we should preserve loop structure, do not free it but clear
       flags that advanced properties are there as we are not preserving
       that in full.  */
Index: gcc/Makefile.in
===================================================================
*** gcc/Makefile.in     (revision 198334)
--- gcc/Makefile.in     (working copy)
*************** cfgloopmanip.o : cfgloopmanip.c $(CONFIG
*** 3181,3187 ****
  loop-init.o : loop-init.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(GGC_H) \
     $(BASIC_BLOCK_H) hard-reg-set.h $(CFGLOOP_H) \
     coretypes.h $(TM_H) $(OBSTACK_H) $(TREE_PASS_H) $(FLAGS_H) \
!    $(REGS_H) $(DF_H)
  loop-unswitch.o : loop-unswitch.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
     $(DUMPFILE_H) \
     $(RTL_H) $(TM_H) $(BASIC_BLOCK_H) hard-reg-set.h $(CFGLOOP_H) $(PARAMS_H) \
--- 3189,3195 ----
  loop-init.o : loop-init.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(GGC_H) \
     $(BASIC_BLOCK_H) hard-reg-set.h $(CFGLOOP_H) \
     coretypes.h $(TM_H) $(OBSTACK_H) $(TREE_PASS_H) $(FLAGS_H) \
!    $(REGS_H) $(DF_H) $(TREE_FLOW_H)
  loop-unswitch.o : loop-unswitch.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
     $(DUMPFILE_H) \
     $(RTL_H) $(TM_H) $(BASIC_BLOCK_H) hard-reg-set.h $(CFGLOOP_H) $(PARAMS_H) \
Index: gcc/testsuite/gcc.dg/torture/pr57081.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr57081.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr57081.c      (working copy)
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do compile } */
+ 
+ int a;
+ 
+ void f(void)
+ {
+   int b;
+ 
+   if(0)
+     lbl:
+       goto lbl;
+ 
+   if(b)
+     {
+       int p = 0;
+       goto lbl;
+     }
+ 
+   a = 0;
+   while(b++);
+   goto lbl;
+ }

Reply via email to