From: Segher Boessenkool Date: Wed, 30 Nov 2016 14:47:01 +0000 (+0100) Subject: ira: Don't substitute into TRAP_IF insns (PR78610) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=17a938e841d439c5ea73b4fcbd7091ae448a9257;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0fc87d259a8..97daa79d06b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-30 Segher Boessenkool + + PR rtl-optimization/78610 + * ira.c (combine_and_move_insns): Don't substitute into TRAP_IF + instructions. + 2016-11-30 Bin Cheng PR tree-optimization/78574 diff --git a/gcc/ira.c b/gcc/ira.c index 358110b6a31..ab322889c6c 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eac361b5f85..7164611f9ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-30 Segher Boessenkool + + PR rtl-optimization/78610 + * gcc.c-torture/compile/pr78610.c: New testcase. + 2016-11-30 Bin Cheng PR tree-optimization/78574 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr78610.c b/gcc/testsuite/gcc.c-torture/compile/pr78610.c new file mode 100644 index 00000000000..0415ae6d9df --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr78610.c @@ -0,0 +1,14 @@ +/* PR rtl-optimization/78610 */ + +unsigned int ao, gl; + +void +ri (void) +{ + for (;;) + { + if (ao != 1) + ao /= 0; + gl = 0; + } +}