Have clang use LLVM IR's fast-math flags when in FastMath or FiniteMathOnly modes. Test cases included.
llvm-svn: 169191
This commit is contained in:
parent
084665fa6d
commit
7a167eef2f
@ -22,6 +22,7 @@
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
#include "clang/AST/StmtCXX.h"
|
||||
#include "clang/Frontend/CodeGenOptions.h"
|
||||
#include "llvm/Operator.h"
|
||||
#include "llvm/Intrinsics.h"
|
||||
#include "llvm/MDBuilder.h"
|
||||
#include "llvm/DataLayout.h"
|
||||
@ -46,6 +47,15 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext)
|
||||
TerminateHandler(0), TrapBB(0) {
|
||||
if (!suppressNewContext)
|
||||
CGM.getCXXABI().getMangleContext().startNewFunction();
|
||||
|
||||
llvm::FastMathFlags FMF;
|
||||
if (CGM.getLangOpts().FastMath)
|
||||
FMF.UnsafeAlgebra = true;
|
||||
if (CGM.getLangOpts().FiniteMathOnly) {
|
||||
FMF.NoNaNs = true;
|
||||
FMF.NoInfs = true;
|
||||
}
|
||||
Builder.SetFastMathFlags(FMF);
|
||||
}
|
||||
|
||||
CodeGenFunction::~CodeGenFunction() {
|
||||
|
||||
13
clang/test/CodeGen/fast-math.c
Normal file
13
clang/test/CodeGen/fast-math.c
Normal file
@ -0,0 +1,13 @@
|
||||
// RUN: %clang_cc1 -ffast-math -emit-llvm -o - %s | FileCheck %s
|
||||
typedef unsigned cond_t;
|
||||
|
||||
volatile float f0, f1, f2;
|
||||
|
||||
void foo(void) {
|
||||
// CHECK: define void @foo()
|
||||
|
||||
// CHECK: fadd fast
|
||||
f0 = f1 + f2;
|
||||
|
||||
// CHECK: ret
|
||||
}
|
||||
13
clang/test/CodeGen/finite-math.c
Normal file
13
clang/test/CodeGen/finite-math.c
Normal file
@ -0,0 +1,13 @@
|
||||
// RUN: %clang_cc1 -ffinite-math-only -emit-llvm -o - %s | FileCheck %s
|
||||
typedef unsigned cond_t;
|
||||
|
||||
volatile float f0, f1, f2;
|
||||
|
||||
void foo(void) {
|
||||
// CHECK: define void @foo()
|
||||
|
||||
// CHECK: fadd nnan ninf
|
||||
f0 = f1 + f2;
|
||||
|
||||
// CHECK: ret
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user