1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
2 
3 float fff(float x, float y) {
4 // CHECK-LABEL: define float @_Z3fffff{{.*}}
5 // CHECK: entry
6 #pragma float_control(except, on)
7   float z;
8   z = z * z;
9   //CHECK: llvm.experimental.constrained.fmul{{.*}}
10   {
11     z = x * y;
12     //CHECK: llvm.experimental.constrained.fmul{{.*}}
13   }
14   {
15 // This pragma has no effect since if there are any fp intrin in the
16 // function then all the operations need to be fp intrin
17 #pragma float_control(except, off)
18     z = z + x * y;
19     //CHECK: llvm.experimental.constrained.fmul{{.*}}
20   }
21   z = z * z;
22   //CHECK: llvm.experimental.constrained.fmul{{.*}}
23   return z;
24 }
25 float check_precise(float x, float y) {
26   // CHECK-LABEL: define float @_Z13check_preciseff{{.*}}
27   float z;
28   {
29 #pragma float_control(precise, on)
30     z = x * y + z;
31     //CHECK: llvm.fmuladd{{.*}}
32   }
33   {
34 #pragma float_control(precise, off)
35     z = x * y + z;
36     //CHECK: fmul fast float
37     //CHECK: fadd fast float
38   }
39   return z;
40 }
41 float fma_test1(float a, float b, float c) {
42 // CHECK-LABEL define float @_Z9fma_test1fff{{.*}}
43 #pragma float_control(precise, on)
44   float x = a * b + c;
45   //CHECK: fmuladd
46   return x;
47 }
48