tree-optimization/102880 - make PHI-OPT recognize more CFGs
authorRichard Biener <rguenther@suse.de>
Mon, 15 Nov 2021 14:19:36 +0000 (15:19 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 16 Nov 2021 10:31:05 +0000 (11:31 +0100)
commitf98f373dd822b35c52356b753d528924e9f89678
treea84767d9dadd877b6221017c09dd4e461917e46c
parentd699f03720fce57b319276226ac4a463a8538e9f
tree-optimization/102880 - make PHI-OPT recognize more CFGs

This allows extra edges into the middle BB for the PHI-OPT
transforms using replace_phi_edge_with_variable that do not
end up moving stmts from that middle BB.  This avoids regressing
gcc.dg/tree-ssa/ssa-hoist-4.c with the actual fix for PR102880
where CFG cleanup has the choice to remove two forwarders and
picks "the wrong" leading to

   if (a > b) /
       /\    /
      /  <BB>
     /    |
  # PHI <a, b>

rather than

   if (a > b)  |
       /\      |
    <BB> \     |
     /    \    |
  # PHI <a, b, b>

but it's relatively straight-forward to support extra edges
into the middle-BB in paths ending in replace_phi_edge_with_variable
and that do not require moving stmts.  That's because we really
only want to remove the edge from the condition to the middle BB.
Of course actually doing that means updating dominators in non-trival
ways which is why I kept the original code for the single edge
case and simply defer to CFG cleanup by adjusting the condition for
the complicated case.

The testcase needs to be a GIMPLE one since it's quite unreliable
to produce the desired CFG.

2021-11-15  Richard Biener  <rguenther@suse.de>

PR tree-optimization/102880
* tree-ssa-phiopt.c (tree_ssa_phiopt_worker): Push
single_pred (bb1) condition to places that really need it.
(match_simplify_replacement): Likewise.
(value_replacement): Likewise.
(replace_phi_edge_with_variable): Deal with extra edges
into the middle BB.

* gcc.dg/tree-ssa/phi-opt-26.c: New testcase.
gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c