This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] ira: Don't substitute into TRAP_IF insns (PR78610)


On Wed, Nov 30, 2016 at 1:46 PM, Segher Boessenkool
<segher@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  <segher@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
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]