On Tue, May 12, 2026 at 11:30 PM Richard Biener
<[email protected]> wrote:
>
> On Tue, May 12, 2026 at 11:58 PM Andrew Pinski
> <[email protected]> wrote:
> >
> > Canonicalize `(type) (a CMP b)` to `(a CMP b) ? (type) true : (type) false`
> > for
> > floating point types. fold-const already does this so it makes sense to do
> > it on
> > the gimple level too. This also improves vectorization because a conversion
> > from a comparison to a float does not need to implemented and also if it is
> > implemented then selection of 1.0/0.0 is easier than the conversion would
> > be.
> >
> > Bootstrapped and tested on x86_64-linux-gnu with no regressions.
> >
> > PR tree-optimization/115571
> >
> > gcc/ChangeLog:
> >
> > * match.pd (`(float)(a CMP b)`): New pattern.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * gcc.dg/tree-ssa/float-conv-1.c: New test.
> >
> > Signed-off-by: Andrew Pinski <[email protected]>
> > ---
> > gcc/match.pd | 6 ++++++
> > gcc/testsuite/gcc.dg/tree-ssa/float-conv-1.c | 16 ++++++++++++++++
> > 2 files changed, 22 insertions(+)
> > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/float-conv-1.c
> >
> > diff --git a/gcc/match.pd b/gcc/match.pd
> > index 8dcf8c318cf..6f1c53e5d7b 100644
> > --- a/gcc/match.pd
> > +++ b/gcc/match.pd
> > @@ -2733,6 +2733,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> > )
> > )
> >
> > +/* Canonicalize `(type) (a CMP b)` to `(a CMP b) ? (type) true : (type)
> > false`
> > + for floating point types. */
> > +(simplify
> > + (float (convert:s (tcc_comparison@0 @1 @2)))
>
> So we'll never end up with (float (tcc_comparison ...))?
I thought we converted bool to int first but I was wrong.
Testcase for that:
```
float f(float a)
{
bool t = a < 0.5;
return t;
}
```
>
> Patch is OK, I was just curious.
I will add `?` to convert and retest it with an added testcase and
push it tomorrow since the `?` addition is an obvious improvement.
Thanks,
Andrew
>
> Richard.
>
> > + (cond @0 { build_one_cst (type); } { build_zero_cst (type); } ))
> > +
> > /* For integral types with undefined overflow and C != 0 fold
> > x * C EQ/NE y * C into x EQ/NE y. */
> > (for cmp (eq ne)
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/float-conv-1.c
> > b/gcc/testsuite/gcc.dg/tree-ssa/float-conv-1.c
> > new file mode 100644
> > index 00000000000..ffb07c4b94d
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/float-conv-1.c
> > @@ -0,0 +1,16 @@
> > +/* PR tree-optimization/115571 */
> > +/* { dg-do compile } */
> > +/* { dg-options "-O1 -fdump-tree-optimized-raw" } */
> > +
> > +float f(float a)
> > +{
> > + int t = a < 0.5;
> > + return t;
> > +}
> > +
> > +float f0(float a)
> > +{
> > + return (short)(a < 0.5);
> > +}
> > +
> > +/* { dg-final { scan-tree-dump-times "gimple_cond |gimple_assign
> > <cond_expr" 2 "optimized" } } */
> > --
> > 2.43.0
> >