https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83352
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- It's first canonicalized to <bb 2> [local count: 1073741824]: _4 = ABS_EXPR <a_1(D)>; _2 = __builtin_pow (_4, 3.125e-2); and then expanded again to <bb 2> [local count: 1073741824]: _4 = ABS_EXPR <a_1(D)>; powroot_5 = __builtin_sqrt (_4); powroot_6 = __builtin_sqrt (powroot_5); powroot_7 = __builtin_sqrt (powroot_6); powroot_8 = __builtin_sqrt (powroot_7); powroot_9 = __builtin_sqrt (powroot_8); with -Os you get the library call. /* Attempt to expand the POW as a product of square root chains. Expand the 0.25 case even when otpimising for size. */ if (flag_unsafe_math_optimizations && sqrtfn && hw_sqrt_exists && (speed_p || real_equal (&c, &dconst1_4)) && !HONOR_SIGNED_ZEROS (mode)) { unsigned int max_depth = speed_p ? PARAM_VALUE (PARAM_MAX_POW_SQRT_DEPTH) : 2; tree expand_with_sqrts = expand_pow_as_sqrts (gsi, loc, arg0, arg1, max_depth); if (expand_with_sqrts) return expand_with_sqrts; } limited by --param max-pow-sqrt-depth (the limit is 5 by default).