Author: Krzysztof Parzyszek Date: 2021-12-23T15:18:08-08:00 New Revision: a67c0fc1fbe8479eb5b3d7c189395bfe6cb98086
URL: https://github.com/llvm/llvm-project/commit/a67c0fc1fbe8479eb5b3d7c189395bfe6cb98086 DIFF: https://github.com/llvm/llvm-project/commit/a67c0fc1fbe8479eb5b3d7c189395bfe6cb98086.diff LOG: [Hexagon] Revamp HVX flag verification in driver Generalize warning/error messages (for reuse), refactor flag verification code, rewrite HVX flag driver testcase. Added: Modified: clang/include/clang/Basic/DiagnosticDriverKinds.td clang/lib/Driver/ToolChains/Hexagon.cpp clang/test/Driver/hexagon-hvx-ieee-fp.c clang/test/Driver/hexagon-hvx-qfloat.c clang/test/Driver/hexagon-hvx.c clang/test/Driver/hexagon-vectorize.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index c623aeff11f05..a7fd2f26478cf 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -443,16 +443,13 @@ def err_analyzer_checker_option_invalid_input : Error< def err_analyzer_checker_incompatible_analyzer_option : Error< "checker cannot be enabled with analyzer option '%0' == %1">; -def err_drv_invalid_hvx_length : Error< - "-mhvx-length is not supported without a -mhvx/-mhvx= flag">; -def warn_drv_vectorize_needs_hvx : Warning< - "auto-vectorization requires HVX, use -mhvx to enable it">, +def warn_drv_needs_hvx : Warning< + "%0 requires HVX, use -mhvx/-mhvx= to enable it">, InGroup<OptionIgnored>; - -def err_drv_invalid_hvx_qfloat : Error< - "-mhvx-qfloat is not supported without a -mhvx/-mhvx= flag.">; -def err_drv_invalid_arch_hvx_qfloat : Error< - "-mhvx-qfloat is not supported on HVX %0.">; +def err_drv_needs_hvx : Error< + "%0 requires HVX, use -mhvx/-mhvx= to enable it">; +def err_drv_needs_hvx_version : Error< + "%0 is not supported on HVX %1">; def err_drv_module_header_wrong_kind : Error< "header file '%0' input type '%1' does not match type of prior input " diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp index f9785e42025cc..ba3040636604f 100644 --- a/clang/lib/Driver/ToolChains/Hexagon.cpp +++ b/clang/lib/Driver/ToolChains/Hexagon.cpp @@ -26,8 +26,8 @@ using namespace clang; using namespace llvm::opt; // Default hvx-length for various versions. -static StringRef getDefaultHvxLength(StringRef Cpu) { - return llvm::StringSwitch<StringRef>(Cpu) +static StringRef getDefaultHvxLength(StringRef HvxVer) { + return llvm::StringSwitch<StringRef>(HvxVer) .Case("v60", "64b") .Case("v62", "64b") .Case("v65", "64b") @@ -51,63 +51,107 @@ static void handleHVXTargetFeatures(const Driver &D, const ArgList &Args, // Handle HVX warnings. handleHVXWarnings(D, Args); - // Add the +hvx* features based on commandline flags. - StringRef HVXFeature, HVXLength; - - // Handle -mhvx, -mhvx=, -mno-hvx. - if (Arg *A = Args.getLastArg(options::OPT_mno_hexagon_hvx, - options::OPT_mhexagon_hvx, - options::OPT_mhexagon_hvx_EQ)) { - if (A->getOption().matches(options::OPT_mno_hexagon_hvx)) - return; - if (A->getOption().matches(options::OPT_mhexagon_hvx_EQ)) { - HasHVX = true; - HVXFeature = Cpu = A->getValue(); - HVXFeature = Args.MakeArgString(llvm::Twine("+hvx") + HVXFeature.lower()); - } else if (A->getOption().matches(options::OPT_mhexagon_hvx)) { - HasHVX = true; - HVXFeature = Args.MakeArgString(llvm::Twine("+hvx") + Cpu); + auto makeFeature = [&Args](Twine T, bool Enable) -> StringRef { + const std::string &S = T.str(); + StringRef Opt(S); + if (Opt.endswith("=")) + Opt = Opt.drop_back(1); + if (Opt.startswith("mno-")) + Opt = Opt.drop_front(4); + else if (Opt.startswith("m")) + Opt = Opt.drop_front(1); + return Args.MakeArgString(Twine(Enable ? "+" : "-") + Twine(Opt)); + }; + + auto withMinus = [](StringRef S) -> std::string { + return "-" + S.str(); + }; + + // Drop tiny core suffix for HVX version. + std::string HvxVer = + (Cpu.back() == 'T' || Cpu.back() == 't' ? Cpu.drop_back(1) : Cpu).str(); + HasHVX = false; + + // Handle -mhvx, -mhvx=, -mno-hvx. If both present, -mhvx= wins over -mhvx. + auto argOrNull = [&Args](auto FlagOn, auto FlagOff) -> Arg* { + if (Arg *A = Args.getLastArg(FlagOn, FlagOff)) { + if (A->getOption().matches(FlagOn)) + return A; } - Features.push_back(HVXFeature); + return nullptr; + }; + + Arg *HvxBareA = + argOrNull(options::OPT_mhexagon_hvx, options::OPT_mno_hexagon_hvx); + Arg *HvxVerA = + argOrNull(options::OPT_mhexagon_hvx_EQ, options::OPT_mno_hexagon_hvx); + + if (Arg *A = HvxVerA ? HvxVerA : HvxBareA) { + if (A->getOption().matches(options::OPT_mhexagon_hvx_EQ)) + HvxVer = StringRef(A->getValue()).lower(); // lower produces std:string + HasHVX = true; + Features.push_back(makeFeature(Twine("hvx") + HvxVer, true)); + } else if (Arg *A = Args.getLastArg(options::OPT_mno_hexagon_hvx)) { + // If there was an explicit -mno-hvx, add -hvx to target features. + Features.push_back(makeFeature(A->getOption().getName(), false)); } + StringRef HvxLen = getDefaultHvxLength(HvxVer); + // Handle -mhvx-length=. if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_length_EQ)) { // These flags are valid only if HVX in enabled. if (!HasHVX) - D.Diag(diag::err_drv_invalid_hvx_length); + D.Diag(diag::err_drv_needs_hvx) << withMinus(A->getOption().getName()); else if (A->getOption().matches(options::OPT_mhexagon_hvx_length_EQ)) - HVXLength = A->getValue(); + HvxLen = A->getValue(); } - // Default hvx-length based on Cpu. - else if (HasHVX) - HVXLength = getDefaultHvxLength(Cpu); - - if (!HVXLength.empty()) { - HVXFeature = - Args.MakeArgString(llvm::Twine("+hvx-length") + HVXLength.lower()); - Features.push_back(HVXFeature); + + if (HasHVX) { + StringRef L = makeFeature(Twine("hvx-length") + HvxLen.lower(), true); + Features.push_back(L); } - // Handle -mhvx-qfloat. - // QFloat is valid only on HVX v68/v68+ as of now. - unsigned short CpuVer; - Cpu.drop_front(1).getAsInteger(10, CpuVer); - if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_qfloat, - options::OPT_mno_hexagon_hvx_qfloat)) { - if (A->getOption().matches(options::OPT_mno_hexagon_hvx_qfloat)) { - StringRef OptName = A->getOption().getName().substr(4); - Features.push_back(Args.MakeArgString("-" + OptName)); - return; + unsigned HvxVerNum; + // getAsInteger returns 'true' on error. + if (StringRef(HvxVer).drop_front(1).getAsInteger(10, HvxVerNum)) + HvxVerNum = 0; + + // Handle HVX floating point flags. + auto checkFlagHvxVersion = [&](auto FlagOn, auto FlagOff, + unsigned MinVerNum) -> Optional<StringRef> { + // Return an Optional<StringRef>: + // - None indicates a verification failure, or that the flag was not + // present in Args. + // - Otherwise the returned value is that name of the feature to add + // to Features. + Arg *A = Args.getLastArg(FlagOn, FlagOff); + if (!A) + return None; + + StringRef OptName = A->getOption().getName(); + if (A->getOption().matches(FlagOff)) + return makeFeature(OptName, false); + + if (!HasHVX) { + D.Diag(diag::err_drv_needs_hvx) << withMinus(OptName); + return None; + } + if (HvxVerNum < MinVerNum) { + D.Diag(diag::err_drv_needs_hvx_version) + << withMinus(OptName) << ("v" + std::to_string(HvxVerNum)); + return None; } - StringRef OptName = A->getOption().getName().substr(1); - if (HasHVX) { - if (CpuVer >= 68) - Features.push_back(Args.MakeArgString("+" + OptName)); - else - D.Diag(diag::err_drv_invalid_arch_hvx_qfloat) << Cpu; - } else - D.Diag(diag::err_drv_invalid_hvx_qfloat); + return makeFeature(OptName, true); + }; + + if (auto F = checkFlagHvxVersion(options::OPT_mhexagon_hvx_qfloat, + options::OPT_mno_hexagon_hvx_qfloat, 68)) { + Features.push_back(*F); + } + if (auto F = checkFlagHvxVersion(options::OPT_mhexagon_hvx_ieee_fp, + options::OPT_mno_hexagon_hvx_ieee_fp, 68)) { + Features.push_back(*F); } } @@ -138,7 +182,7 @@ void hexagon::getHexagonTargetFeatures(const Driver &D, const ArgList &Args, handleHVXTargetFeatures(D, Args, Features, Cpu, HasHVX); if (HexagonToolChain::isAutoHVXEnabled(Args) && !HasHVX) - D.Diag(diag::warn_drv_vectorize_needs_hvx); + D.Diag(diag::warn_drv_needs_hvx) << "auto-vectorization"; } // Hexagon tools start. diff --git a/clang/test/Driver/hexagon-hvx-ieee-fp.c b/clang/test/Driver/hexagon-hvx-ieee-fp.c index acc9a910f0f12..cd6e11ef06fe2 100644 --- a/clang/test/Driver/hexagon-hvx-ieee-fp.c +++ b/clang/test/Driver/hexagon-hvx-ieee-fp.c @@ -12,3 +12,14 @@ // RUN: -mno-hvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-NO-IEEEFP %s // CHECK-NO-IEEEFP: "-target-feature" "-hvx-ieee-fp" +// IEEE-FP is valid only on hvxv68 and hvxv68+. +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx=v66 \ +// RUN: -mhvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-ERROR1 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-ERROR1 %s +// CHECK-ERROR1: error: -mhvx-ieee-fp is not supported on HVX v66 + +// IEEE-FP is valid only if HVX is enabled. +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-ERROR2 %s +// CHECK-ERROR2: error: -mhvx-ieee-fp requires HVX, use -mhvx/-mhvx= to enable it diff --git a/clang/test/Driver/hexagon-hvx-qfloat.c b/clang/test/Driver/hexagon-hvx-qfloat.c index 698451aae58ff..fc647f7b06abd 100644 --- a/clang/test/Driver/hexagon-hvx-qfloat.c +++ b/clang/test/Driver/hexagon-hvx-qfloat.c @@ -12,14 +12,14 @@ // RUN: -mno-hvx-qfloat 2>&1 | FileCheck -check-prefix=CHECK-NO-QFLOAT %s // CHECK-NO-QFLOAT: "-target-feature" "-hvx-qfloat" -// QFloat is valid only on hvxv68 and hvxv68+. +// QFloat is valid only on hvxv68+. // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx=v66 \ // RUN: -mhvx-qfloat 2>&1 | FileCheck -check-prefix=CHECK-ERROR1 %s // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx -mhvx-qfloat \ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-ERROR1 %s -// CHECK-ERROR1: error: -mhvx-qfloat is not supported on HVX v66. +// CHECK-ERROR1: error: -mhvx-qfloat is not supported on HVX v66 // QFloat is valid only if HVX is enabled. // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx-qfloat \ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-ERROR2 %s -// CHECK-ERROR2: error: -mhvx-qfloat is not supported without a -mhvx/-mhvx= flag. +// CHECK-ERROR2: error: -mhvx-qfloat requires HVX, use -mhvx/-mhvx= to enable it diff --git a/clang/test/Driver/hexagon-hvx.c b/clang/test/Driver/hexagon-hvx.c index aab7e329471b8..10bb8fe9327f0 100644 --- a/clang/test/Driver/hexagon-hvx.c +++ b/clang/test/Driver/hexagon-hvx.c @@ -2,117 +2,227 @@ // Tests for the hvx features and warnings. // ----------------------------------------------------------------------------- -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX165 %s -// CHECKHVX165: "-target-feature" "+hvxv65" +// No HVX without -mhvx/-mhvx= + +// CHECK-HVX-ON: "-target-feature" "+hvx +// CHECK-HVX-ON-NOT: "-target-feature" "-hvx +// CHECK-HVX-OFF-NOT: "-target-feature" "+hvx + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv5 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv55 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv67 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv67t \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s + +// Infer HVX version from flag: + +// CHECK-HVX-V60: "-target-feature" "+hvxv60" +// CHECK-HVX-V62: "-target-feature" "+hvxv62" +// CHECK-HVX-V65: "-target-feature" "+hvxv65" +// CHECK-HVX-V66: "-target-feature" "+hvxv66" +// CHECK-HVX-V67: "-target-feature" "+hvxv67" +// CHECK-HVX-V68: "-target-feature" "+hvxv68" +// CHECK-HVX-V69: "-target-feature" "+hvxv69" + +// Direct version flag: +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v60 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V60 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v62 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V62 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v65 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V65 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v66 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V66 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v67 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v68 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V68 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V69 %s + +// Direct version flag with diff erent CPU version: +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v60 -mv62 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V60 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v62 -mv65 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V62 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v65 -mv66 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V65 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v66 -mv67 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V66 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v67 -mv68 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v68 -mv69 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V68 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 -mv60 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V69 %s + +// Direct version flag with diff erent CPU version and versionless -mhvx: +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v60 -mv62 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V60 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v62 -mv65 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V62 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v65 -mv66 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V65 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v66 -mv67 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V66 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v67 -mv68 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v68 -mv69 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V68 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 -mv60 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V69 %s + +// Direct version flag with diff erent CPU version, versionless -mhvx +// and -mno-hvx. The -mno-hvx cancels -mhvx=, versionless -mhvx wins: +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v60 -mno-hvx -mv62 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V62 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v62 -mno-hvx -mv65 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V65 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v65 -mno-hvx -mv66 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V66 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v66 -mno-hvx -mv67 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v67 -mno-hvx -mv68 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V68 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v68 -mno-hvx -mv69 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V69 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 -mno-hvx -mv60 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V60 %s + +// Direct version flag with diff erent CPU version, versionless -mhvx +// and -mno-hvx. The -mno-hvx cancels versionless -mhvx, -mhvx= wins: +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mhvx -mno-hvx -mhvx=v60 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V60 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 -mhvx -mno-hvx -mhvx=v62 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V62 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx -mno-hvx -mhvx=v65 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V65 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv67 -mhvx -mno-hvx -mhvx=v66 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V66 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx -mno-hvx -mhvx=v67 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mno-hvx -mhvx=v68 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V68 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx -mno-hvx -mhvx=v69 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V69 %s + +// Infer HVX version from CPU version: +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V60 %s // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX162 %s -// CHECKHVX162: "-target-feature" "+hvxv62" - +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V62 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V65 %s // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX166 %s -// CHECKHVX166: "-target-feature" "+hvxv66" +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V66 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv67 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv67t -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V67 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V68 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-V69 %s + +// Infer HVX length from flag: + +// CHECK-HVX-L64: "-target-feature" "+hvx-length64b" +// CHECK-HVX-L64-NOT: "-target-feature" "+hvx-length128b" +// CHECK-HVX-L128: "-target-feature" "+hvx-length128b" +// CHECK-HVX-L128-NOT: "-target-feature" "+hvx-length64b" + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx -mhvx-length=64b \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L64 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx -mhvx-length=128b \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L128 %s + +// Infer HVX length from HVX version: + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v60 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L64 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v62 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L64 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v65 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L64 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v66 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L128 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v67 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L128 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v68 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L128 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-L128 %s + +// No HVX with trailing -mno-hvx + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 -mno-hvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mno-hvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx=v69 -mhvx-length=128b -mno-hvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-qfloat -mno-hvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s + +// Float + +// CHECK-HVX-QFLOAT-ON: "-target-feature" "+hvx-qfloat" +// CHECK-HVX-QFLOAT-OFF-NOT: "-target-feature" "+hvx-qfloat" +// CHECK-HVX-IEEE-ON: "-target-feature" "+hvx-ieee-fp" +// CHECK-HVX-IEEE-OFF-NOT: "-target-feature" "+hvx-ieee-fp" + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-QFLOAT-ON %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mno-hvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-QFLOAT-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mno-hvx-qfloat -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-QFLOAT-ON %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-qfloat -mno-hvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-QFLOAT-OFF %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 -mhvx \ -// RUN: -mhvx-length=128B 2>&1 | FileCheck -check-prefix=CHECKHVX2 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-IEEE-ON %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mno-hvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-IEEE-OFF %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mno-hvx-ieee-fp -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-IEEE-ON %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-ieee-fp -mno-hvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-IEEE-OFF %s + +// HVX flags heed HVX: + +// CHECK-NEEDS-HVX: error: {{.*}} requires HVX, use -mhvx/-mhvx= to enable it + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx-length=64b \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx-length=128b \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mhvx \ -// RUN: -mhvx-length=128B 2>&1 | FileCheck -check-prefix=CHECKHVX2 %s +// Invalid HVX length: + +// CHECK-HVX-BAD-LENGTH: error: unsupported argument '{{.*}}' to option 'mhvx-length=' -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mhvx \ -// RUN: -mhvx-length=128b 2>&1 | FileCheck -check-prefix=CHECKHVX2 %s -// CHECKHVX2-NOT: "-target-feature" "+hvx-length64b" -// CHECKHVX2: "-target-feature" "+hvx-length128b" - -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 2>&1 \ -// RUN: | FileCheck -check-prefix=CHECKHVX3 %s - -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 2>&1 \ -// RUN: | FileCheck -check-prefix=CHECKHVX3 %s -// CHECKHVX3-NOT: "-target-feature" "+hvx - -// No hvx target feature must be added if -mno-hvx occurs last -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mno-hvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NOHVX %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mhvx -mno-hvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NOHVX %s -// CHECK-NOHVX-NOT: "-target-feature" "+hvx - -// No hvx-ieee-fp target feature must be added if -mno-hvx-ieee-fp occurs last -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp -mno-hvx \ -// RUN: -mno-hvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-NOHVX-IEEE-FP %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp -mhvx \ -// RUN: -mno-hvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-HVX-NOHVX-IEEE-FP %s -// -// CHECK-NOHVX-IEEE-FP-NOT: "-target-feature" "+hvx-ieee-fp" -// CHECK-HVX-NOHVX-IEEE-FP-NOT: "-target-feature" "+hvx-ieee-fp" -// CHECK-HVX-NOHVX-IEEE-FP: "-target-feature" "+hvx -// CHECK-HVX-NOHVX-IEEE-FP-NOT: "-target-feature" "+hvx-ieee-fp" - -// Hvx target feature should be added if -mno-hvx doesn't occur last -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mno-hvx -mhvx\ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXFEAT %s -// CHECK-HVXFEAT: "-target-feature" "+hvxv62" - -// With -mhvx, the version of hvx defaults to Cpu -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-DEFAULT %s -// CHECK-HVX-DEFAULT: "-target-feature" "+hvxv60" - -// Test -mhvx= flag -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx=v62 \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXEQ %s -// CHECK-HVXEQ: "-target-feature" "+hvxv62" - -// Honor the last occurred -mhvx=, -mhvx flag. -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx=v62 -mhvx\ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXEQ-PRE %s -// CHECK-HVXEQ-PRE-NOT: "-target-feature" "+hvxv62" -// CHECK-HVXEQ-PRE: "-target-feature" "+hvxv60" -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx -mhvx=v62\ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXEQ-PRE2 %s -// CHECK-HVXEQ-PRE2-NOT: "-target-feature" "+hvxv60" -// CHECK-HVXEQ-PRE2: "-target-feature" "+hvxv62" - -// Test -mhvx-length flag -// The default mode on v60,v62 is 64B. -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-64B %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx \ -// RUN: -mhvx-length=64b 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-64B %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv60 -mhvx \ -// RUN: -mhvx-length=64B 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-64B %s -// CHECK-HVXLENGTH-64B: "-target-feature" "+hvx{{.*}}" "-target-feature" "+hvx-length64b" -// The default mode on v66 and future archs is 128B. -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-128B %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mhvx -mhvx-length=128B\ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-128B %s -// CHECK-HVXLENGTH-128B: "-target-feature" "+hvx{{.*}}" "-target-feature" "+hvx-length128b" - -// Bail out if -mhvx-length is specified without HVX enabled -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx-length=64B \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-ERROR %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx-length=128B \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-ERROR %s -// CHECK-HVXLENGTH-ERROR: error: -mhvx-length is not supported without a -mhvx/-mhvx= flag - -// Error out if an unsupported value is passed to -mhvx-length. // RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx -mhvx-length=B \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-VALUE-ERROR %s +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-BAD-LENGTH %s // RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx -mhvx-length=128 \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-VALUE-ERROR %s -// CHECK-HVXLENGTH-VALUE-ERROR: error: unsupported argument '{{.*}}' to option 'mhvx-length=' - -// Test -mhvx-ieee-fp flag -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXIEEEFP-LONE %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-ieee-fp \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXIEEEFP %s -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mno-hvx -mhvx-ieee-fp \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXIEEEFP %s -// CHECK-HVXIEEEFP-LONE-NOT: "-target-feature" "+hvx" -// CHECK-HVXIEEEFP-LONE: "-target-feature" "+hvx-ieee-fp" -// CHECK-HVXIEEEFP: "-target-feature" "+hvx-ieee-fp" -// CHECK-HVXIEEEFP-LONE-NOT: "-target-feature" "+hvx" +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-BAD-LENGTH %s diff --git a/clang/test/Driver/hexagon-vectorize.c b/clang/test/Driver/hexagon-vectorize.c index dcd6a09222eb1..6a142e30cd949 100644 --- a/clang/test/Driver/hexagon-vectorize.c +++ b/clang/test/Driver/hexagon-vectorize.c @@ -6,4 +6,4 @@ // CHECK-DEFAULT-NOT: hexagon-autohvx // CHECK-VECTOR: "-mllvm" "-hexagon-autohvx" // CHECK-NOVECTOR-NOT: hexagon-autohvx -// CHECK-NEEDHVX: warning: auto-vectorization requires HVX, use -mhvx to enable it +// CHECK-NEEDHVX: warning: auto-vectorization requires HVX, use -mhvx/-mhvx= to enable it _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits