On Wed, Nov 30, 2016 at 1:46 PM, Segher Boessenkool <seg...@kernel.crashing.org> wrote: > 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.
Huh, that's an odd choice ;) I'd say TRAP_IF should be a control-flow insn as well, but well... > We cannot do > that here, so instead refuse to do the substitution. > > Bootstrapping + regression testing on powerpc64-linux {-m64,-m32} > (the bug happened here with -m32); okay for trunk if this succeeds? > > > Segher > > > 2016-11-30 Segher Boessenkool <seg...@kernel.crashing.org> > > 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. > > --- > gcc/ira.c | 5 +++++ > gcc/testsuite/gcc.c-torture/compile/pr78610.c | 14 ++++++++++++++ > 2 files changed, 19 insertions(+) > create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr78610.c > > diff --git a/gcc/ira.c b/gcc/ira.c > index d20ec99..ccd4980 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/gcc.c-torture/compile/pr78610.c > b/gcc/testsuite/gcc.c-torture/compile/pr78610.c > new file mode 100644 > index 0000000..0415ae6 > --- /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; > + } > +} > -- > 1.9.3 >