craig.topper updated this revision to Diff 123614. craig.topper added a comment.
Address comments. The value of 'none' is intended to cancel out any other option specified. I've changed it so that we no longer pass 'none' to llvm and instead suppress the attribute. https://reviews.llvm.org/D40230 Files: docs/ClangCommandLineReference.rst include/clang/Driver/Options.td include/clang/Frontend/CodeGenOptions.h lib/CodeGen/CGCall.cpp lib/Driver/ToolChains/Clang.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGen/attr-mprefer-vector-width.c test/Driver/mprefer-vector-width.c
Index: test/Driver/mprefer-vector-width.c =================================================================== --- /dev/null +++ test/Driver/mprefer-vector-width.c @@ -0,0 +1,24 @@ +//// +//// Verify that valid options for the -mprefer-vector-width flag are passed through and invalid options cause an error. +//// + +//// If there are no options, convert to 'all'. + +// RUN: %clang -### -S %s -mprefer-vector-width=none 2>&1 | FileCheck --check-prefix=WIDTHNONE %s +// WIDTHNONE: "-mprefer-vector-width=none" + +//// Check options that cover all types. + +// RUN: %clang -### -S %s -mprefer-vector-width=128 2>&1 | FileCheck --check-prefix=WIDTH128 %s +// WIDTH128: "-mprefer-vector-width=128" + +//// Check invalid parameters. + +// RUN: %clang -### -S %s -mprefer-vector-width=one 2>&1 | FileCheck --check-prefix=WIDTHONE %s +// WIDTHONE: invalid value 'one' in 'mprefer-vector-width=' + +// RUN: %clang -### -S %s -mprefer-vector-width=128.5 2>&1 | FileCheck --check-prefix=WIDTH128p5 %s +// WIDTH128p5: invalue value '128.5' in 'mprefer-vector-width=' + +// RUN: %clang -### -S %s -mprefer-vector-width=-128 2>&1 | FileCheck --check-prefix=WIDTHNEG128 %s +// WIDTHNEG128: invalid value '-128' in 'mprefer-vector-width=' Index: test/CodeGen/attr-mprefer-vector-width.c =================================================================== --- /dev/null +++ test/CodeGen/attr-mprefer-vector-width.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -mprefer-vector-width=128 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK128 +// RUN: %clang_cc1 -mprefer-vector-width=256 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK256 +// RUN: %clang_cc1 -mprefer-vector-width=none -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECKNONE + +int baz(int a) { return 4; } + +// CHECK128: baz{{.*}} #0 +// CHECK128: #0 = {{.*}}"prefer-vector-width"="128" + +// CHECK256: baz{{.*}} #0 +// CHECK256: #0 = {{.*}}"prefer-vector-width"="256" + +// CHECKNONE: baz{{.*}} #0 +// CHECKNONE-NOT: #0 = {{.*}}"prefer-vector-width"="none" Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -713,6 +713,8 @@ Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops); Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp); + Opts.PreferVectorWidth = Args.getLastArgValue(OPT_mprefer_vector_width_EQ); + Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name); Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier); Index: lib/Driver/ToolChains/Clang.cpp =================================================================== --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -274,6 +274,27 @@ OutStrings.push_back(Args.MakeArgString(Out)); } +/// The -mprefer-vector-width option accepts either a positive integer +/// or the string "none". +static void ParseMPreferVectorWidth(const Driver &D, const ArgList &Args, + ArgStringList &CmdArgs) { + Arg *A = Args.getLastArg(options::OPT_mprefer_vector_width_EQ); + if (!A) + return; + + StringRef Value = A->getValue(); + if (Value == "none") { + CmdArgs.push_back("-mprefer-vector-width=none"); + } else { + unsigned Width; + if (Value.getAsInteger(10, Width)) { + D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Value; + return; + } + CmdArgs.push_back(Args.MakeArgString("-mprefer-vector-width=" + Value)); + } +} + static void getWebAssemblyTargetFeatures(const ArgList &Args, std::vector<StringRef> &Features) { handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group); @@ -4306,6 +4327,8 @@ options::OPT_fno_slp_vectorize, EnableSLPVec)) CmdArgs.push_back("-vectorize-slp"); + ParseMPreferVectorWidth(D, Args, CmdArgs); + if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ)) A->render(Args, CmdArgs); Index: lib/CodeGen/CGCall.cpp =================================================================== --- lib/CodeGen/CGCall.cpp +++ lib/CodeGen/CGCall.cpp @@ -1744,6 +1744,11 @@ FuncAttrs.addAttribute("reciprocal-estimates", llvm::join(Recips, ",")); + if (!CodeGenOpts.PreferVectorWidth.empty() && + CodeGenOpts.PreferVectorWidth != "none") + FuncAttrs.addAttribute("prefer-vector-width", + CodeGenOpts.PreferVectorWidth); + if (CodeGenOpts.StackRealignment) FuncAttrs.addAttribute("stackrealign"); if (CodeGenOpts.Backchain) Index: include/clang/Frontend/CodeGenOptions.h =================================================================== --- include/clang/Frontend/CodeGenOptions.h +++ include/clang/Frontend/CodeGenOptions.h @@ -253,6 +253,11 @@ std::vector<std::string> Reciprocals; + /// The preferred width for auto-vectorization transforms. This is intended to + /// override default transforms based on the width of the architected vector + /// registers. + std::string PreferVectorWidth; + public: // Define accessors/mutators for code generation options of enumeration type. #define CODEGENOPT(Name, Bits, Default) Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1940,6 +1940,8 @@ def mimplicit_float : Flag<["-"], "mimplicit-float">, Group<m_Group>; def mrecip : Flag<["-"], "mrecip">, Group<m_Group>; def mrecip_EQ : CommaJoined<["-"], "mrecip=">, Group<m_Group>, Flags<[CC1Option]>; +def mprefer_vector_width_EQ : Joined<["-"], "mprefer-vector-width=">, Group<m_Group>, Flags<[CC1Option]>, + HelpText<"Specifies preferred vector width for auto-vectorization. A value of 'none' resets to default">; def mpie_copy_relocations : Flag<["-"], "mpie-copy-relocations">, Group<m_Group>, Flags<[CC1Option]>, HelpText<"Use copy relocations support for PIE builds">; Index: docs/ClangCommandLineReference.rst =================================================================== --- docs/ClangCommandLineReference.rst +++ docs/ClangCommandLineReference.rst @@ -2084,6 +2084,10 @@ Use copy relocations support for PIE builds +.. option:: -mprefer-vector-width=<arg> + +Specifies preferred vector width for auto-vectorization. A value of 'none' resets to default + .. option:: -mqdsp6-compat Enable hexagon-qdsp6 backward compatibility
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits