// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s // RUN: %clang_cc1 -verify -DFENV_ON=1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s float fff(float x, float y) { // CHECK-LABEL: define float @_Z3fffff{{.*}} // CHECK: entry #pragma float_control(except, on) float z; z = z * z; //CHECK: llvm.experimental.constrained.fmul{{.*}} { z = x * y; //CHECK: llvm.experimental.constrained.fmul{{.*}} } { // This pragma has no effect since if there are any fp intrin in the // function then all the operations need to be fp intrin #pragma float_control(except, off) z = z + x * y; //CHECK: llvm.experimental.constrained.fmul{{.*}} } z = z * z; //CHECK: llvm.experimental.constrained.fmul{{.*}} return z; } float check_precise(float x, float y) { // CHECK-LABEL: define float @_Z13check_preciseff{{.*}} float z; { #pragma float_control(precise, on) z = x * y + z; //CHECK: llvm.fmuladd{{.*}} } { #pragma float_control(precise, off) z = x * y + z; //CHECK: fmul fast float //CHECK: fadd fast float } return z; } float fma_test1(float a, float b, float c) { // CHECK-LABEL define float @_Z9fma_test1fff{{.*}} #pragma float_control(precise, on) float x = a * b + c; //CHECK: fmuladd return x; } #if FENV_ON // expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}} #pragma STDC FENV_ACCESS ON #endif // CHECK-LABEL: define {{.*}}callt{{.*}} void callt() { volatile float z; z = z * z; //CHECK: = fmul float }