[clang] 5eaf5b9 - [PowerPC] Restrict various P10 options to P10 only.

Amy Kwan via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 19 07:05:28 PDT 2021


Author: Amy Kwan
Date: 2021-10-19T09:01:01-05:00
New Revision: 5eaf5b916146dff0a02d8d937e88d8fb128640d2

URL: https://github.com/llvm/llvm-project/commit/5eaf5b916146dff0a02d8d937e88d8fb128640d2
DIFF: https://github.com/llvm/llvm-project/commit/5eaf5b916146dff0a02d8d937e88d8fb128640d2.diff

LOG: [PowerPC] Restrict various P10 options to P10 only.

This patch attempts to restrict the following P10 options:
```
-mprefixed
-mpcrel
-mpaired-vector-memops
```
To P10 only. This will prevent the use of these options on P9 and earlier.

The behaviour of this patch looks like the following on pre-P10:
```
$ clang -mcpu=pwr9 -mpaired-vector-memops test.c -o test
error: option '-mpaired-vector-memops' cannot be specified without '-mcpu=pwr10'
$ clang -mcpu=pwr9 -mprefixed test.c -o test
error: option '-mprefixed' cannot be specified without '-mcpu=pwr10'
$ clang -mcpu=pwr9 -mprefixed -mpcrel test.c -o test
error: option '-mpcrel' cannot be specified without '-mcpu=pwr10 -mprefixed'
$ clang -mcpu=pwr9 -mpcrel -mprefixed test.c -o test
error: option '-mpcrel' cannot be specified without '-mcpu=pwr10 -mprefixed'
$ clang -mcpu=pwr9 -mpcrel test.c -o test
error: option '-mpcrel' cannot be specified without '-mcpu=pwr10 -mprefixed'
```

Differential Revision: https://reviews.llvm.org/D109652

Added: 
    clang/test/Driver/ppc-p10-features-support-check.c

Modified: 
    clang/lib/Basic/Targets/PPC.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index da21e97885dec..c3c61ed443ca0 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -568,11 +568,33 @@ bool PPCTargetInfo::initFeatureMap(
     return false;
   }
 
-  if (!(ArchDefs & ArchDefinePwr10) &&
-      llvm::is_contained(FeaturesVec, "+mma")) {
-    // We have MMA on PPC but not power 10 and above.
-    Diags.Report(diag::err_opt_not_valid_with_opt) << "-mmma" << CPU;
-    return false;
+  if (!(ArchDefs & ArchDefinePwr10)) {
+    if (llvm::find(FeaturesVec, "+mma") != FeaturesVec.end()) {
+      // MMA operations are not available pre-Power10.
+      Diags.Report(diag::err_opt_not_valid_with_opt) << "-mmma" << CPU;
+      return false;
+    }
+    if (llvm::find(FeaturesVec, "+pcrel") != FeaturesVec.end()) {
+      // PC-Relative instructions are not available pre-Power10,
+      // and these instructions also require prefixed instructions support.
+      Diags.Report(diag::err_opt_not_valid_without_opt)
+          << "-mpcrel"
+          << "-mcpu=pwr10 -mprefixed";
+      return false;
+    }
+    if (llvm::find(FeaturesVec, "+prefixed") != FeaturesVec.end()) {
+      // Prefixed instructions are not available pre-Power10.
+      Diags.Report(diag::err_opt_not_valid_without_opt) << "-mprefixed"
+                                                        << "-mcpu=pwr10";
+      return false;
+    }
+    if (llvm::find(FeaturesVec, "+paired-vector-memops") != FeaturesVec.end()) {
+      // Paired vector memops are not available pre-Power10.
+      Diags.Report(diag::err_opt_not_valid_without_opt)
+          << "-mpaired-vector-memops"
+          << "-mcpu=pwr10";
+      return false;
+    }
   }
 
   if (!(ArchDefs & ArchDefinePwr8) &&

diff  --git a/clang/test/Driver/ppc-p10-features-support-check.c b/clang/test/Driver/ppc-p10-features-support-check.c
new file mode 100644
index 0000000000000..20812552ee632
--- /dev/null
+++ b/clang/test/Driver/ppc-p10-features-support-check.c
@@ -0,0 +1,65 @@
+// RUN: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=pwr10 -mpaired-vector-memops %s -o - | FileCheck %s \
+// RUN:   --check-prefix=HASPAIRED
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr9 -mpaired-vector-memops %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPAIRED
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mpaired-vector-memops %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPAIRED
+
+// RUN: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=pwr10 -mprefixed %s -o - | FileCheck %s \
+// RUN:   --check-prefix=HASPREFIXED
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr9 -mprefixed %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPREFIXED
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mprefixed %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPREFIXED
+
+// RUN: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=pwr10 -mpcrel %s -o - | FileCheck %s \
+// RUN:   --check-prefix=HASPCREL
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr9 -mpcrel %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPCREL
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mpcrel %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPCREL
+
+// RUN: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=pwr10 -mpcrel -mprefixed %s -o - | FileCheck %s \
+// RUN:   --check-prefix=HASPCREL-PREFIX
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr9 -mpcrel -mprefixed %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPCREL-PREFIX
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mpcrel -mprefixed %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPCREL-PREFIX
+
+int test_p10_features() {
+  return 0;
+}
+
+// HASPAIRED: test_p10_features() #0 {
+// HASPAIRED: attributes #0 = {
+// HASPAIRED-SAME: +paired-vector-memops
+// NOPAIRED: option '-mpaired-vector-memops' cannot be specified without '-mcpu=pwr10'
+
+// HASPREFIXED: test_p10_features() #0 {
+// HASPREFIXED: attributes #0 = {
+// HASPREFIXED-SAME: +prefix-instrs
+// NOPREFIXED: option '-mprefixed' cannot be specified without '-mcpu=pwr10'
+
+// HASPCREL: test_p10_features() #0 {
+// HASPCREL: attributes #0 = {
+// HASPCREL-SAME: +pcrelative-memops
+// NOPCREL: option '-mpcrel' cannot be specified without '-mcpu=pwr10 -mprefixed'
+
+// HASPCREL-PREFIX: test_p10_features() #0 {
+// HASPCREL-PREFIX: attributes #0 = {
+// HASPCREL-PREFIX-SAME: +pcrelative-memops
+// HASPCREL-PREFIX-SAME: +prefix-instrs
+// NOPCREL-PREFIX: option '-mpcrel' cannot be specified without '-mcpu=pwr10 -mprefixed'
+


        


More information about the cfe-commits mailing list