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 @@ -447,6 +447,18 @@ static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, const std::vector &FeaturesVec) { + // Cannot allow VSX with no Altivec. + if (llvm::is_contained(FeaturesVec, "-hard-float") && + llvm::is_contained(FeaturesVec, "+altivec")) + Diags.Report(diag::err_opt_not_valid_with_opt) << "-msoft-float" + << "-maltivec"; + + // Cannot allow soft-float with Altivec. + if (llvm::is_contained(FeaturesVec, "+vsx") && + llvm::is_contained(FeaturesVec, "-altivec")) + Diags.Report(diag::err_opt_not_valid_with_opt) << "-mvsx" + << "-mno-altivec"; + // vsx was not explicitly turned off. if (!llvm::is_contained(FeaturesVec, "-vsx")) return true; diff --git a/clang/test/CodeGen/PowerPC/attr-target-ppc.c b/clang/test/CodeGen/PowerPC/attr-target-ppc.c --- a/clang/test/CodeGen/PowerPC/attr-target-ppc.c +++ b/clang/test/CodeGen/PowerPC/attr-target-ppc.c @@ -1,4 +1,5 @@ // RUN: not %clang_cc1 -triple powerpc64le-linux-gnu -emit-llvm %s -o - long __attribute__((target("power8-vector,no-vsx"))) foo (void) { return 0; } // expected-error {{option '-mpower8-vector' cannot be specified with '-mno-vsx'}} - +long __attribute__((target("no-altivec,vsx"))) foo2(void) { return 0; } // expected-error {{option '-mvsx' cannot be specified with '-mno-altivec'}} +long __attribute__((target("no-hard-float,altivec"))) foo3(void) { return 0; } // expected-error {{option '-msoft-float' cannot be specified with '-maltivec'}} diff --git a/clang/test/Driver/ppc-dependent-options.cpp b/clang/test/Driver/ppc-dependent-options.cpp --- a/clang/test/Driver/ppc-dependent-options.cpp +++ b/clang/test/Driver/ppc-dependent-options.cpp @@ -78,6 +78,14 @@ // RUN: -mcpu=power10 -std=c++11 -mno-vsx -mpower10-vector %s 2>&1 | \ // RUN: FileCheck %s -check-prefix=CHECK-NVSX-P10V +// RUN: not %clang -target powerpc64le-unknown-unknown -fsyntax-only \ +// RUN: -std=c++11 -mvsx -mno-altivec %s 2>&1 | \ +// RUN: FileCheck %s -check-prefix=CHECK-NALTI-VSX + +// RUN: not %clang -target powerpc64le-unknown-unknown -fsyntax-only \ +// RUN: -std=c++11 -msoft-float -maltivec %s 2>&1 | \ +// RUN: FileCheck %s -check-prefix=CHECK-SOFTFLT-ALTI + #ifdef __VSX__ static_assert(false, "VSX enabled"); #endif @@ -112,5 +120,7 @@ // CHECK-NVSX-MULTI: error: option '-mfloat128' cannot be specified with '-mno-vsx' // CHECK-NVSX-MULTI: error: option '-mpower9-vector' cannot be specified with '-mno-vsx' // CHECK-NVSX-MMA: error: option '-mmma' cannot be specified with '-mno-vsx' +// CHECK-NALTI-VSX: error: option '-mvsx' cannot be specified with '-mno-altivec' +// CHECK-SOFTFLT-ALTI: error: option '-msoft-float' cannot be specified with '-maltivec' // CHECK-NVSX: Neither enabled // CHECK-VSX: VSX enabled