forked from OSchip/llvm-project
[CodeGen] Mark fma as const for Android
Summary: r318093 sets fma, fmaf, fmal as const for Gnu and MSVC. Android also does not set errno for these functions. So mark these const for Android. Reviewers: spatel, efriedma, srhines, chh, enh Subscribers: cfe-commits, llvm-commits Differential Revision: https://reviews.llvm.org/D44852 llvm-svn: 328552
This commit is contained in:
parent
86ea53123d
commit
fbfba29d74
|
@ -13116,11 +13116,11 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
|
||||||
Context.BuiltinInfo.isConstWithoutErrno(BuiltinID))
|
Context.BuiltinInfo.isConstWithoutErrno(BuiltinID))
|
||||||
FD->addAttr(ConstAttr::CreateImplicit(Context, FD->getLocation()));
|
FD->addAttr(ConstAttr::CreateImplicit(Context, FD->getLocation()));
|
||||||
|
|
||||||
// We make "fma" on GNU or Windows const because we know it does not set
|
// We make "fma" on some platforms const because we know it does not set
|
||||||
// errno in those environments even though it could set errno based on the
|
// errno in those environments even though it could set errno based on the
|
||||||
// C standard.
|
// C standard.
|
||||||
const llvm::Triple &Trip = Context.getTargetInfo().getTriple();
|
const llvm::Triple &Trip = Context.getTargetInfo().getTriple();
|
||||||
if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
|
if ((Trip.isGNUEnvironment() || Trip.isAndroid() || Trip.isOSMSVCRT()) &&
|
||||||
!FD->hasAttr<ConstAttr>()) {
|
!FD->hasAttr<ConstAttr>()) {
|
||||||
switch (BuiltinID) {
|
switch (BuiltinID) {
|
||||||
case Builtin::BI__builtin_fma:
|
case Builtin::BI__builtin_fma:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm %s | FileCheck %s -check-prefix=NO__ERRNO
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm %s | FileCheck %s -check-prefix=NO__ERRNO
|
||||||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s -check-prefix=HAS_ERRNO
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s -check-prefix=HAS_ERRNO
|
||||||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown-gnu -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s --check-prefix=HAS_ERRNO_GNU
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown-gnu -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s --check-prefix=HAS_ERRNO_GNU
|
||||||
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown-android -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s --check-prefix=HAS_ERRNO_ANDROID
|
||||||
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s --check-prefix=HAS_ERRNO_WIN
|
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s --check-prefix=HAS_ERRNO_WIN
|
||||||
|
|
||||||
// Test attributes and codegen of math builtins.
|
// Test attributes and codegen of math builtins.
|
||||||
|
@ -296,6 +297,10 @@ void foo(double *d, float f, float *fp, long double *l, int *i, const char *c) {
|
||||||
// HAS_ERRNO_GNU: declare float @llvm.fma.f32(float, float, float) [[READNONE_INTRINSIC]]
|
// HAS_ERRNO_GNU: declare float @llvm.fma.f32(float, float, float) [[READNONE_INTRINSIC]]
|
||||||
// HAS_ERRNO_GNU: declare x86_fp80 @llvm.fma.f80(x86_fp80, x86_fp80, x86_fp80) [[READNONE_INTRINSIC]]
|
// HAS_ERRNO_GNU: declare x86_fp80 @llvm.fma.f80(x86_fp80, x86_fp80, x86_fp80) [[READNONE_INTRINSIC]]
|
||||||
|
|
||||||
|
// HAS_ERRNO_ANDROID: declare double @llvm.fma.f64(double, double, double) [[READNONE_INTRINSIC:#[0-9]+]]
|
||||||
|
// HAS_ERRNO_ANDROID: declare float @llvm.fma.f32(float, float, float) [[READNONE_INTRINSIC]]
|
||||||
|
// HAS_ERRNO_ANDROID: declare x86_fp80 @llvm.fma.f80(x86_fp80, x86_fp80, x86_fp80) [[READNONE_INTRINSIC]]
|
||||||
|
|
||||||
// HAS_ERRNO_WIN: declare double @llvm.fma.f64(double, double, double) [[READNONE_INTRINSIC:#[0-9]+]]
|
// HAS_ERRNO_WIN: declare double @llvm.fma.f64(double, double, double) [[READNONE_INTRINSIC:#[0-9]+]]
|
||||||
// HAS_ERRNO_WIN: declare float @llvm.fma.f32(float, float, float) [[READNONE_INTRINSIC]]
|
// HAS_ERRNO_WIN: declare float @llvm.fma.f32(float, float, float) [[READNONE_INTRINSIC]]
|
||||||
// Long double is just double on win, so no f80 use/declaration.
|
// Long double is just double on win, so no f80 use/declaration.
|
||||||
|
@ -582,5 +587,6 @@ void foo(double *d, float f, float *fp, long double *l, int *i, const char *c) {
|
||||||
// HAS_ERRNO: attributes [[READNONE]] = { {{.*}}readnone{{.*}} }
|
// HAS_ERRNO: attributes [[READNONE]] = { {{.*}}readnone{{.*}} }
|
||||||
|
|
||||||
// HAS_ERRNO_GNU: attributes [[READNONE_INTRINSIC]] = { {{.*}}readnone{{.*}} }
|
// HAS_ERRNO_GNU: attributes [[READNONE_INTRINSIC]] = { {{.*}}readnone{{.*}} }
|
||||||
|
// HAS_ERRNO_ANDROID: attributes [[READNONE_INTRINSIC]] = { {{.*}}readnone{{.*}} }
|
||||||
// HAS_ERRNO_WIN: attributes [[READNONE_INTRINSIC]] = { {{.*}}readnone{{.*}} }
|
// HAS_ERRNO_WIN: attributes [[READNONE_INTRINSIC]] = { {{.*}}readnone{{.*}} }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue