forked from OSchip/llvm-project
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
// RUN: %clang_cc1 -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;
|
|
}
|