This patch adds critical edge splitting before the late uninit
warning pass in the -Og pipeline (the patch is for the 4.8 branch
where the testcase otherwise fails).  If I commit this then I'll
commit a corresponding change to trunk as well.

On trunk we can also split critical edges in the regular pipeline
to mitigate the issue the late uninit warning pass has with
critical edges, posssibly reducing the number of false positives.

Critical edges are unsplit by the next CFG cleanup which happens
at latest during pass_cleanup_cfg_post_optimizing.

Bootstrap / regtest running on the branch for x86_64-unknown-linux-gnu.

It should make -Og more usable on the branch and as it is quite
new I suppose the change qualifies for the branch (I lately
moved some passes there for other diagnostic issues).

Opinions on generally splitting critical edges before late
uninit warnings?

Thanks,
Richard.

2013-09-11  Richard Biener  <rguent...@suse.de>

        PR middle-end/58377
        * passes.c (init_optimization_passes): Split critical edges
        before late uninit warning pass.

        * g++.dg/uninit-pred-4.C: New testcase.

Index: gcc/passes.c
===================================================================
*** gcc/passes.c        (revision 202445)
--- gcc/passes.c        (working copy)
*************** init_optimization_passes (void)
*** 1543,1548 ****
--- 1543,1551 ----
        /* ???  We do want some kind of loop invariant motion, but we possibly
           need to adjust LIM to be more friendly towards preserving accurate
         debug information here.  */
+       /* Split critical edges before late uninit warning to reduce the
+          number of false positives from it.  */
+       NEXT_PASS (pass_split_crit_edges);
        NEXT_PASS (pass_late_warn_uninitialized);
        NEXT_PASS (pass_uncprop);
        NEXT_PASS (pass_local_pure_const);
Index: gcc/testsuite/g++.dg/uninit-pred-4.C
===================================================================
*** gcc/testsuite/g++.dg/uninit-pred-4.C        (revision 0)
--- gcc/testsuite/g++.dg/uninit-pred-4.C        (working copy)
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Wuninitialized -Og" } */
+ 
+ int pop ();
+ int pop_first_bucket;
+ 
+ int my_pop ()
+ {
+   int out;  // { dg-bogus "uninitialized" "uninitialized variable warning" }
+ 
+   while (pop_first_bucket)
+     if (pop_first_bucket && (out = pop()))
+       return out;
+ 
+   return 0;
+ }

Reply via email to