[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