Author: hans Date: Thu Jul 30 17:47:41 2015 New Revision: 243699 URL: http://llvm.org/viewvc/llvm-project?rev=243699&view=rev Log: Merging r243642, r243643, and r243644: ------------------------------------------------------------------------ r243642 | uweigand | 2015-07-30 07:08:36 -0700 (Thu, 30 Jul 2015) | 29 lines
Add support for System z vector language extensions The z13 vector facility has an associated language extension, closely modeled on AltiVec/VSX. The main differences are: - vector long, vector float and vector pixel are not supported - vector long long and vector double are supported (like VSX) - comparison operators return a vector rather than a scalar integer - shift operators behave like the OpenCL shift operators - vector bool is only supported as argument to certain operators; some operators allow mixing a bool with a non-bool vector This patch adds clang support for the extension. It is closely modelled on the AltiVec support. Similarly to the -faltivec option, there's a new -fzvector option to enable the extensions (as well as an -mzvector alias for compatibility with GCC). There's also a separate LangOpt. The extension as implemented here is intended to be compatible with the -mzvector extension recently implemented by GCC. Based on a patch by Richard Sandiford. Differential Revision: http://reviews.llvm.org/D11001 ------------------------------------------------------------------------ ------------------------------------------------------------------------ r243643 | uweigand | 2015-07-30 07:10:43 -0700 (Thu, 30 Jul 2015) | 18 lines [SystemZ] Add support for vecintrin.h vector built-in functions This patch adds support for the System Z vector built-in functions. The API-defined header file has the name vecintrin.h. The user-level functions are defined in the same style as the clang version of altivec.h, making heavy use of the __overloadable__ and __always_inline__ attributes. Where possible the functions expand to generic operations rather than specific built-in functions, in the hope that that form can be optimised better. Where a built-in routine is specified to require an immediate integer argument, the __enable_if__ attribute is used to verify the argument is in fact constant and in the appropriate range. Based on a patch by Richard Sandiford. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r243644 | uweigand | 2015-07-30 08:53:58 -0700 (Thu, 30 Jul 2015) | 21 lines Fix sanitizer fallout from r243642 The memory-sanitizer build bot reported: ==5574== WARNING: MemorySanitizer: use-of-uninitialized-value #0 0x7f03089e15f6 in clang::Parser::TryAltiVecTokenOutOfLine(clang::DeclSpec&, clang::SourceLocation, char const*&, unsigned int&, bool&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseDecl.cpp:6290:11 This is because the "Ident_pixel" variable was uninitialized in the getLangOpts().ZVector case, but we'd still call into clang::Parser::TryAltiVecTokenOutOfLine, which uses the variable. The simplest fix for this without sprinkling !getLangOpts().ZVector checks all over the code seems to be to just initialize the variable to nullptr; this will then do the right thing on ZVector. Checked in to unbreak the build bots. ------------------------------------------------------------------------ Added: cfe/branches/release_37/lib/Headers/vecintrin.h - copied unchanged from r243643, cfe/trunk/lib/Headers/vecintrin.h cfe/branches/release_37/test/CodeGen/builtins-systemz-zvector-error.c - copied unchanged from r243643, cfe/trunk/test/CodeGen/builtins-systemz-zvector-error.c cfe/branches/release_37/test/CodeGen/builtins-systemz-zvector.c - copied unchanged from r243643, cfe/trunk/test/CodeGen/builtins-systemz-zvector.c cfe/branches/release_37/test/CodeGen/zvector.c - copied unchanged from r243642, cfe/trunk/test/CodeGen/zvector.c cfe/branches/release_37/test/Sema/zvector.c - copied unchanged from r243642, cfe/trunk/test/Sema/zvector.c Modified: cfe/branches/release_37/ (props changed) cfe/branches/release_37/include/clang/Basic/DiagnosticParseKinds.td cfe/branches/release_37/include/clang/Basic/LangOptions.def cfe/branches/release_37/include/clang/Basic/TokenKinds.def cfe/branches/release_37/include/clang/Driver/Options.td cfe/branches/release_37/include/clang/Parse/Parser.h cfe/branches/release_37/include/clang/Sema/Sema.h cfe/branches/release_37/lib/Basic/IdentifierTable.cpp cfe/branches/release_37/lib/Basic/Module.cpp cfe/branches/release_37/lib/Basic/Targets.cpp cfe/branches/release_37/lib/Driver/Tools.cpp cfe/branches/release_37/lib/Frontend/CompilerInvocation.cpp cfe/branches/release_37/lib/Headers/CMakeLists.txt cfe/branches/release_37/lib/Headers/module.modulemap cfe/branches/release_37/lib/Headers/s390intrin.h cfe/branches/release_37/lib/Parse/Parser.cpp cfe/branches/release_37/lib/Sema/DeclSpec.cpp cfe/branches/release_37/lib/Sema/SemaExpr.cpp cfe/branches/release_37/lib/Sema/SemaExprCXX.cpp cfe/branches/release_37/lib/Sema/SemaLookup.cpp cfe/branches/release_37/test/Preprocessor/predefined-arch-macros.c Propchange: cfe/branches/release_37/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Jul 30 17:47:41 2015 @@ -1,4 +1,4 @@ /cfe/branches/type-system-rewrite:134693-134817 -/cfe/trunk:242244,242285,242293,242297,242313,242382,242422,242499,242574,242600,242660,242662,242667,242678,242766,242854,242905,242973,243018,243048,243098,243101,243105,243144,243153,243196,243206,243277,243280,243285,243289,243343,243417,243463,243538,243594 +/cfe/trunk:242244,242285,242293,242297,242313,242382,242422,242499,242574,242600,242660,242662,242667,242678,242766,242854,242905,242973,243018,243048,243098,243101,243105,243144,243153,243196,243206,243277,243280,243285,243289,243343,243417,243463,243538,243594,243642-243644 /cfe/trunk/test:170344 /cfe/trunk/test/SemaTemplate:126920 Modified: cfe/branches/release_37/include/clang/Basic/DiagnosticParseKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/include/clang/Basic/DiagnosticParseKinds.td?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/include/clang/Basic/DiagnosticParseKinds.td (original) +++ cfe/branches/release_37/include/clang/Basic/DiagnosticParseKinds.td Thu Jul 30 17:47:41 2015 @@ -358,6 +358,10 @@ def err_invalid_pixel_decl_spec_combinat "'%0' declaration specifier not allowed here">; def err_invalid_vector_bool_decl_spec : Error< "cannot use '%0' with '__vector bool'">; +def err_invalid_vector_long_decl_spec : Error< + "cannot use 'long' with '__vector'">; +def err_invalid_vector_float_decl_spec : Error< + "cannot use 'float' with '__vector'">; def err_invalid_vector_double_decl_spec : Error < "use of 'double' with '__vector' requires VSX support to be enabled " "(available on POWER7 or later)">; Modified: cfe/branches/release_37/include/clang/Basic/LangOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/include/clang/Basic/LangOptions.def?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/include/clang/Basic/LangOptions.def (original) +++ cfe/branches/release_37/include/clang/Basic/LangOptions.def Thu Jul 30 17:47:41 2015 @@ -104,6 +104,7 @@ LANGOPT(WritableStrings , 1, 0, "writa LANGOPT(ConstStrings , 1, 0, "const-qualified string support") LANGOPT(LaxVectorConversions , 1, 1, "lax vector conversions") LANGOPT(AltiVec , 1, 0, "AltiVec-style vector initializers") +LANGOPT(ZVector , 1, 0, "System z vector extensions") LANGOPT(Exceptions , 1, 0, "exception handling") LANGOPT(ObjCExceptions , 1, 0, "Objective-C exceptions") LANGOPT(CXXExceptions , 1, 0, "C++ exceptions") Modified: cfe/branches/release_37/include/clang/Basic/TokenKinds.def URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/include/clang/Basic/TokenKinds.def?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/include/clang/Basic/TokenKinds.def (original) +++ cfe/branches/release_37/include/clang/Basic/TokenKinds.def Thu Jul 30 17:47:41 2015 @@ -239,6 +239,8 @@ PUNCTUATOR(greatergreatergreater, ">>>") // KEYOPENCL - This is a keyword in OpenCL // KEYNOOPENCL - This is a keyword that is not supported in OpenCL // KEYALTIVEC - This is a keyword in AltiVec +// KEYZVECTOR - This is a keyword for the System z vector extensions, +// which are heavily based on AltiVec // KEYBORLAND - This is a keyword if Borland extensions are enabled // BOOLSUPPORT - This is a keyword if 'bool' is a built-in type // HALFSUPPORT - This is a keyword if 'half' is a built-in type @@ -501,7 +503,7 @@ ALIAS("write_only", __write_only , KE ALIAS("read_write", __read_write , KEYOPENCL) // OpenCL builtins KEYWORD(__builtin_astype , KEYOPENCL) -KEYWORD(vec_step , KEYOPENCL|KEYALTIVEC) +KEYWORD(vec_step , KEYOPENCL|KEYALTIVEC|KEYZVECTOR) // OpenMP Type Traits KEYWORD(__builtin_omp_required_simd_align, KEYALL) @@ -510,9 +512,9 @@ KEYWORD(__builtin_omp_required_simd_alig KEYWORD(__pascal , KEYALL) // Altivec Extension. -KEYWORD(__vector , KEYALTIVEC) +KEYWORD(__vector , KEYALTIVEC|KEYZVECTOR) KEYWORD(__pixel , KEYALTIVEC) -KEYWORD(__bool , KEYALTIVEC) +KEYWORD(__bool , KEYALTIVEC|KEYZVECTOR) // ARM NEON extensions. ALIAS("__fp16", half , KEYALL) Modified: cfe/branches/release_37/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/include/clang/Driver/Options.td?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/include/clang/Driver/Options.td (original) +++ cfe/branches/release_37/include/clang/Driver/Options.td Thu Jul 30 17:47:41 2015 @@ -1351,6 +1351,13 @@ def mno_altivec : Flag<["-"], "mno-altiv def mvx : Flag<["-"], "mvx">, Group<m_Group>; def mno_vx : Flag<["-"], "mno-vx">, Group<m_Group>; +def fzvector : Flag<["-"], "fzvector">, Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Enable System z vector language extension">; +def fno_zvector : Flag<["-"], "fno-zvector">, Group<f_Group>, + Flags<[CC1Option]>; +def mzvector : Flag<["-"], "mzvector">, Alias<fzvector>; +def mno_zvector : Flag<["-"], "mno-zvector">, Alias<fno_zvector>; + def mno_warn_nonportable_cfstrings : Flag<["-"], "mno-warn-nonportable-cfstrings">, Group<m_Group>; def mno_omit_leaf_frame_pointer : Flag<["-"], "mno-omit-leaf-frame-pointer">, Group<m_Group>; def momit_leaf_frame_pointer : Flag<["-"], "momit-leaf-frame-pointer">, Group<m_Group>, Modified: cfe/branches/release_37/include/clang/Parse/Parser.h URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/include/clang/Parse/Parser.h?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/include/clang/Parse/Parser.h (original) +++ cfe/branches/release_37/include/clang/Parse/Parser.h Thu Jul 30 17:47:41 2015 @@ -108,12 +108,13 @@ class Parser : public CodeCompletionHand /// Ident_super - IdentifierInfo for "super", to support fast /// comparison. IdentifierInfo *Ident_super; - /// Ident_vector, Ident_pixel, Ident_bool - cached IdentifierInfo's - /// for "vector", "pixel", and "bool" fast comparison. Only present - /// if AltiVec enabled. + /// Ident_vector, Ident_bool - cached IdentifierInfos for "vector" and + /// "bool" fast comparison. Only present if AltiVec or ZVector are enabled. IdentifierInfo *Ident_vector; - IdentifierInfo *Ident_pixel; IdentifierInfo *Ident_bool; + /// Ident_pixel - cached IdentifierInfos for "pixel" fast comparison. + /// Only present if AltiVec enabled. + IdentifierInfo *Ident_pixel; /// Objective-C contextual keywords. mutable IdentifierInfo *Ident_instancetype; @@ -605,10 +606,12 @@ private: bool TryAltiVecToken(DeclSpec &DS, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, bool &isInvalid) { - if (!getLangOpts().AltiVec || - (Tok.getIdentifierInfo() != Ident_vector && - Tok.getIdentifierInfo() != Ident_pixel && - Tok.getIdentifierInfo() != Ident_bool)) + if (!getLangOpts().AltiVec && !getLangOpts().ZVector) + return false; + + if (Tok.getIdentifierInfo() != Ident_vector && + Tok.getIdentifierInfo() != Ident_bool && + (!getLangOpts().AltiVec || Tok.getIdentifierInfo() != Ident_pixel)) return false; return TryAltiVecTokenOutOfLine(DS, Loc, PrevSpec, DiagID, isInvalid); @@ -618,7 +621,7 @@ private: /// identifier token, replacing it with the non-context-sensitive __vector. /// This returns true if the token was replaced. bool TryAltiVecVectorToken() { - if (!getLangOpts().AltiVec || + if ((!getLangOpts().AltiVec && !getLangOpts().ZVector) || Tok.getIdentifierInfo() != Ident_vector) return false; return TryAltiVecVectorTokenOutOfLine(); } Modified: cfe/branches/release_37/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/include/clang/Sema/Sema.h?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/include/clang/Sema/Sema.h (original) +++ cfe/branches/release_37/include/clang/Sema/Sema.h Thu Jul 30 17:47:41 2015 @@ -8363,7 +8363,8 @@ public: /// type checking for vector binary operators. QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, - SourceLocation Loc, bool IsCompAssign); + SourceLocation Loc, bool IsCompAssign, + bool AllowBothBool, bool AllowBoolConversion); QualType GetSignedVectorType(QualType V); QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool isRelational); Modified: cfe/branches/release_37/lib/Basic/IdentifierTable.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Basic/IdentifierTable.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Basic/IdentifierTable.cpp (original) +++ cfe/branches/release_37/lib/Basic/IdentifierTable.cpp Thu Jul 30 17:47:41 2015 @@ -110,7 +110,8 @@ namespace { HALFSUPPORT = 0x08000, KEYCONCEPTS = 0x10000, KEYOBJC2 = 0x20000, - KEYALL = (0x3ffff & ~KEYNOMS18 & + KEYZVECTOR = 0x40000, + KEYALL = (0x7ffff & ~KEYNOMS18 & ~KEYNOOPENCL) // KEYNOMS18 and KEYNOOPENCL are used to exclude. }; Modified: cfe/branches/release_37/lib/Basic/Module.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Basic/Module.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Basic/Module.cpp (original) +++ cfe/branches/release_37/lib/Basic/Module.cpp Thu Jul 30 17:47:41 2015 @@ -67,6 +67,7 @@ static bool hasFeature(StringRef Feature .Case("objc_arc", LangOpts.ObjCAutoRefCount) .Case("opencl", LangOpts.OpenCL) .Case("tls", Target.isTLSSupported()) + .Case("zvector", LangOpts.ZVector) .Default(Target.hasFeature(Feature)); if (!HasFeature) HasFeature = std::find(LangOpts.ModuleFeatures.begin(), Modified: cfe/branches/release_37/lib/Basic/Targets.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Basic/Targets.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Basic/Targets.cpp (original) +++ cfe/branches/release_37/lib/Basic/Targets.cpp Thu Jul 30 17:47:41 2015 @@ -5725,6 +5725,8 @@ public: Builder.defineMacro("__LONG_DOUBLE_128__"); if (HasTransactionalExecution) Builder.defineMacro("__HTM__"); + if (Opts.ZVector) + Builder.defineMacro("__VEC__", "10301"); } void getTargetBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) const override { Modified: cfe/branches/release_37/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Driver/Tools.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Driver/Tools.cpp (original) +++ cfe/branches/release_37/lib/Driver/Tools.cpp Thu Jul 30 17:47:41 2015 @@ -4049,9 +4049,11 @@ void Clang::ConstructJob(Compilation &C, Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug); Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug); Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); - // AltiVec language extensions aren't relevant for assembling. - if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) + // AltiVec-like language extensions aren't relevant for assembling. + if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) { Args.AddLastArg(CmdArgs, options::OPT_faltivec); + Args.AddLastArg(CmdArgs, options::OPT_fzvector); + } Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree); Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type); @@ -4096,6 +4098,12 @@ void Clang::ConstructJob(Compilation &C, << "ppc/ppc64/ppc64le"; } + // -fzvector is incompatible with -faltivec. + if (Arg *A = Args.getLastArg(options::OPT_fzvector)) + if (Args.hasArg(options::OPT_faltivec)) + D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) + << "-faltivec"; + if (getToolChain().SupportsProfiling()) Args.AddLastArg(CmdArgs, options::OPT_pg); Modified: cfe/branches/release_37/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Frontend/CompilerInvocation.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/branches/release_37/lib/Frontend/CompilerInvocation.cpp Thu Jul 30 17:47:41 2015 @@ -1260,6 +1260,7 @@ void CompilerInvocation::setLangDefaults // OpenCL has some additional defaults. if (Opts.OpenCL) { Opts.AltiVec = 0; + Opts.ZVector = 0; Opts.CXXOperatorNames = 1; Opts.LaxVectorConversions = 0; Opts.DefaultFPContract = 1; @@ -1448,6 +1449,9 @@ static void ParseLangArgs(LangOptions &O if (Args.hasArg(OPT_faltivec)) Opts.AltiVec = 1; + if (Args.hasArg(OPT_fzvector)) + Opts.ZVector = 1; + if (Args.hasArg(OPT_pthread)) Opts.POSIXThreads = 1; Modified: cfe/branches/release_37/lib/Headers/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Headers/CMakeLists.txt?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Headers/CMakeLists.txt (original) +++ cfe/branches/release_37/lib/Headers/CMakeLists.txt Thu Jul 30 17:47:41 2015 @@ -59,6 +59,7 @@ set(files unwind.h vadefs.h varargs.h + vecintrin.h __wmmintrin_aes.h wmmintrin.h __wmmintrin_pclmul.h Modified: cfe/branches/release_37/lib/Headers/module.modulemap URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Headers/module.modulemap?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Headers/module.modulemap (original) +++ cfe/branches/release_37/lib/Headers/module.modulemap Thu Jul 30 17:47:41 2015 @@ -158,6 +158,11 @@ module _Builtin_intrinsics [system] [ext header "htmintrin.h" header "htmxlintrin.h" } + + explicit module zvector { + requires zvector, vx + header "vecintrin.h" + } } } Modified: cfe/branches/release_37/lib/Headers/s390intrin.h URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Headers/s390intrin.h?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Headers/s390intrin.h (original) +++ cfe/branches/release_37/lib/Headers/s390intrin.h Thu Jul 30 17:47:41 2015 @@ -32,4 +32,8 @@ #include <htmintrin.h> #endif +#ifdef __VEC__ +#include <vecintrin.h> +#endif + #endif /* __S390INTRIN_H*/ Modified: cfe/branches/release_37/lib/Parse/Parser.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Parse/Parser.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Parse/Parser.cpp (original) +++ cfe/branches/release_37/lib/Parse/Parser.cpp Thu Jul 30 17:47:41 2015 @@ -476,11 +476,15 @@ void Parser::Initialize() { Ident_super = &PP.getIdentifierTable().get("super"); - if (getLangOpts().AltiVec) { + Ident_vector = nullptr; + Ident_bool = nullptr; + Ident_pixel = nullptr; + if (getLangOpts().AltiVec || getLangOpts().ZVector) { Ident_vector = &PP.getIdentifierTable().get("vector"); - Ident_pixel = &PP.getIdentifierTable().get("pixel"); Ident_bool = &PP.getIdentifierTable().get("bool"); } + if (getLangOpts().AltiVec) + Ident_pixel = &PP.getIdentifierTable().get("pixel"); Ident_introduced = nullptr; Ident_deprecated = nullptr; Modified: cfe/branches/release_37/lib/Sema/DeclSpec.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Sema/DeclSpec.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Sema/DeclSpec.cpp (original) +++ cfe/branches/release_37/lib/Sema/DeclSpec.cpp Thu Jul 30 17:47:41 2015 @@ -987,10 +987,11 @@ void DeclSpec::Finish(DiagnosticsEngine Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec) << getSpecifierName((TSW)TypeSpecWidth); - // vector bool long long requires VSX support. + // vector bool long long requires VSX support or ZVector. if ((TypeSpecWidth == TSW_longlong) && (!PP.getTargetInfo().hasFeature("vsx")) && - (!PP.getTargetInfo().hasFeature("power8-vector"))) + (!PP.getTargetInfo().hasFeature("power8-vector")) && + !PP.getLangOpts().ZVector) Diag(D, TSTLoc, diag::err_invalid_vector_long_long_decl_spec); // Elements of vector bool are interpreted as unsigned. (PIM 2.1) @@ -999,14 +1000,23 @@ void DeclSpec::Finish(DiagnosticsEngine TypeSpecSign = TSS_unsigned; } else if (TypeSpecType == TST_double) { // vector long double and vector long long double are never allowed. - // vector double is OK for Power7 and later. + // vector double is OK for Power7 and later, and ZVector. if (TypeSpecWidth == TSW_long || TypeSpecWidth == TSW_longlong) Diag(D, TSWLoc, diag::err_invalid_vector_long_double_decl_spec); - else if (!PP.getTargetInfo().hasFeature("vsx")) + else if (!PP.getTargetInfo().hasFeature("vsx") && + !PP.getLangOpts().ZVector) Diag(D, TSTLoc, diag::err_invalid_vector_double_decl_spec); + } else if (TypeSpecType == TST_float) { + // vector float is unsupported for ZVector. + if (PP.getLangOpts().ZVector) + Diag(D, TSTLoc, diag::err_invalid_vector_float_decl_spec); } else if (TypeSpecWidth == TSW_long) { - Diag(D, TSWLoc, diag::warn_vector_long_decl_spec_combination) - << getSpecifierName((TST)TypeSpecType, Policy); + // vector long is unsupported for ZVector and deprecated for AltiVec. + if (PP.getLangOpts().ZVector) + Diag(D, TSWLoc, diag::err_invalid_vector_long_decl_spec); + else + Diag(D, TSWLoc, diag::warn_vector_long_decl_spec_combination) + << getSpecifierName((TST)TypeSpecType, Policy); } if (TypeAltiVecPixel) { Modified: cfe/branches/release_37/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Sema/SemaExpr.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Sema/SemaExpr.cpp (original) +++ cfe/branches/release_37/lib/Sema/SemaExpr.cpp Thu Jul 30 17:47:41 2015 @@ -5518,7 +5518,7 @@ Sema::ActOnCastExpr(Scope *S, SourceLoca // i.e. all the elements are integer constants. ParenExpr *PE = dyn_cast<ParenExpr>(CastExpr); ParenListExpr *PLE = dyn_cast<ParenListExpr>(CastExpr); - if ((getLangOpts().AltiVec || getLangOpts().OpenCL) + if ((getLangOpts().AltiVec || getLangOpts().ZVector || getLangOpts().OpenCL) && castType->isVectorType() && (PE || PLE)) { if (PLE && PLE->getNumExprs() == 0) { Diag(PLE->getExprLoc(), diag::err_altivec_empty_initializer); @@ -6075,7 +6075,9 @@ OpenCLCheckVectorConditional(Sema &S, Ex if (LHS.get()->getType()->isVectorType() || RHS.get()->getType()->isVectorType()) { QualType VecResTy = S.CheckVectorOperands(LHS, RHS, QuestionLoc, - /*isCompAssign*/false); + /*isCompAssign*/false, + /*AllowBothBool*/true, + /*AllowBoolConversions*/false); if (VecResTy.isNull()) return QualType(); // The result type must match the condition type as specified in // OpenCL v1.1 s6.11.6. @@ -6126,7 +6128,9 @@ QualType Sema::CheckConditionalOperands( // Now check the two expressions. if (LHS.get()->getType()->isVectorType() || RHS.get()->getType()->isVectorType()) - return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false); + return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false, + /*AllowBothBool*/true, + /*AllowBoolConversions*/false); QualType ResTy = UsualArithmeticConversions(LHS, RHS); if (LHS.isInvalid() || RHS.isInvalid()) @@ -7267,7 +7271,9 @@ static bool tryVectorConvertAndSplat(Sem } QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, - SourceLocation Loc, bool IsCompAssign) { + SourceLocation Loc, bool IsCompAssign, + bool AllowBothBool, + bool AllowBoolConversions) { if (!IsCompAssign) { LHS = DefaultFunctionArrayLvalueConversion(LHS.get()); if (LHS.isInvalid()) @@ -7282,14 +7288,21 @@ QualType Sema::CheckVectorOperands(ExprR QualType LHSType = LHS.get()->getType().getUnqualifiedType(); QualType RHSType = RHS.get()->getType().getUnqualifiedType(); - // If the vector types are identical, return. - if (Context.hasSameType(LHSType, RHSType)) - return LHSType; - const VectorType *LHSVecType = LHSType->getAs<VectorType>(); const VectorType *RHSVecType = RHSType->getAs<VectorType>(); assert(LHSVecType || RHSVecType); + // AltiVec-style "vector bool op vector bool" combinations are allowed + // for some operators but not others. + if (!AllowBothBool && + LHSVecType && LHSVecType->getVectorKind() == VectorType::AltiVecBool && + RHSVecType && RHSVecType->getVectorKind() == VectorType::AltiVecBool) + return InvalidOperands(Loc, LHS, RHS); + + // If the vector types are identical, return. + if (Context.hasSameType(LHSType, RHSType)) + return LHSType; + // If we have compatible AltiVec and GCC vector types, use the AltiVec type. if (LHSVecType && RHSVecType && Context.areCompatibleVectorTypes(LHSType, RHSType)) { @@ -7303,6 +7316,28 @@ QualType Sema::CheckVectorOperands(ExprR return RHSType; } + // AllowBoolConversions says that bool and non-bool AltiVec vectors + // can be mixed, with the result being the non-bool type. The non-bool + // operand must have integer element type. + if (AllowBoolConversions && LHSVecType && RHSVecType && + LHSVecType->getNumElements() == RHSVecType->getNumElements() && + (Context.getTypeSize(LHSVecType->getElementType()) == + Context.getTypeSize(RHSVecType->getElementType()))) { + if (LHSVecType->getVectorKind() == VectorType::AltiVecVector && + LHSVecType->getElementType()->isIntegerType() && + RHSVecType->getVectorKind() == VectorType::AltiVecBool) { + RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast); + return LHSType; + } + if (!IsCompAssign && + LHSVecType->getVectorKind() == VectorType::AltiVecBool && + RHSVecType->getVectorKind() == VectorType::AltiVecVector && + RHSVecType->getElementType()->isIntegerType()) { + LHS = ImpCastExprToType(LHS.get(), RHSType, CK_BitCast); + return RHSType; + } + } + // If there's an ext-vector type and a scalar, try to convert the scalar to // the vector element type and splat. if (!RHSVecType && isa<ExtVectorType>(LHSVecType)) { @@ -7391,7 +7426,9 @@ QualType Sema::CheckMultiplyDivideOperan if (LHS.get()->getType()->isVectorType() || RHS.get()->getType()->isVectorType()) - return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign); + return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign, + /*AllowBothBool*/getLangOpts().AltiVec, + /*AllowBoolConversions*/false); QualType compType = UsualArithmeticConversions(LHS, RHS, IsCompAssign); if (LHS.isInvalid() || RHS.isInvalid()) @@ -7420,7 +7457,9 @@ QualType Sema::CheckRemainderOperands( RHS.get()->getType()->isVectorType()) { if (LHS.get()->getType()->hasIntegerRepresentation() && RHS.get()->getType()->hasIntegerRepresentation()) - return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign); + return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign, + /*AllowBothBool*/getLangOpts().AltiVec, + /*AllowBoolConversions*/false); return InvalidOperands(Loc, LHS, RHS); } @@ -7706,7 +7745,10 @@ QualType Sema::CheckAdditionOperands( // if (LHS.get()->getType()->isVectorType() || RHS.get()->getType()->isVectorType()) { - QualType compType = CheckVectorOperands(LHS, RHS, Loc, CompLHSTy); + QualType compType = CheckVectorOperands( + LHS, RHS, Loc, CompLHSTy, + /*AllowBothBool*/getLangOpts().AltiVec, + /*AllowBoolConversions*/getLangOpts().ZVector); if (CompLHSTy) *CompLHSTy = compType; return compType; } @@ -7781,7 +7823,10 @@ QualType Sema::CheckSubtractionOperands( if (LHS.get()->getType()->isVectorType() || RHS.get()->getType()->isVectorType()) { - QualType compType = CheckVectorOperands(LHS, RHS, Loc, CompLHSTy); + QualType compType = CheckVectorOperands( + LHS, RHS, Loc, CompLHSTy, + /*AllowBothBool*/getLangOpts().AltiVec, + /*AllowBoolConversions*/getLangOpts().ZVector); if (CompLHSTy) *CompLHSTy = compType; return compType; } @@ -8023,7 +8068,21 @@ QualType Sema::CheckShiftOperands(ExprRe RHS.get()->getType()->isVectorType()) { if (LangOpts.OpenCL) return checkOpenCLVectorShift(*this, LHS, RHS, Loc, IsCompAssign); - return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign); + if (LangOpts.ZVector) { + // The shift operators for the z vector extensions work basically + // like OpenCL shifts, except that neither the LHS nor the RHS is + // allowed to be a "vector bool". + if (auto LHSVecType = LHS.get()->getType()->getAs<VectorType>()) + if (LHSVecType->getVectorKind() == VectorType::AltiVecBool) + return InvalidOperands(Loc, LHS, RHS); + if (auto RHSVecType = RHS.get()->getType()->getAs<VectorType>()) + if (RHSVecType->getVectorKind() == VectorType::AltiVecBool) + return InvalidOperands(Loc, LHS, RHS); + return checkOpenCLVectorShift(*this, LHS, RHS, Loc, IsCompAssign); + } + return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign, + /*AllowBothBool*/true, + /*AllowBoolConversions*/false); } // Shifts don't perform usual arithmetic conversions, they just do integer @@ -8797,7 +8856,9 @@ QualType Sema::CheckVectorCompareOperand bool IsRelational) { // Check to make sure we're operating on vectors of the same type and width, // Allowing one side to be a scalar of element type. - QualType vType = CheckVectorOperands(LHS, RHS, Loc, /*isCompAssign*/false); + QualType vType = CheckVectorOperands(LHS, RHS, Loc, /*isCompAssign*/false, + /*AllowBothBool*/true, + /*AllowBoolConversions*/getLangOpts().ZVector); if (vType.isNull()) return vType; @@ -8805,7 +8866,8 @@ QualType Sema::CheckVectorCompareOperand // If AltiVec, the comparison results in a numeric type, i.e. // bool for C++, int for C - if (vType->getAs<VectorType>()->getVectorKind() == VectorType::AltiVecVector) + if (getLangOpts().AltiVec && + vType->getAs<VectorType>()->getVectorKind() == VectorType::AltiVecVector) return Context.getLogicalOperationType(); // For non-floating point types, check for self-comparisons of the form @@ -8839,7 +8901,9 @@ QualType Sema::CheckVectorLogicalOperand SourceLocation Loc) { // Ensure that either both operands are of the same vector type, or // one operand is of a vector type and the other is of its element type. - QualType vType = CheckVectorOperands(LHS, RHS, Loc, false); + QualType vType = CheckVectorOperands(LHS, RHS, Loc, false, + /*AllowBothBool*/true, + /*AllowBoolConversions*/false); if (vType.isNull()) return InvalidOperands(Loc, LHS, RHS); if (getLangOpts().OpenCL && getLangOpts().OpenCLVersion < 120 && @@ -8857,8 +8921,9 @@ inline QualType Sema::CheckBitwiseOperan RHS.get()->getType()->isVectorType()) { if (LHS.get()->getType()->hasIntegerRepresentation() && RHS.get()->getType()->hasIntegerRepresentation()) - return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign); - + return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign, + /*AllowBothBool*/true, + /*AllowBoolConversions*/getLangOpts().ZVector); return InvalidOperands(Loc, LHS, RHS); } @@ -9472,6 +9537,10 @@ static QualType CheckIncrementDecrementO IsInc, IsPrefix); } else if (S.getLangOpts().AltiVec && ResType->isVectorType()) { // OK! ( C/C++ Language Extensions for CBEA(Version 2.6) 10.3 ) + } else if (S.getLangOpts().ZVector && ResType->isVectorType() && + (ResType->getAs<VectorType>()->getVectorKind() != + VectorType::AltiVecBool)) { + // The z vector extensions allow ++ and -- for non-bool vectors. } else if(S.getLangOpts().OpenCL && ResType->isVectorType() && ResType->getAs<VectorType>()->getElementType()->isIntegerType()) { // OpenCL V1.2 6.3 says dec/inc ops operate on integer vector types. @@ -10552,8 +10621,13 @@ ExprResult Sema::CreateBuiltinUnaryOp(So resultType = Input.get()->getType(); if (resultType->isDependentType()) break; - if (resultType->isArithmeticType() || // C99 6.5.3.3p1 - resultType->isVectorType()) + if (resultType->isArithmeticType()) // C99 6.5.3.3p1 + break; + else if (resultType->isVectorType() && + // The z vector extensions don't allow + or - with bool vectors. + (!Context.getLangOpts().ZVector || + resultType->getAs<VectorType>()->getVectorKind() != + VectorType::AltiVecBool)) break; else if (getLangOpts().CPlusPlus && // C++ [expr.unary.op]p6 Opc == UO_Plus && Modified: cfe/branches/release_37/lib/Sema/SemaExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Sema/SemaExprCXX.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Sema/SemaExprCXX.cpp (original) +++ cfe/branches/release_37/lib/Sema/SemaExprCXX.cpp Thu Jul 30 17:47:41 2015 @@ -4950,7 +4950,9 @@ QualType Sema::CXXCheckConditionalOperan // Extension: conditional operator involving vector types. if (LTy->isVectorType() || RTy->isVectorType()) - return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false); + return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false, + /*AllowBothBool*/true, + /*AllowBoolConversions*/false); // -- The second and third operands have arithmetic or enumeration type; // the usual arithmetic conversions are performed to bring them to a Modified: cfe/branches/release_37/lib/Sema/SemaLookup.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/lib/Sema/SemaLookup.cpp?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/lib/Sema/SemaLookup.cpp (original) +++ cfe/branches/release_37/lib/Sema/SemaLookup.cpp Thu Jul 30 17:47:41 2015 @@ -4245,7 +4245,7 @@ std::unique_ptr<TypoCorrectionConsumer> // Don't try to correct the identifier "vector" when in AltiVec mode. // TODO: Figure out why typo correction misbehaves in this case, fix it, and // remove this workaround. - if (getLangOpts().AltiVec && Typo->isStr("vector")) + if ((getLangOpts().AltiVec || getLangOpts().ZVector) && Typo->isStr("vector")) return nullptr; // Provide a stop gap for files that are just seriously broken. Trying Modified: cfe/branches/release_37/test/Preprocessor/predefined-arch-macros.c URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_37/test/Preprocessor/predefined-arch-macros.c?rev=243699&r1=243698&r2=243699&view=diff ============================================================================== --- cfe/branches/release_37/test/Preprocessor/predefined-arch-macros.c (original) +++ cfe/branches/release_37/test/Preprocessor/predefined-arch-macros.c Thu Jul 30 17:47:41 2015 @@ -1748,3 +1748,12 @@ // RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_HTM // // CHECK_SYSTEMZ_HTM: #define __HTM__ 1 +// +// RUN: %clang -fzvector -E -dM %s -o - 2>&1 \ +// RUN: -target s390x-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_ZVECTOR +// RUN: %clang -mzvector -E -dM %s -o - 2>&1 \ +// RUN: -target s390x-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_ZVECTOR +// +// CHECK_SYSTEMZ_ZVECTOR: #define __VEC__ 10301 _______________________________________________ llvm-branch-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-branch-commits
