On Sun, May 16, 2021 at 7:35 PM apinski--- via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> From: Andrew Pinski <apin...@marvel.com>
>
> While rewriting part of PHI-OPT to use match-and-simplify,
> I ran into a bug where this pattern in match.pd would hit
> and would produce invalid gimple; a shift of a pointer type.
>
> This just disables this simplification for pointer types similarly
> to what is already done in PHI-OPT for the generic A ? D : 0 case.
>
> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
>
> Thanks,
> Andrew Pinski
>
> gcc/ChangeLog:
> * match.pd ((A & C) != 0 ? D : 0): Limit to non pointer types.
>
> gcc/testsuite/ChangeLog:
> * testsuite/gcc.dg/gimplefe-45.c: New testcase.
> ---
>  gcc/match.pd                       |  2 +-
>  gcc/testsuite/gcc.dg/gimplefe-45.c | 19 +++++++++++++++++++
>  2 files changed, 20 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.dg/gimplefe-45.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index cdb87636951..10503b97ab5 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -4830,7 +4830,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>   (cond
>    (ne (bit_and @0 integer_pow2p@1) integer_zerop)
>    INTEGER_CST@2 integer_zerop)
> - (if (integer_pow2p (@2))
> + (if (!POINTER_TYPE_P (type) && integer_pow2p (@2))

Might be more natural to check INTEGRAL_TYPE_P (type) && integer_pow2p (@2)

OK either way.

Richard.

>    (with {
>       int shift = (wi::exact_log2 (wi::to_wide (@2))
>                   - wi::exact_log2 (wi::to_wide (@1)));
> diff --git a/gcc/testsuite/gcc.dg/gimplefe-45.c 
> b/gcc/testsuite/gcc.dg/gimplefe-45.c
> new file mode 100644
> index 00000000000..b1d3cbb0205
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/gimplefe-45.c
> @@ -0,0 +1,19 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fgimple" } */
> +
> +/* This used to ICE when simplifying (A & C) != 0 ? D : 0
> +   for pointer types. */
> +
> +int *__GIMPLE ()
> +p (int n)
> +{
> +  int *_2;
> +  int *_t;
> +  int *_t1;
> +  _t = (int*)8;
> +  _t1 = 0;
> +  n = n & 2;
> +  _2 = n != 0 ? _t : _t1;
> +  return _2;
> +}
> +
> --
> 2.27.0
>

Reply via email to