[PowerPC] Fix the check for scalar MASS conversion
authorMasoud Ataei <msd.ataei@gmail.com>
Wed, 6 Jul 2022 18:44:00 +0000 (11:44 -0700)
committerMasoud Ataei <msd.ataei@gmail.com>
Wed, 6 Jul 2022 18:44:00 +0000 (11:44 -0700)
Proposing to move the check for scalar MASS conversion from constructor
of PPCTargetLowering to the lowerLibCallBase function which decides
about the lowering.

The Target machine option Options.PPCGenScalarMASSEntries is set in
PPCTargetMachine.cpp. But an object of the class PPCTargetLowering
is created in one of the included header files. So, the constructor will run
before setting PPCGenScalarMASSEntries to correct value. So, we cannot
check this option in the constructor.

Differential: https://reviews.llvm.org/D128653
Reviewer: @bmahjour

clang/test/CodeGen/lower-mass-end-to-end.c [new file with mode: 0644]
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/lib/Target/PowerPC/PPCISelLowering.h

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 (file)
index 0000000..23e50eb
--- /dev/null
@@ -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);
+}
index 5b9d1e66b04e5b6fbdea24ffd46888208d5d2811..3c461a627d61c2a8c9bb31388d17424f66a843d9 100644 (file)
@@ -392,8 +392,7 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
 
   // 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 @@ bool PPCTargetLowering::isLowringToMASSSafe(SDValue Op) const {
   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))
index f92a117fe27fd819c7339417a547f19ca7e87621..4a08cc42fa9d794319bfdabb55aef319e7270348 100644 (file)
@@ -1293,6 +1293,7 @@ namespace llvm {
                                     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,