/* { dg-do compile { target { scalar_all_fma || { i?86-*-* x86_64-*-* } } } } */ /* { dg-options "-Ofast --param avoid-fma-max-bits=512 --param tree-reassoc-width=4 -fdump-tree-widening_mul-details" } */ /* { dg-additional-options "-mcpu=generic" { target aarch64*-*-* } } */ /* { dg-additional-options "-mfma" { target i?86-*-* x86_64-*-* } } */ /* { dg-additional-options "-march=2.0" { target hppa*-*-* } } */ #define LOOP_COUNT 800000000 typedef double data_e; /* Check that FMAs with backedge dependency are avoided. Otherwise there won't be FMA generated with "--param avoid-fma-max-bits=512". */ data_e foo1 (data_e a, data_e b, data_e c, data_e d) { data_e result = 0; for (int ic = 0; ic < LOOP_COUNT; ic++) { result += (a * b + c * d); a -= 0.1; b += 0.9; c *= 1.02; d *= 0.61; } return result; } data_e foo2 (data_e a, data_e b, data_e c, data_e d) { data_e result = 0; for (int ic = 0; ic < LOOP_COUNT; ic++) { result = a * b + result + c * d; a -= 0.1; b += 0.9; c *= 1.02; d *= 0.61; } return result; } data_e foo3 (data_e a, data_e b, data_e c, data_e d) { data_e result = 0; for (int ic = 0; ic < LOOP_COUNT; ic++) { result = result + a * b + c * d; a -= 0.1; b += 0.9; c *= 1.02; d *= 0.61; } return result; } /* { dg-final { scan-tree-dump-times "Generated FMA" 3 "widening_mul" } } */