On Fri, 15 Oct 2021, Tamar Christina wrote:
> Hi All,
>
> During testing after rebasing to commit I noticed a failing testcase with the
> bitmask compare patch.
>
> Consider the following C++ testcase:
>
> #include <compare>
>
> #define A __attribute__((noipa))
> A bool f5 (double i, double j) { auto c = i <=> j; return c >= 0; }
>
> This turns into a comparison against chars, on systems where chars are signed
> the pattern inserts an unsigned convert such that it's able to do the
> transformation.
>
> i.e.:
>
> # RANGE [-1, 2]
> # c$_M_value_22 = PHI <-1(3), 0(2), 2(5), 1(4)>
> # RANGE ~[3, 254]
> _11 = (unsigned char) c$_M_value_22;
> _19 = _11 <= 1;
> # .MEM_24 = VDEF <.MEM_6(D)>
> D.10434 ={v} {CLOBBER};
> # .MEM_14 = VDEF <.MEM_24>
> D.10407 ={v} {CLOBBER};
> # VUSE <.MEM_14>
> return _19;
>
> instead of:
>
> # RANGE [-1, 2]
> # c$_M_value_5 = PHI <-1(3), 0(2), 2(5), 1(4)>
> # RANGE [-2, 2]
> _3 = c$_M_value_5 & -2;
> _19 = _3 == 0;
> # .MEM_24 = VDEF <.MEM_6(D)>
> D.10440 ={v} {CLOBBER};
> # .MEM_14 = VDEF <.MEM_24>
> D.10413 ={v} {CLOBBER};
> # VUSE <.MEM_14>
> return _19;
>
> This causes much worse codegen under -ffast-math due to phiops no longer
> recognizing the pattern. It turns out that phiopts spaceship_replacement is
> looking for the exact form that was just changed.
>
> Trying to get it to recognize the new form is not trivial as the
> transformation
> doesn't look to work when the thing it's pointing to is itself a phi-node.
What do you mean? Where it handles the BIT_AND it could also handle
the conversion, no? The later handling would probably more explicitely
need to distinguish between the BIT_AND and the conversion forms.
Jakub?
> Because of these issues this change delays the replacements until after loop
> opts. This fixes the failing C++ testcase.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> x86_64-pc-linux-gnu and no regressions.
>
> Ok for master?
>
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> * match.pd: Delay bitmask compare pattern till after loop opts.
>
> --- inline copy of patch --
> diff --git a/gcc/match.pd b/gcc/match.pd
> index
> 9532cae582e152cae6e22fcce95a9744a844e3c2..d26e498447fc25a327a42cc6a119c6153d09ba03
> 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -4945,7 +4945,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> icmp (le le gt le gt)
> (simplify
> (cmp (bit_and:c@2 @0 cst@1) integer_zerop)
> - (with { tree csts = bitmask_inv_cst_vector_p (@1); }
> + (if (canonicalize_math_after_vectorization_p ())
> + (with { tree csts = bitmask_inv_cst_vector_p (@1); }
> (switch
> (if (csts && TYPE_UNSIGNED (TREE_TYPE (@1))
> && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2)))
> @@ -4954,7 +4955,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> && (cmp == EQ_EXPR || cmp == NE_EXPR)
> && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2)))
> (with { tree utype = unsigned_type_for (TREE_TYPE (@1)); }
> - (icmp (convert:utype @0) { csts; }))))))))
> + (icmp (convert:utype @0) { csts; })))))))))
>
> /* -A CMP -B -> B CMP A. */
> (for cmp (tcc_comparison)
>
>
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)