Che tipo di ottimizzazioni sono incluse in -funsafe-math-optimizations?

Che tipo di ottimizzazioni sono incluse in -funsafe-math-optimizations?


La pagina man di GCC afferma che -funsafe-math-optimizations consente ottimizzazioni che "(a) presuppongono che argomenti e risultati siano validi e (b) potrebbero violare gli standard IEEE o ANSI", ma non è molto preciso, vero?


Quale potrebbe essere un argomento "non valido" in questo caso? NaN? Infiniti? Subnormali? Numeri negativi a sqrt() ?


Fino a che punto i risultati possono deviare dagli standard IEEE o ANSI? È "semplicemente" roba come l'associatività e l'ordinamento delle operazioni, o potrebbe includere ad es. confronti veri con NaN o confronti errati con infiniti? Una variabile memorizzata potrebbe essere arrotondata di nuovo dopo essere già stata utilizzata (in modo tale che, per variabili x e y , (x == y) + (x == y) potrebbe valutare a 1)? Potrebbe isinf() /isnan() smetti di lavorare?


Gli sviluppatori del GCC seguono un sistema o una disciplina particolare riguardo a tali domande o la risposta potrebbe differire notevolmente da versione a versione?


Risposte:


Secondo gcc.gnu.org (il mio grassetto ):



Ciò include la tua menzione del riordino associativo, nonché "Funzioni integrate [che] hanno nomi come __builtin_sqrt" applicati quando "possono avere una precisione inferiore o essere limitati a un dominio più piccolo"