aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2016-05-11 01:31:27 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2016-05-11 01:31:27 +0200
commitac2a4c0df812e297d37b0db8eb9ba2662bc27d12 (patch)
treec9e4e1e04a7acbd464e6de9038cf4ea4a138bfd1
parente39dab2c21c0e1fe615a1050da051c8088cb3267 (diff)
downloadgcc-ac2a4c0df812e297d37b0db8eb9ba2662bc27d12.zip
gcc-ac2a4c0df812e297d37b0db8eb9ba2662bc27d12.tar.gz
gcc-ac2a4c0df812e297d37b0db8eb9ba2662bc27d12.tar.bz2
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. From-SVN: r236106
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cfgcleanup.c1
2 files changed, 8 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0f20a32..e95fcad 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-05-10 Segher Boessenkool <segher@kernel.crashing.org>
+
+ 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 return as well.
+
2016-05-10 Marc Glisse <marc.glisse@inria.fr>
* fold-const.c (fold_binary_loc) [(X ^ Y) & Y]: Remove and merge with...
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 726c068..023b9d2 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -2870,6 +2870,7 @@ try_optimize_cfg (int mode)
a return so that it becomes a conditional return and a
new jump to the original branch target. */
if (EDGE_COUNT (b->succs) == 2
+ && BRANCH_EDGE (b)->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
&& any_condjump_p (BB_END (b))
&& bb_is_just_return (FALLTHRU_EDGE (b)->dest, &ret, &use))
{