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