https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115710
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Known to work| |5.5.0 Summary|fortran complex abs does |[11/12/13/14/15 Regression] |not vectorise |complex abs does not | |vectorise Target Milestone|--- |11.5 Keywords| |needs-bisection Known to fail| |6.1.0 --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So before forwprop3 we have: ``` _10 = REALPART_EXPR <*_3>; _9 = IMAGPART_EXPR <*_3>; _4 = COMPLEX_EXPR <_10, _9>; _5 = cabs (_4); _6 = _1 * 8; _7 = b_14(D) + _6; reassocpow_18 = __builtin_powi (_5, 2); ``` After we get: ``` _10 = REALPART_EXPR <*_3>; _4 = *_3; _9 = IMAGPART_EXPR <*_3>; _5 = cabs (_4); _6 = _1 * 8; _7 = b_14(D) + _6; reassocpow_18 = __builtin_powi (_5, 2); ``` Which undoes complex lowering. But then powcabs does: ``` _10 = REALPART_EXPR <*_3>; _4 = *_3; _9 = IMAGPART_EXPR <*_3>; cabs_8 = REALPART_EXPR <_4>; cabs_17 = cabs_8 * cabs_8; cabs_22 = IMAGPART_EXPR <_4>; cabs_23 = cabs_22 * cabs_22; cabs_24 = cabs_17 + cabs_23; powroot_25 = __builtin_sqrt (cabs_24); _5 = powroot_25; _6 = _1 * 8; _7 = b_14(D) + _6; powmult_26 = _5 * _5; reassocpow_18 = powmult_26; *_7 = reassocpow_18; ``` Which redoes some of the complex lowering but misses undoing the undo of COMPLEX_EXPR<REAL<*3>, IMAG<*3>> ... This is a regression even as GCC 5 used to be able top vectorize it.