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
+2016-11-30 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR rtl-optimization/78610
+ * ira.c (combine_and_move_insns): Don't substitute into TRAP_IF
+ instructions.
+
2016-11-30 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/78574
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);
+2016-11-30 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR rtl-optimization/78610
+ * gcc.c-torture/compile/pr78610.c: New testcase.
+
2016-11-30 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/78574
--- /dev/null
+/* PR rtl-optimization/78610 */
+
+unsigned int ao, gl;
+
+void
+ri (void)
+{
+ for (;;)
+ {
+ if (ao != 1)
+ ao /= 0;
+ gl = 0;
+ }
+}