diff options
author | Lang Hames <lhames@gmail.com> | 2012-10-02 04:45:10 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2012-10-02 04:45:10 +0000 |
commit | 5de91cc35f62342e5eb70175cb3ff5cc5db811c4 (patch) | |
tree | 23742c6e4f310ba2bf56702f82a3e8ef0e76fd84 /clang/test/CodeGen/fp-contract-pragma.cpp | |
parent | b67c6cc24de76e0d74f932f3534a76f6f939d8a2 (diff) | |
download | bcm5719-llvm-5de91cc35f62342e5eb70175cb3ff5cc5db811c4.tar.gz bcm5719-llvm-5de91cc35f62342e5eb70175cb3ff5cc5db811c4.zip |
Add FP_CONTRACT support for clang.
Clang will now honor the FP_CONTRACT pragma and emit LLVM
fmuladd intrinsics for expressions of the form A * B + C (when they occur in a
single statement).
llvm-svn: 164989
Diffstat (limited to 'clang/test/CodeGen/fp-contract-pragma.cpp')
-rw-r--r-- | clang/test/CodeGen/fp-contract-pragma.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/clang/test/CodeGen/fp-contract-pragma.cpp b/clang/test/CodeGen/fp-contract-pragma.cpp new file mode 100644 index 00000000000..8c51469c473 --- /dev/null +++ b/clang/test/CodeGen/fp-contract-pragma.cpp @@ -0,0 +1,39 @@ +// RUN: %clang_cc1 -O3 -emit-llvm -o - %s | FileCheck %s + +// Is FP_CONTRACT is honored in a simple case? +float fp_contract_1(float a, float b, float c) { +// CHECK: _Z13fp_contract_1fff +// CHECK-NEXT: entry +// CHECK-NEXT: %0 = tail call float @llvm.fmuladd + #pragma STDC FP_CONTRACT ON + return a * b + c; +} + +// Is FP_CONTRACT state cleared on exiting compound statements? +float fp_contract_2(float a, float b, float c) { +// CHECK: _Z13fp_contract_2fff +// CHECK-NEXT: entry +// CHECK-NEXT: %mul = fmul float %a, %b +// CHECK-NEXT: %add = fadd float %mul, %c + { + #pragma STDC FP_CONTRACT ON + } + return a * b + c; +} + +// Does FP_CONTRACT survive template instatiation? +class Foo {}; +Foo operator+(Foo, Foo); + +template <typename T> +T template_muladd(T a, T b, T c) { + #pragma STDC FP_CONTRACT ON + return a * b + c; +} + +float fp_contract_3(float a, float b, float c) { +// CHECK: _Z13fp_contract_3fff +// CHECK-NEXT: entry +// CHECK-NEXT: %0 = tail call float @llvm.fmuladd + return template_muladd<float>(a, b, c); +} |