]> granicus.if.org Git - clang/commit
[Driver, CodeGen] pass through and apply -fassociative-math
authorSanjay Patel <spatel@rotateright.com>
Sat, 16 Dec 2017 16:11:17 +0000 (16:11 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sat, 16 Dec 2017 16:11:17 +0000 (16:11 +0000)
commit8e9263d3f406e071eaf94cb46469962d6b17e5d8
treef7f76107e5977c36fe65d846f5f560d3132d9e47
parentd073eeed8abada8922c0566577e94c80a064c48b
[Driver, CodeGen] pass through and apply -fassociative-math

There are 2 parts to getting the -fassociative-math command-line flag translated to LLVM FMF:

1. In the driver/frontend, we accept the flag and its 'no' inverse and deal with the
   interactions with other flags like -ffast-math -fno-signed-zeros -fno-trapping-math.
   This was mostly already done - we just need to translate the flag as a codegen option.
   The test file is complicated because there are many potential combinations of flags here.
   Note that we are matching gcc's behavior that requires 'nsz' and no-trapping-math.

2. In codegen, we map the codegen option to FMF in the IR builder. This is simple code and
   corresponding test.

For the motivating example from PR27372:

float foo(float a, float x) { return ((a + x) - x); }

$ ./clang -O2 27372.c -S -o - -ffast-math  -fno-associative-math -emit-llvm  | egrep 'fadd|fsub'
  %add = fadd nnan ninf nsz arcp contract float %0, %1
  %sub = fsub nnan ninf nsz arcp contract float %add, %2

So 'reassoc' is off as expected (and so is the new 'afn' but that's a different patch).
This case now works as expected end-to-end although the underlying logic is still wrong:

$ ./clang  -O2 27372.c -S -o - -ffast-math  -fno-associative-math | grep xmm
addss %xmm1, %xmm0
subss %xmm1, %xmm0

We're not done because the case where 'reassoc' is set is ignored by optimizer passes. Example:

$ ./clang  -O2 27372.c -S -o - -fassociative-math -fno-signed-zeros -fno-trapping-math -emit-llvm  | grep fadd
  %add = fadd reassoc float %0, %1

$ ./clang -O2  27372.c -S -o - -fassociative-math -fno-signed-zeros -fno-trapping-math | grep xmm
addss %xmm1, %xmm0
subss %xmm1, %xmm0

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@320920 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/Driver/CC1Options.td
include/clang/Frontend/CodeGenOptions.def
lib/CodeGen/CodeGenFunction.cpp
lib/Driver/ToolChains/Clang.cpp
lib/Frontend/CompilerInvocation.cpp
test/CodeGen/finite-math.c
test/Driver/fast-math.c