From 5de91cc35f62342e5eb70175cb3ff5cc5db811c4 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 2 Oct 2012 04:45:10 +0000 Subject: 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 --- clang/test/CodeGen/fp-contract-pragma.cpp | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 clang/test/CodeGen/fp-contract-pragma.cpp (limited to 'clang/test/CodeGen/fp-contract-pragma.cpp') 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 +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(a, b, c); +} -- cgit v1.2.3