diff --git a/clang/test/CodeGen/lower-mass-end-to-end.c b/clang/test/CodeGen/lower-mass-end-to-end.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/lower-mass-end-to-end.c @@ -0,0 +1,147 @@ +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -O3 -fapprox-func --target=powerpc64le-unknown-linux-gnu -S %s -o -| FileCheck %s -check-prefix=CHECK-MASS-AFN +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -Ofast --target=powerpc64le-unknown-linux-gnu -S %s -o -| FileCheck %s -check-prefix=CHECK-MASS-FAST +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -O3 -fapprox-func --target=powerpc-ibm-aix-xcoff -S %s -o -| FileCheck %s -check-prefix=CHECK-MASS-AFN +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -Ofast --target=powerpc-ibm-aix-xcoff -S %s -o -| FileCheck %s -check-prefix=CHECK-MASS-FAST + +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass=false -O3 -fapprox-func --target=powerpc64le-unknown-linux-gnu -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-AFN +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass=false -Ofast --target=powerpc64le-unknown-linux-gnu -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-FAST +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass=false -O3 -fapprox-func --target=powerpc-ibm-aix-xcoff -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-AFN +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass=false -Ofast --target=powerpc-ibm-aix-xcoff -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-FAST + +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -O3 -fno-approx-func --target=powerpc64le-unknown-linux-gnu -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-AFN +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -fno-fast-math --target=powerpc64le-unknown-linux-gnu -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-FAST +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -O3 -fno-approx-func --target=powerpc-ibm-aix-xcoff -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-AFN +// RUN: %clang -mllvm -enable-ppc-gen-scalar-mass -fno-fast-math --target=powerpc-ibm-aix-xcoff -S %s -o -| FileCheck %s -check-prefix=CHECK-NO-MASS-FAST + +extern double sin(double a); +extern double cos(double a); +extern double pow(double a, double b); +extern double log(double a); +extern double log10(double a); +extern double exp(double a); +extern float sinf(float a); +extern float cosf(float a); +extern float powf(float a, float b); +extern float logf(float a); +extern float log10f(float a); +extern float expf(float a); + +double sin_f64(double a) { +// CHECK-LABEL: sin_f64 +// CHECK-MASS-FAST: __xl_sin_finite +// CHECK-MASS-AFN: __xl_sin +// CHECK-NO-MASS-FAST-NOT: {{__xl_sin|__xl_sin_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_sin|__xl_sin_finite}} +// CHECK: blr + return sin(a); +} + +double cos_f64(double a) { +// CHECK-LABEL: cos_f64 +// CHECK-MASS-FAST: __xl_cos_finite +// CHECK-MASS-AFN: __xl_cos +// CHECK-NO-MASS-FAST-NOT: {{__xl_cos|__xl_cos_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_cos|__xl_cos_finite}} +// CHECK: blr + return cos(a); +} + +double pow_f64(double a, double b) { +// CHECK-LABEL: pow_f64 +// CHECK-MASS-FAST: __xl_pow_finite +// CHECK-MASS-AFN: __xl_pow +// CHECK-NO-MASS-FAST-NOT: {{__xl_pow|__xl_pow_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_pow|__xl_pow_finite}} +// CHECK: blr + return pow(a, b); +} + +double log_f64(double a) { +// CHECK-LABEL: log_f64 +// CHECK-MASS-FAST: __xl_log_finite +// CHECK-MASS-AFN: __xl_log +// CHECK-NO-MASS-FAST-NOT: {{__xl_log|__xl_log_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_log|__xl_log_finite}} +// CHECK: blr + return log(a); +} + +double log10_f64(double a) { +// CHECK-LABEL: log10_f64 +// CHECK-MASS-FAST: __xl_log10_finite +// CHECK-MASS-AFN: __xl_log10 +// CHECK-NO-MASS-FAST-NOT: {{__xl_log10|__xl_log10_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_log10|__xl_log10_finite}} +// CHECK: blr + return log10(a); +} + +double exp_f64(double a) { +// CHECK-LABEL: exp_f64 +// CHECK-MASS-FAST: __xl_exp_finite +// CHECK-MASS-AFN: __xl_exp +// CHECK-NO-MASS-FAST-NOT: {{__xl_exp|__xl_exp_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_exp|__xl_exp_finite}} +// CHECK: blr + return exp(a); +} + +float sin_f32(float a) { +// CHECK-LABEL: sin_f32 +// CHECK-MASS-FAST: __xl_sinf_finite +// CHECK-MASS-AFN: __xl_sinf +// CHECK-NO-MASS-FAST-NOT: {{__xl_sinf|__xl_sinf_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_sinf|__xl_sinf_finite}} +// CHECK: blr + return sinf(a); +} + +float cos_f32(float a) { +// CHECK-LABEL: cos_f32 +// CHECK-MASS-FAST: __xl_cosf_finite +// CHECK-MASS-AFN: __xl_cosf +// CHECK-NO-MASS-FAST-NOT: {{__xl_cosf|__xl_cosf_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_cosf|__xl_cosf_finite}} +// CHECK: blr + return cosf(a); +} + +float pow_f32(float a, float b) { +// CHECK-LABEL: pow_f32 +// CHECK-MASS-FAST: __xl_powf_finite +// CHECK-MASS-AFN: __xl_powf +// CHECK-NO-MASS-FAST-NOT: {{__xl_pow|__xl_powf_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_pow|__xl_powf_finite}} +// CHECK: blr + return powf(a, b); +} + +float log_f32(float a) { +// CHECK-LABEL: log_f32 +// CHECK-MASS-FAST: __xl_logf_finite +// CHECK-MASS-AFN: __xl_logf +// CHECK-NO-MASS-FAST-NOT: {{__xl_logf|__xl_logf_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_logf|__xl_logf_finite}} +// CHECK: blr + return logf(a); +} + +float log10_f32(float a) { +// CHECK-LABEL: log10_f32 +// CHECK-MASS-FAST: __xl_log10f_finite +// CHECK-MASS-AFN: __xl_log10f +// CHECK-NO-MASS-FAST-NOT: {{__xl_log10f|__xl_log10f_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_log10f|__xl_log10f_finite}} +// CHECK: blr + return log10f(a); +} + +float exp_f32(float a) { +// CHECK-LABEL: exp_f32 +// CHECK-MASS-FAST: __xl_expf_finite +// CHECK-MASS-AFN: __xl_expf +// CHECK-NO-MASS-FAST-NOT: {{__xl_expf|__xl_expf_finite}} +// CHECK-NO-MASS-AFN-NOT: {{__xl_expf|__xl_expf_finite}} +// CHECK: blr + return expf(a); +} diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h --- a/llvm/lib/Target/PowerPC/PPCISelLowering.h +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h @@ -1293,6 +1293,7 @@ SelectionDAG &DAG) const; bool isLowringToMASSFiniteSafe(SDValue Op) const; bool isLowringToMASSSafe(SDValue Op) const; + bool isScalarMASSConversionEnabled() const; SDValue lowerLibCallBase(const char *LibCallDoubleName, const char *LibCallFloatName, const char *LibCallDoubleNameFinite, diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -392,8 +392,7 @@ // MASS transformation for LLVM intrinsics with replicating fast-math flag // to be consistent to PPCGenScalarMASSEntries pass - if (TM.getOptLevel() == CodeGenOpt::Aggressive && - TM.Options.PPCGenScalarMASSEntries) { + if (TM.getOptLevel() == CodeGenOpt::Aggressive) { setOperationAction(ISD::FSIN , MVT::f64, Custom); setOperationAction(ISD::FCOS , MVT::f64, Custom); setOperationAction(ISD::FPOW , MVT::f64, Custom); @@ -17886,13 +17885,17 @@ return Op.getNode()->getFlags().hasApproximateFuncs(); } +bool PPCTargetLowering::isScalarMASSConversionEnabled() const { + return getTargetMachine().Options.PPCGenScalarMASSEntries; +} + SDValue PPCTargetLowering::lowerLibCallBase(const char *LibCallDoubleName, const char *LibCallFloatName, const char *LibCallDoubleNameFinite, const char *LibCallFloatNameFinite, SDValue Op, SelectionDAG &DAG) const { - if (!isLowringToMASSSafe(Op)) + if (!isScalarMASSConversionEnabled() || !isLowringToMASSSafe(Op)) return SDValue(); if (!isLowringToMASSFiniteSafe(Op))