-ffast-math (well, really -funsafe-math-optimizations) is also essential for FP vectorization on ARM CPUs. Compare the generated code of a real-world ARM function with/without funsafe-math-optimizations - https://godbolt.org/g/P4C9qm (after, ~70 instructions) vs https://godbolt.org/g/blAe2q (before, ~270 instructions). As GCC's documentation states (https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html):
If the selected floating-point hardware includes the NEON
extension (e.g. -mfpu=‘neon’), note that floating-point
operations are not generated by GCC's auto-vectorization
pass unless -funsafe-math-optimizations is also specified.
This is because NEON hardware does not fully implement the
IEEE 754 standard for floating-point arithmetic (in
particular denormal values are treated as zero), so the use
of NEON instructions may lead to a loss of precision.