aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira.c
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2016-11-30 15:47:01 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2016-11-30 15:47:01 +0100
commit17a938e841d439c5ea73b4fcbd7091ae448a9257 (patch)
tree3a1302d543b539cda495047e59dba693b11caf0d /gcc/ira.c
parent88811a9753e9297baf6413267ccd51ff2cea2450 (diff)
downloadgcc-17a938e841d439c5ea73b4fcbd7091ae448a9257.zip
gcc-17a938e841d439c5ea73b4fcbd7091ae448a9257.tar.gz
gcc-17a938e841d439c5ea73b4fcbd7091ae448a9257.tar.bz2
ira: Don't substitute into TRAP_IF insns (PR78610)
In the testcase, IRA propagates a constant into a TRAP_IF insn, which then becomes an unconditional trap. Unconditional traps are control flow insns so doing this requires surgery on the cfg. We cannot do that here, so instead refuse to do the substitution. PR rtl-optimization/78610 * ira.c (combine_and_move_insns): Don't substitute into TRAP_IF instructions. gcc/testsuite/ PR rtl-optimization/78610 * gcc.c-torture/compile/pr78610.c: New testcase. From-SVN: r243028
Diffstat (limited to 'gcc/ira.c')
-rw-r--r--gcc/ira.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/ira.c b/gcc/ira.c
index 358110b..ab32288 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3669,6 +3669,11 @@ combine_and_move_insns (void)
if (JUMP_P (use_insn))
continue;
+ /* Also don't substitute into a conditional trap insn -- it can become
+ an unconditional trap, and that is a flow control insn. */
+ if (GET_CODE (PATTERN (use_insn)) == TRAP_IF)
+ continue;
+
df_ref def = DF_REG_DEF_CHAIN (regno);
gcc_assert (DF_REG_DEF_COUNT (regno) == 1 && DF_REF_INSN_INFO (def));
rtx_insn *def_insn = DF_REF_INSN (def);