aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2016-11-29 03:02:45 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2016-11-29 03:02:45 +0100
commita001d4f9b912362c78e38ba3ea6aeddaa97f8eb8 (patch)
tree7b6b165d26dcdfd5c1a1f4557a6d779abf95ca84 /gcc
parent48cf0e51e9cd4a78488dc216ed6f190df4c5b481 (diff)
downloadgcc-a001d4f9b912362c78e38ba3ea6aeddaa97f8eb8.zip
gcc-a001d4f9b912362c78e38ba3ea6aeddaa97f8eb8.tar.gz
gcc-a001d4f9b912362c78e38ba3ea6aeddaa97f8eb8.tar.bz2
combine: Make code after a new trap unreachable (PR78342)
Combine can turn a conditional trap into an unconditional trap. If it does that it should make the code after it unreachable (an unconditional trap should be the last insn in its bb, and that bb has no successors). This patch seems to work. It is hard to be sure, this is very hard to trigger. Quite a few other passes look like they need something similar as well, but I don't see anything else handling it yet either. PR rtl-optimization/78342 * combine.c: Include "cfghooks.h". (try_combine): If we create an unconditional trap, break the basic block in two just after it, and remove the edge between; also, set the *new_direct_jump_p flag so that cleanup_cfg is run. From-SVN: r242947
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/combine.c20
2 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 900f9b3..07bcc26 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2016-11-28 Segher Boessenkool <segher@kernel.crashing.org>
+ PR rtl-optimization/78342
+ * combine.c: Include "cfghooks.h".
+ (try_combine): If we create an unconditional trap, break the basic
+ block in two just after it, and remove the edge between; also, set
+ the *new_direct_jump_p flag so that cleanup_cfg is run.
+
+2016-11-28 Segher Boessenkool <segher@kernel.crashing.org>
+
* simplify-rtx.c (simplify_truncation): Handle truncate of zero_extract
and sign_extract.
diff --git a/gcc/combine.c b/gcc/combine.c
index 45d4048..41f69da 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -82,6 +82,7 @@ along with GCC; see the file COPYING3. If not see
#include "target.h"
#include "rtl.h"
#include "tree.h"
+#include "cfghooks.h"
#include "predict.h"
#include "df.h"
#include "memmodel.h"
@@ -4620,6 +4621,25 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
update_cfg_for_uncondjump (undobuf.other_insn);
}
+ if (GET_CODE (PATTERN (i3)) == TRAP_IF
+ && XEXP (PATTERN (i3), 0) == const1_rtx)
+ {
+ basic_block bb = BLOCK_FOR_INSN (i3);
+ gcc_assert (bb);
+ remove_edge (split_block (bb, i3));
+ *new_direct_jump_p = 1;
+ }
+
+ if (undobuf.other_insn
+ && GET_CODE (PATTERN (undobuf.other_insn)) == TRAP_IF
+ && XEXP (PATTERN (undobuf.other_insn), 0) == const1_rtx)
+ {
+ basic_block bb = BLOCK_FOR_INSN (undobuf.other_insn);
+ gcc_assert (bb);
+ remove_edge (split_block (bb, undobuf.other_insn));
+ *new_direct_jump_p = 1;
+ }
+
/* A noop might also need cleaning up of CFG, if it comes from the
simplification of a jump. */
if (JUMP_P (i3)