fp-contract-pragma.cpp revision eddb00a704ed39ea781693cf8fcf7cc69a175b95
1// RUN: %clang_cc1 -O3 -emit-llvm -o - %s | FileCheck %s
2
3// Is FP_CONTRACT is honored in a simple case?
4float fp_contract_1(float a, float b, float c) {
5// CHECK: _Z13fp_contract_1fff
6// CHECK: tail call float @llvm.fmuladd
7  #pragma STDC FP_CONTRACT ON
8  return a * b + c;
9}
10
11// Is FP_CONTRACT state cleared on exiting compound statements?
12float fp_contract_2(float a, float b, float c) {
13// CHECK: _Z13fp_contract_2fff
14// CHECK: %[[M:.+]] = fmul float %a, %b
15// CHECK-NEXT: fadd float %[[M]], %c
16  {
17    #pragma STDC FP_CONTRACT ON
18  }
19  return a * b + c;
20}
21
22// Does FP_CONTRACT survive template instatiation?
23class Foo {};
24Foo operator+(Foo, Foo);
25
26template <typename T>
27T template_muladd(T a, T b, T c) {
28  #pragma STDC FP_CONTRACT ON
29  return a * b + c;
30}
31
32float fp_contract_3(float a, float b, float c) {
33// CHECK: _Z13fp_contract_3fff
34// CHECK: tail call float @llvm.fmuladd
35  return template_muladd<float>(a, b, c);
36}
37
38template<typename T> class fp_contract_4 {
39  float method(float a, float b, float c) {
40    #pragma STDC FP_CONTRACT ON
41    return a * b + c;
42    #pragma STDC FP_CONTRACT OFF
43  }
44};
45
46template class fp_contract_4<int>;
47// CHECK: _ZN13fp_contract_4IiE6methodEfff
48// CHECK: tail call float @llvm.fmuladd
49
50// Check file-scoped FP_CONTRACT
51#pragma STDC FP_CONTRACT ON
52float fp_contract_5(float a, float b, float c) {
53// CHECK: _Z13fp_contract_5fff
54// CHECK: tail call float @llvm.fmuladd
55  return a * b + c;
56}
57
58#pragma STDC FP_CONTRACT OFF
59float fp_contract_6(float a, float b, float c) {
60// CHECK: _Z13fp_contract_6fff
61// CHECK: %[[M:.+]] = fmul float %a, %b
62// CHECK-NEXT: fadd float %[[M]], %c
63  return a * b + c;
64}
65
66