How to make the optimizer eliminate `fadd zeroinitializer`?

I have the module:

target triple = "x86_64-pc-linux-gnu"

define void @round(<8 x float>*) {
   %1 = load <8 x float>, <8 x float>* %0
   %2 = fadd <8 x float> %1, zeroinitializer
   store <8 x float> %2, <8 x float>* %0
   ret void

Optimizing it with -O3 does not remove the add with zero. Also options like -enable-no-infs-fp-math -enable-no-nans-fp-math -enable-unsafe-fp-math -enable-fp-mad do not eliminate it. I understand that floating point arithmetic exposes strange behavior that disables many obvious simplifications. I cannot see the corner case here. If there exist one, how can I convince 'opt' to remove the add with zero?

Adding ‘fast’ to the fadd should simplify it. Note that adding zero is not a no-op in floating point arithmetic; adding negative zero is.


Ah, that is adding zero to negative zero is the corner case!

It seems that
   opt -enable-no-infs-fp-math adds ninf globally
   opt -enable-no-nans-fp-math adds nnan globally

but I do not see a counterpart for the flags 'nsz', 'arcp' and 'fast'. :frowning: