For example, I think the things it does which are sensible for most people are:
* Rounding subnormals to zero
* Disabling signed zeroes
* Disables support for 'trapping' (throwing SIGFPE)
Then there are the 'middle' things, which annoy some people:
* Allow associative operations, and things like sqrt(xy)=sqrt(x)sqrt(y), exp(x)*exp(y)=exp(x+y)
However, it also (which I often find break code) assumes no operation will make a NaN or an Infinity -- these last two don't really help, and also break code in confusing ways. This being gcc, they don't just change things like std::isnan or std::isinf into an 'abort' (which would make sense, in -ffast-math they don't make sense), they just return nonsense instead.