Hi!
First, you need to adjust after Robin's patch, and retest.
On Thu, Feb 17, 2022 at 01:56:04PM -0500, Michael Meissner wrote:
> Don't do int cmoves for IEEE comparisons, PR target/104256.
> Unfortunately there are some conditions like UNLE that can't easily be
> reversed
> due to NaNs.
What do you mean? The reverse of UNLE is GT. You don't even need to
check if fast-math is active, or whether this is FP at all -- that is a
*given* if you see UNLE!
You need more context to reverse GT. For fast-math and integer that
gives LE, for fp it is UNLE.
> The patch changes the code so that it does the reversal before generating the
> comparison. If the comparison cannot be reversed, it just returns false,
> which indicates that we can't do an int conditional move in this case.
> + /* Swap the comparison if isel can't handle it directly. Don't generate
> int
> + cmoves if we can't swap the condition code due to NaNs. */
"swap" has a specific meaning for comparisons, and this isn't it (it
refers to swapping the arguments).
You can do the reverse condition for all codes that include UN just
fine. reversed_comparison knows how to do this.
> + enum rtx_code op_code = GET_CODE (op);
> + if (op_code != LT && op_code != GT && op_code != LTU && op_code != GTU
> + && op_code != EQ)
There are functions to test this. Perhaps scc_comparison_operator
and exclude unordered? But, this seems wrong, as said.
> - switch (cond_code)
> - {
> - case LT: case GT: case LTU: case GTU: case EQ:
> - /* isel handles these directly. */
> - break;
Ah, you got that from existing code. Well, a good chance to improve
things, isn't it :-)
> new file mode 100644
> index 00000000000..d1bfab23482
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/ppc-fortran/pr104254.f90
> @@ -0,0 +1,25 @@
> +! { dg-do compile }
> +! { dg-require-effective-target powerpc_p9vector_ok }
> +! { dg-options "-mdejagnu-cpu=power9 -O1 -fnon-call-exceptions" }
> +
> +! PR target/104254. GCC would raise an assertion error if this program was
PR104256.
Segher