diff options
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); +} |