Hi! The following testcase ICEs since the sincos and vect pass order has been swapped. It is not valid to replace vector sqrt (sqrt (x)) with pow (x, 0.25) because build_real on vector type is invalid (could be handled by using build_uniform_cst and adjusting type passed to build_real) but more importantly because nothing checks if we can actually do vector pow. While we have pow_optab, apparently no target defines it, so it doesn't seem to be worth bothering with for now and the patch just punts on non-scalar sqrts. I think the other simplifications next to it are fine, as they mostly use CBRT which doesn't even have internal function (so is a builtin only and therefore always scalar), or have already pow in the IL (which doesn't have optab and shouldn't be thus vector either). It is true that with <bits/math-vector.h> we do vectorize some calls to pow or cbrt (but don't handle others strangely), but those aren't using internal functions but simd clones and so match.pd doesn't know anything about those (at least for now).
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2023-03-28 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/109301 * match.pd (sqrt (sqrt (x)) -> pow (x, 0.25)): Only simplify for scalar floating point types. * gcc.dg/pr109301.c: New test. --- gcc/match.pd.jj 2023-03-27 10:25:40.171676370 +0200 +++ gcc/match.pd 2023-03-27 21:03:38.816171522 +0200 @@ -6820,7 +6820,8 @@ (define_operator_list SYNC_FETCH_AND_AND /* sqrt(sqrt(x)) -> pow(x,1/4). */ (simplify (sqrts (sqrts @0)) - (pows @0 { build_real (type, dconst_quarter ()); })) + (if (SCALAR_FLOAT_TYPE_P (type)) + (pows @0 { build_real (type, dconst_quarter ()); }))) /* sqrt(cbrt(x)) -> pow(x,1/6). */ (simplify (sqrts (cbrts @0)) --- gcc/testsuite/gcc.dg/pr109301.c.jj 2023-03-27 21:06:22.635806234 +0200 +++ gcc/testsuite/gcc.dg/pr109301.c 2023-03-27 21:06:05.413054906 +0200 @@ -0,0 +1,13 @@ +/* PR tree-optimization/109301 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -ffast-math" } */ + +double x[256]; + +void +foo (void) +{ + for (int i = 0; i < 256; ++i) + for (int j = 0; j < 8; ++j) + x[i] = __builtin_pow (x[i], 0.5); +} Jakub