blob: 8c51469c47346b85952bfb754cc8dc089e8ee8dc [file] [log] [blame]
Lang Hamesbe9af122012-10-02 04:45:10 +00001// 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-NEXT: entry
7// CHECK-NEXT: %0 = tail call float @llvm.fmuladd
8 #pragma STDC FP_CONTRACT ON
9 return a * b + c;
10}
11
12// Is FP_CONTRACT state cleared on exiting compound statements?
13float fp_contract_2(float a, float b, float c) {
14// CHECK: _Z13fp_contract_2fff
15// CHECK-NEXT: entry
16// CHECK-NEXT: %mul = fmul float %a, %b
17// CHECK-NEXT: %add = fadd float %mul, %c
18 {
19 #pragma STDC FP_CONTRACT ON
20 }
21 return a * b + c;
22}
23
24// Does FP_CONTRACT survive template instatiation?
25class Foo {};
26Foo operator+(Foo, Foo);
27
28template <typename T>
29T template_muladd(T a, T b, T c) {
30 #pragma STDC FP_CONTRACT ON
31 return a * b + c;
32}
33
34float fp_contract_3(float a, float b, float c) {
35// CHECK: _Z13fp_contract_3fff
36// CHECK-NEXT: entry
37// CHECK-NEXT: %0 = tail call float @llvm.fmuladd
38 return template_muladd<float>(a, b, c);
39}