amyk created this revision.
amyk added reviewers: PowerPC, nemanjai, stefanp.
amyk added projects: LLVM, PowerPC.
Herald added subscribers: shchenz, kbarton.
amyk requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This patch attempts to restrict the following P10 
<https://reviews.llvm.org/P10> options:

  -mprefixed
  -mpcrel
  -mpaired-vector-memops

To P10 <https://reviews.llvm.org/P10> only. This will prevent the use of these 
options on P9 <https://reviews.llvm.org/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 '-mprefixed'
  error: option '-mprefixed' cannot be specified without '-mcpu=pwr10'
  
  $ clang -mcpu=pwr9 -mpcrel test.c -o test
  error: option '-mpcrel' cannot be specified without '-mprefixed'


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D109652

Files:
  clang/lib/Basic/Targets/PPC.cpp
  clang/test/Driver/ppc-p10-features-support-check.c

Index: clang/test/Driver/ppc-p10-features-support-check.c
===================================================================
--- /dev/null
+++ clang/test/Driver/ppc-p10-features-support-check.c
@@ -0,0 +1,102 @@
+// 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: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=power10 -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:   -mcpu=pwr8 -mpaired-vector-memops %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPAIRED
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr7 -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: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=power10 -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:   -mcpu=pwr8 -mprefixed %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPREFIXED
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr7 -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: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=power10 -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:   -mcpu=pwr8 -mpcrel %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPCREL
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr7 -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: %clang -target powerpc64le-unknown-linux-gnu -S -emit-llvm  \
+// RUN:   -mcpu=power10 -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:   -mcpu=pwr8 -mpcrel -mprefixed %s 2>&1 | FileCheck %s \
+// RUN:   --check-prefix=NOPCREL-PREFIX
+// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
+// RUN:   -mcpu=pwr7 -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 '-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 '-mprefixed'
+// NOPCREL-PREFIX: option '-mprefixed' cannot be specified without '-mcpu=pwr10'
+
Index: clang/lib/Basic/Targets/PPC.cpp
===================================================================
--- clang/lib/Basic/Targets/PPC.cpp
+++ clang/lib/Basic/Targets/PPC.cpp
@@ -549,11 +549,35 @@
     return false;
   }
 
-  if (!(ArchDefs & ArchDefinePwr10) &&
-      llvm::find(FeaturesVec, "+mma") != FeaturesVec.end()) {
-    // 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()) {
+      // 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 (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 (llvm::find(FeaturesVec, "+prefixed") != FeaturesVec.end()) {
+      if (llvm::find(FeaturesVec, "+pcrel") != FeaturesVec.end()) {
+        Diags.Report(diag::err_opt_not_valid_without_opt) << "-mpcrel"
+                                                          << "-mprefixed";
+      }
+      // 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, "+pcrel") != FeaturesVec.end()) {
+      // To specify PC-Rel, prefixed instructions must be enabled.
+      Diags.Report(diag::err_opt_not_valid_without_opt) << "-mpcrel"
+                                                        << "-mprefixed";
+      return false;
+    }
   }
 
   if (!(ArchDefs & ArchDefinePwr8) &&
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to