On Wed, Aug 26, 2026 at 8:57 AM Dipesh Sharma <[email protected]> wrote: > > Hi, > > This patch aims to address the issue > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126690 > > regtested and bootstrapped on x86_64-linux-gnu. Ok for trunk ? > > gcc/ChangeLog: > PR tree-optimization/126690. > * match.pd: Add patterns to fold CPROJ when nested inside CPROJ or > CABS. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/pr126690.c: New test. > --- > gcc/match.pd | 10 +++++ > gcc/testsuite/gcc.dg/tree-ssa/pr126690.c | 52 ++++++++++++++++++++++++ > 2 files changed, 62 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr126690.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index c7841cab459..a7bf8092d25 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -10186,6 +10186,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (real_isinf (TREE_REAL_CST_PTR (@1))) > { build_complex_inf (type, TREE_REAL_CST_PTR (@1)->sign); })) > > +/* cproj(cproj(x)) -> cproj(x). */ > +(simplify > + (CPROJ (CPROJ @0)) > + (CPROJ @0)) > + > +/* cabs(cproj(x)) -> cabs(x). */ > +(simplify > + (CABS (CPROJ @0)) > + (CABS @0)) > + > (for pows (POW) > sqrts (SQRT) > cbrts (CBRT) > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr126690.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr126690.c > new file mode 100644 > index 00000000000..f4125fef6bc > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr126690.c > @@ -0,0 +1,52 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target c99_runtime } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +__attribute__((noinline)) > +_Complex float > +cproj_idempotentf (_Complex float a) > +{ > + return __builtin_cprojf (__builtin_cprojf (a)); > +} > + > +__attribute__((noinline)) > +_Complex double > +cproj_idempotent (_Complex double a) > +{ > + return __builtin_cproj (__builtin_cproj (a)); > +} > + > +__attribute__((noinline)) > +_Complex long double > +cproj_idempotentl (_Complex long double a) > +{ > + return __builtin_cprojl (__builtin_cprojl (a)); > +} > + > +__attribute__((noinline)) > +float > +cabs_absorbs_cprojf (_Complex float a) > +{ > + return __builtin_cabsf (__builtin_cprojf (a)); > +} > + > +__attribute__((noinline)) > +double > +cabs_absorbs_cproj (_Complex double a) > +{ > + return __builtin_cabs (__builtin_cproj (a)); > +} > + > +__attribute__((noinline)) > +long double > +cabs_absorbs_cprojl (_Complex long double a) > +{ > + return __builtin_cabsl (__builtin_cprojl (a)); > +} > + > +/* { dg-final { scan-tree-dump-not {__builtin_cprojf \(__builtin_cprojf} > "optimized" } } */ > +/* { dg-final { scan-tree-dump-not {__builtin_cproj \(__builtin_cproj} > "optimized" } } */ > +/* { dg-final { scan-tree-dump-not {__builtin_cprojl \(__builtin_cprojl} > "optimized" } } */ > +/* { dg-final { scan-tree-dump-not {__builtin_cabsf \(__builtin_cprojf} > "optimized" } } */ > +/* { dg-final { scan-tree-dump-not {__builtin_cabs \(__builtin_cproj} > "optimized" } } */ > +/* { dg-final { scan-tree-dump-not {__builtin_cabsl \(__builtin_cprojl} > "optimized" } } */
This testcase will pass even before your match.pd patch. Maybe the best way to write this testcase is count the number of cabs/cproj used. > -- > 2.34.1 >
