[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
This commit is contained in:
Amy Kwan 2021-10-18 16:40:31 -05:00
parent 607fb1bb8c
commit 5eaf5b9161
2 changed files with 92 additions and 5 deletions

View File

@ -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) &&

View File

@ -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'