diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2016-11-30 15:47:01 +0100 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2016-11-30 15:47:01 +0100 |
commit | 17a938e841d439c5ea73b4fcbd7091ae448a9257 (patch) | |
tree | 3a1302d543b539cda495047e59dba693b11caf0d /gcc/ira.c | |
parent | 88811a9753e9297baf6413267ccd51ff2cea2450 (diff) | |
download | gcc-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.c | 5 |
1 files changed, 5 insertions, 0 deletions
@@ -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); |