[clang] 96515df - [PowerPC] Fix the check for scalar MASS conversion

Masoud Ataei via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 6 11:44:40 PDT 2022


Author: Masoud Ataei
Date: 2022-07-06T11:44:00-07:00
New Revision: 96515df816ebc3af2a632669a26374745e98b0c5

URL: https://github.com/llvm/llvm-project/commit/96515df816ebc3af2a632669a26374745e98b0c5
DIFF: https://github.com/llvm/llvm-project/commit/96515df816ebc3af2a632669a26374745e98b0c5.diff

LOG: [PowerPC] Fix the check for scalar MASS conversion

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

Added: 
    clang/test/CodeGen/lower-mass-end-to-end.c

Modified: 
    llvm/lib/Target/PowerPC/PPCISelLowering.cpp
    llvm/lib/Target/PowerPC/PPCISelLowering.h

Removed: 
    


################################################################################
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
index 0000000000000..23e50ebc48e91
--- /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.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 5b9d1e66b04e5..3c461a627d61c 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -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))

diff  --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h
index f92a117fe27fd..4a08cc42fa9d7 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.h
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h
@@ -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,


        


More information about the cfe-commits mailing list