diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp --- a/clang/lib/Basic/Targets/PPC.cpp +++ b/clang/lib/Basic/Targets/PPC.cpp @@ -568,11 +568,33 @@ 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 --- /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' +