Changeset View
Changeset View
Standalone View
Standalone View
clang/test/CodeGen/fp-pragma-template.cpp
- This file was added.
// RUN: %clang_cc1 -S -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s | |||||
// If a pragma is used inside template, it has effect on all instantiations. | |||||
template <typename Ty> | |||||
float func_01(float x, float y) { | |||||
#pragma STDC FENV_ROUND FE_DOWNWARD | |||||
return x + y; | |||||
} | |||||
#pragma STDC FENV_ROUND FE_TONEAREST | |||||
template float func_01<short>(float, float); | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_01IsEfff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.downward", metadata !"fpexcept.ignore") | |||||
float func_02(float x, float y) { | |||||
return func_01<long>(x, y); | |||||
} | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_02ff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: call {{.*}}float @_Z7func_01IlEfff( | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_01IlEfff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.downward", metadata !"fpexcept.ignore") | |||||
template <typename Ty> | |||||
float func_03(float x, float y, float z) { | |||||
#pragma STDC FENV_ROUND FE_TOWARDZERO | |||||
float res = 3.0F * x; | |||||
{ | |||||
#pragma STDC FENV_ROUND FE_UPWARD | |||||
res += y; | |||||
} | |||||
return res - z; | |||||
} | |||||
#pragma STDC FENV_ROUND FE_DOWNWARD | |||||
template float func_03<short>(float, float, float); | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_03IsEffff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: call float @llvm.experimental.constrained.fmul.f32({{.*}}, metadata !"round.towardzero", metadata !"fpexcept.ignore") | |||||
// CHECK: call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.upward", metadata !"fpexcept.ignore") | |||||
// CHECK: call float @llvm.experimental.constrained.fsub.f32({{.*}}, metadata !"round.towardzero", metadata !"fpexcept.ignore") | |||||
// A pragma at file level has the same effect as if the same pragma were | |||||
// specified at the start of each affected function. | |||||
#pragma STDC FENV_ROUND FE_UPWARD | |||||
template <typename Ty> | |||||
float func_04(float x, float y) { | |||||
return x + y; | |||||
} | |||||
#pragma STDC FENV_ROUND FE_TONEAREST | |||||
template float func_04<short>(float, float); | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_04IsEfff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.upward", metadata !"fpexcept.ignore") | |||||
// Explicit instantiation inherits FP features of the point of instantiation, | |||||
// unless they are explicitly overridden by pragmas in the template. | |||||
#pragma STDC FENV_ROUND FE_DYNAMIC | |||||
template <typename Ty> | |||||
float func_05(float x, float y) { | |||||
return x + y; | |||||
} | |||||
#pragma STDC FENV_ROUND FE_DOWNWARD | |||||
template float func_05<short>(float, float); | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_05IsEfff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.downward", metadata !"fpexcept.ignore") | |||||
#pragma STDC FENV_ROUND FE_DYNAMIC | |||||
float func_06(float x, float y) { | |||||
return func_05<long>(x, y); | |||||
} | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_06ff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: call {{.*}}float @_Z7func_05IlEfff( | |||||
// CHECK-LABEL: define {{.*}}float @_Z7func_05IlEfff(float {{.*}}, float {{.*}}) {{.*}}{ | |||||
// CHECK: fadd |