]> git.ipfire.org Git - thirdparty/gcc.git/commit
cfgcleanup: Handle a branch with just a return in both arms (PR71028)
authorsegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 May 2016 23:31:27 +0000 (23:31 +0000)
committersegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 May 2016 23:31:27 +0000 (23:31 +0000)
commitab49add9566cf9fe3126640131cb30082a10aa30
treec9e4e1e04a7acbd464e6de9038cf4ea4a138bfd1
parentf9153689e2ce4b8e19fbe2303a545d3cbedfa34e
cfgcleanup: Handle a branch with just a return in both arms (PR71028)

If we have a conditional jump that has only a return in both the branch
path and the fallthrough path, and the return on the branch path can not
be made a conditional return, we will try to make a conditional return
from the fallthrough path, and that does not work because we then try
to redirect the (new) jump in the fallthrough block to the original
dest in the branch path, which is the exit block.

For the testcase on ARM we end up in this situation because before the
jump2 pass there are some other insns in the return blocks as well, but
the same insns in both, so those are moved above the conditional jump.
Only later (in the ce3 pass) are the conditional jump and two returns
melded into one return, so we need to handle this strange case here.

PR rtl-optimization/71028
* cfgcleanup.c (try_optimize_cfg): Do not flip a conditional
jump with just a return in the fallthrough block if the branch
block contains just a returns as well.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@236106 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/cfgcleanup.c