This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] ira: Don't substitute into TRAP_IF insns (PR78610)
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Segher Boessenkool <segher at kernel dot crashing dot org>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, "Vladimir N. Makarov" <vmakarov at redhat dot com>
- Date: Wed, 30 Nov 2016 13:52:51 +0100
- Subject: Re: [PATCH] ira: Don't substitute into TRAP_IF insns (PR78610)
- Authentication-results: sourceware.org; auth=none
- References: <d0d01f953b89393e24ce8d483ba8829705fe7fff.1480509684.git.segher@kernel.crashing.org>
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
>