On 12/14/2016 08:46 AM, Bernd Schmidt wrote:
On 12/12/2016 03:21 PM, Bernd Schmidt wrote:
On 12/10/2016 08:58 PM, Segher Boessenkool wrote:
On Thu, Dec 08, 2016 at 01:21:04PM +0100, Bernd Schmidt wrote:
This is another case where an optimization turns a trap_if
unconditional. We have to defer changing the CFG, since the rest of
cprop seems to blow up when we modify things while scanning.

The problem for PR78727 is that we also need to do this for insns that
already are the last insn in the block:

+      while (!uncond_traps.is_empty ())
+    {
+      rtx_insn *insn = uncond_traps.pop ();
+      basic_block to_split = BLOCK_FOR_INSN (insn);
+      remove_edge (split_block (to_split, insn));
+      emit_barrier_after_bb (to_split);
+    }

We need that barrier, and we also need the successor edges removed
(which split_block+remove_edge does).

(PR78727 works fine with just that BB_END test deleted).

Ah, ok. In that case I'll probably also add a test to make sure this is
only done for insns that weren't an unconditional trap before.
Retesting...

That would be this patch. Tested as before. The two new testcases seem
to pass with a ppc cross (but I would appreciate if someone were to run
full tests on ppc).


Bernd


cprop-v2.diff


        PR rtl-optimization/78626
        PR rtl-optimization/78727
        * cprop.c (one_cprop_pass): Collect unconditional traps in the middle
        of a block, and split such blocks after everything else is finished.

        PR rtl-optimization/78626
        PR rtl-optimization/78727
        * gcc.dg/torture/pr78626.c: New test.
        * gcc.dg/torture/pr78727.c: New test.
This is OK. I also re-tested ppc64le-linux since it's been about 3 weeks since this patch was submitted.

I went ahead and committed the patch since you're on PTO and it kills stuff on the regression hit list.

jeff

Reply via email to