set the underlying value of “#pragma STDC FP_CONTRACT” on by default
authorSebastian Pop <sebpop@gmail.com>
Fri, 23 Sep 2016 16:16:25 +0000 (16:16 +0000)
committerSebastian Pop <sebpop@gmail.com>
Fri, 23 Sep 2016 16:16:25 +0000 (16:16 +0000)
commit6919ae5abc74f897d9bbcff7e198dcf298740e6a
tree059438d0f2b43faf5d90cedcabcd2eff69897920
parent72525622b2f2f558dfd2a5a37577b0f6e3ae16a1
set the underlying value of “#pragma STDC FP_CONTRACT” on by default

Clang has the default FP contraction setting of “-ffp-contract=on”, which
doesn't really mean “on” in the conventional sense of the word, but rather
really means “according to the per-statement effective value of the relevant
pragma”.

Before this patch, Clang has that pragma defaulting to “off”. Since the
“-ffp-contract=on” mode is really an AND of two booleans and the second of them
defaults to “off”, the whole thing effectively defaults to “off”. This patch
changes the default value of the pragma to “on”, thus making the default pair of
booleans (on, on) rather than (on, off). This makes FP optimization slightly
more aggressive than before when not using either “-Ofast”, “-ffast-math”, or
“-ffp-contract=fast”. Even with this patch the compiler still respects
“-ffp-contract=off”.

As per a suggestion by Steve Canon, the added code does _not_ require “-O3” or
higher. This is so as to try our best to preserve identical floating-point
results for unchanged source code compiling for an unchanged target when only
changing from any optimization level in the set (“-O0”, “-O1”, “-O2”, “-O3”) to
any other optimization level in that set. “-Os” and “-Oz” seem to be behaving
identically, i.e. should probably be considered a part of the aforementioned
set, but I have not reviewed this rigorously. “-Ofast” is explicitly _not_ a
member of that set.

Patch authored by Abe Skolnik [a.skolnik@samsung.com] and Stephen Canon [scanon@apple.com].

Differential Revision: https://reviews.llvm.org/D24481

llvm-svn: 282259
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/CodeGen/aarch64-neon-fma.c
clang/test/CodeGen/aarch64-scalar-fma.c [new file with mode: 0644]
clang/test/CodeGen/fp-contract-pragma.cpp
clang/test/CodeGen/fp-contract-pragma___on-by-default.c [new file with mode: 0644]
clang/test/Driver/clang_f_opts.c