Hi,

Function average_num_loop_insns forgets to free loop body in early return.  
Besides, overflow comparison checks 1000000 (e6) but the return value is
100000 (e5), I guess it's unexpected, a typo?

Bootstrapped and regress tested on powerpc64le-linux-gnu.  
I guess this should go to GCC11? Is it ok?

BR,
Kewen

gcc/ChangeLog

2020-01-13  Kewen Lin  <li...@gcc.gnu.org>

        * cfgloopanal.c (average_num_loop_insns): Free bbs when early return,
        fix typo on return value.

-------- 

diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c
index 199c20b..65d239a 100644
--- a/gcc/cfgloopanal.c
+++ b/gcc/cfgloopanal.c
@@ -219,7 +219,10 @@ average_num_loop_insns (const class loop *loop)
       ninsns += (sreal)binsns * bb->count.to_sreal_scale (loop->header->count);
       /* Avoid overflows.   */
       if (ninsns > 1000000)
-       return 100000;
+       {
+         free (bbs);
+         return 1000000;
+       }
     }
   free (bbs);

Reply via email to