From 6d649e1dff2985f728c8fa8d88b437f5d1eaef39 Mon Sep 17 00:00:00 2001 From: Dmitry Babokin Date: Wed, 1 Mar 2017 11:10:34 -0800 Subject: [PATCH] Enabling LLVM 5.0 and making fixes to track changes in LLVM for the past couple months. The changes are tested with LLVM 3.9, 4.0 and trunk on MacOS (sse4, avx2, skx). --- alloy.py | 16 +++++++++++----- builtins.cpp | 4 ++-- builtins/dispatch.ll | 2 ++ builtins/target-knl.ll | 4 ++++ builtins/target-skx.ll | 4 ++++ builtins/util-nvptx.m4 | 2 ++ builtins/util.m4 | 12 ++++++++++++ cbackend.cpp | 37 ++++++++++++++++++++++++++++++++++--- ispc.h | 2 +- ispc_version.h | 3 ++- llvmutil.h | 4 ++++ module.cpp | 25 +++++++++++++++++++++---- 12 files changed, 99 insertions(+), 16 deletions(-) diff --git a/alloy.py b/alloy.py index a57a5def..d085e613 100755 --- a/alloy.py +++ b/alloy.py @@ -137,6 +137,9 @@ def checkout_LLVM(component, use_git, version_LLVM, revision, target_dir, from_v if version_LLVM == "trunk": SVN_PATH="trunk" GIT_BRANCH="master" + elif version_LLVM == "4_0": + SVN_PATH="branches/release_40" + GIT_BRANCH="release_40" elif version_LLVM == "3_9": SVN_PATH="tags/RELEASE_390/final" GIT_BRANCH="release_39" @@ -392,6 +395,7 @@ def unsupported_llvm_targets(LLVM_VERSION): "3.8":[], "3.9":[], "4.0":[], + "5.0":[], "trunk":[]} return prohibited_list[LLVM_VERSION] @@ -518,8 +522,10 @@ def build_ispc(version_LLVM, make): temp = "3_8" if version_LLVM == "3.9": temp = "3_9" - if version_LLVM == "trunk": + if version_LLVM == "4.0": temp = "4_0" + if version_LLVM == "trunk": + temp = "5_0" os.environ["LLVM_VERSION"] = "LLVM_" + temp try_do_LLVM("clean ISPC for building", "msbuild ispc.vcxproj /t:clean", True) try_do_LLVM("build ISPC with LLVM version " + version_LLVM + " ", "msbuild ispc.vcxproj /V:m /p:Platform=Win32 /p:Configuration=Release /t:rebuild", True) @@ -659,7 +665,7 @@ def validation_run(only, only_targets, reference_branch, number, notify, update, archs.append("x86-64") if "native" in only: sde_targets_t = [] - for i in ["3.2", "3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "trunk"]: + for i in ["3.2", "3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "4.0", "trunk"]: if i in only: LLVM.append(i) if "current" in only: @@ -945,7 +951,7 @@ def Main(): if os.environ.get("SMTP_ISPC") == None: error("you have no SMTP_ISPC in your environment for option notify", 1) if options.only != "": - test_only_r = " 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 trunk current build stability performance x86 x86-64 x86_64 -O0 -O2 native debug nodebug " + test_only_r = " 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 trunk current build stability performance x86 x86-64 x86_64 -O0 -O2 native debug nodebug " test_only = options.only.split(" ") for iterator in test_only: if not (" " + iterator + " " in test_only_r): @@ -1058,7 +1064,7 @@ if __name__ == '__main__': llvm_group = OptionGroup(parser, "Options for building LLVM", "These options must be used with -b option.") llvm_group.add_option('--version', dest='version', - help='version of llvm to build: 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 trunk. Default: trunk', default="trunk") + help='version of llvm to build: 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 trunk. Default: trunk', default="trunk") llvm_group.add_option('--with-gcc-toolchain', dest='gcc_toolchain_path', help='GCC install dir to use when building clang. It is important to set when ' + 'you have alternative gcc installation. Note that otherwise gcc from standard ' + @@ -1101,7 +1107,7 @@ if __name__ == '__main__': run_group.add_option('--only', dest='only', help='set types of tests. Possible values:\n' + '-O0, -O2, x86, x86-64, stability (test only stability), performance (test only performance),\n' + - 'build (only build with different LLVM), 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, trunk, native (do not use SDE),\n' + + 'build (only build with different LLVM), 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, trunk, native (do not use SDE),\n' + 'current (do not rebuild ISPC), debug (only with debug info), nodebug (only without debug info, default).', default="") run_group.add_option('--perf_LLVM', dest='perf_llvm', diff --git a/builtins.cpp b/builtins.cpp index f70b6c73..f57ffa1e 100644 --- a/builtins.cpp +++ b/builtins.cpp @@ -1013,7 +1013,7 @@ lDefineConstantInt(const char *name, int val, llvm::Module *module, sym_const_storagePtr); #else // LLVM 4.0+ llvm::GlobalVariable *sym_GV_storagePtr = llvm::dyn_cast(sym->storagePtr); - llvm::DIGlobalVariable *var = m->diBuilder->createGlobalVariable( + llvm::DIGlobalVariableExpression *var = m->diBuilder->createGlobalVariableExpression( file, name, name, @@ -1122,7 +1122,7 @@ lDefineProgramIndex(llvm::Module *module, SymbolTable *symbolTable) { sym_const_storagePtr); #else // LLVM 4.0+ llvm::GlobalVariable *sym_GV_storagePtr = llvm::dyn_cast(sym->storagePtr); - llvm::DIGlobalVariable *var = m->diBuilder->createGlobalVariable( + llvm::DIGlobalVariableExpression *var = m->diBuilder->createGlobalVariableExpression( file, sym->name.c_str(), sym->name.c_str(), diff --git a/builtins/dispatch.ll b/builtins/dispatch.ll index ea17cf99..c663644f 100644 --- a/builtins/dispatch.ll +++ b/builtins/dispatch.ll @@ -153,6 +153,8 @@ define(`PTR_OP_ARGS', LLVM_VERSION, LLVM_3_9, ``$1 , $1 *'', LLVM_VERSION, LLVM_4_0, + ``$1 , $1 *'', + LLVM_VERSION, LLVM_5_0, ``$1 , $1 *'', ``$1 *'' ) diff --git a/builtins/target-knl.ll b/builtins/target-knl.ll index 7676efcc..4fad98b3 100644 --- a/builtins/target-knl.ll +++ b/builtins/target-knl.ll @@ -38,6 +38,8 @@ ifelse(LLVM_VERSION, LLVM_3_7, LLVM_VERSION, LLVM_3_9, `include(`target-avx512-common.ll')', LLVM_VERSION, LLVM_4_0, + `include(`target-avx512-common.ll')', + LLVM_VERSION, LLVM_5_0, `include(`target-avx512-common.ll')' ) @@ -64,6 +66,8 @@ ifelse(LLVM_VERSION, LLVM_3_7, LLVM_VERSION, LLVM_3_9, rcp_rsqrt_varying_float_knl(), LLVM_VERSION, LLVM_4_0, + rcp_rsqrt_varying_float_knl(), + LLVM_VERSION, LLVM_5_0, rcp_rsqrt_varying_float_knl() ) diff --git a/builtins/target-skx.ll b/builtins/target-skx.ll index 18dad12c..671d17f7 100644 --- a/builtins/target-skx.ll +++ b/builtins/target-skx.ll @@ -37,6 +37,8 @@ ifelse(LLVM_VERSION, LLVM_3_8, LLVM_VERSION, LLVM_3_9, `include(`target-avx512-common.ll')', LLVM_VERSION, LLVM_4_0, + `include(`target-avx512-common.ll')', + LLVM_VERSION, LLVM_5_0, `include(`target-avx512-common.ll')' ) @@ -84,6 +86,8 @@ ifelse(LLVM_VERSION, LLVM_3_8, LLVM_VERSION, LLVM_3_9, rcp_rsqrt_varying_float_skx(), LLVM_VERSION, LLVM_4_0, + rcp_rsqrt_varying_float_skx(), + LLVM_VERSION, LLVM_5_0, rcp_rsqrt_varying_float_skx() ) diff --git a/builtins/util-nvptx.m4 b/builtins/util-nvptx.m4 index 98a2844c..b62831c4 100644 --- a/builtins/util-nvptx.m4 +++ b/builtins/util-nvptx.m4 @@ -59,6 +59,8 @@ define(`PTR_OP_ARGS', LLVM_VERSION, LLVM_3_9, ``$1 , $1 *'', LLVM_VERSION, LLVM_4_0, + ``$1 , $1 *'', + LLVM_VERSION, LLVM_5_0, ``$1 , $1 *'', ``$1 *'' ) diff --git a/builtins/util.m4 b/builtins/util.m4 index 62ca36c8..c9be81bf 100644 --- a/builtins/util.m4 +++ b/builtins/util.m4 @@ -59,6 +59,8 @@ define(`PTR_OP_ARGS', LLVM_VERSION, LLVM_3_9, ``$1 , $1 *'', LLVM_VERSION, LLVM_4_0, + ``$1 , $1 *'', + LLVM_VERSION, LLVM_5_0, ``$1 , $1 *'', ``$1 *'' ) @@ -73,6 +75,8 @@ define(`MdORi64', ``i64'', LLVM_VERSION, LLVM_4_0, ``i64'', + LLVM_VERSION, LLVM_5_0, + ``i64'', ``double'' ) ) @@ -84,6 +88,8 @@ define(`MfORi32', ``i32'', LLVM_VERSION, LLVM_4_0, ``i32'', + LLVM_VERSION, LLVM_5_0, + ``i32'', ``float'' ) ) @@ -1595,6 +1601,9 @@ define <$1 x $2> @__atomic_compare_exchange_$3_global($2* %ptr, <$1 x $2> %cmp, ',LLVM_VERSION,LLVM_4_0,` %r_LANE_ID_t = cmpxchg $2 * %ptr, $2 %cmp_LANE_ID, $2 %val_LANE_ID seq_cst seq_cst %r_LANE_ID = extractvalue { $2, i1 } %r_LANE_ID_t, 0 + ',LLVM_VERSION,LLVM_5_0,` + %r_LANE_ID_t = cmpxchg $2 * %ptr, $2 %cmp_LANE_ID, $2 %val_LANE_ID seq_cst seq_cst + %r_LANE_ID = extractvalue { $2, i1 } %r_LANE_ID_t, 0 ',` %r_LANE_ID = cmpxchg $2 * %ptr, $2 %cmp_LANE_ID, $2 %val_LANE_ID seq_cst ') @@ -1626,6 +1635,9 @@ define $2 @__atomic_compare_exchange_uniform_$3_global($2* %ptr, $2 %cmp, ',LLVM_VERSION,LLVM_4_0,` %r_t = cmpxchg $2 * %ptr, $2 %cmp, $2 %val seq_cst seq_cst %r = extractvalue { $2, i1 } %r_t, 0 + ',LLVM_VERSION,LLVM_5_0,` + %r_t = cmpxchg $2 * %ptr, $2 %cmp, $2 %val seq_cst seq_cst + %r = extractvalue { $2, i1 } %r_t, 0 ',` %r = cmpxchg $2 * %ptr, $2 %cmp, $2 %val seq_cst ') diff --git a/cbackend.cpp b/cbackend.cpp index 12bcabf1..03ab222c 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -1184,6 +1184,7 @@ void CWriter::printConstantDataSequential(llvm::ConstantDataSequential *CDS, static inline std::string ftostr(const llvm::APFloat& V) { std::string Buf; +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 if (&V.getSemantics() == &llvm::APFloat::IEEEdouble) { llvm::raw_string_ostream(Buf) << V.convertToDouble(); return Buf; @@ -1191,6 +1192,15 @@ static inline std::string ftostr(const llvm::APFloat& V) { llvm::raw_string_ostream(Buf) << (double)V.convertToFloat(); return Buf; } +#else // LLVM 4.0+ + if (&V.getSemantics() == &llvm::APFloat::IEEEdouble()) { + llvm::raw_string_ostream(Buf) << V.convertToDouble(); + return Buf; + } else if (&V.getSemantics() == &llvm::APFloat::IEEEsingle()) { + llvm::raw_string_ostream(Buf) << (double)V.convertToFloat(); + return Buf; + } +#endif return ""; // error } @@ -1210,7 +1220,11 @@ static bool isFPCSafeToPrint(const llvm::ConstantFP *CFP) { return false; llvm::APFloat APF = llvm::APFloat(CFP->getValueAPF()); // copy if (CFP->getType() == llvm::Type::getFloatTy(CFP->getContext())) +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 // <= 3.9 APF.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, &ignored); +#else // LLVM 4.0+ + APF.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven, &ignored); +#endif #if HAVE_PRINTF_A && ENABLE_CBE_PRINTF_A char Buffer[100]; sprintf(Buffer, "%a", APF.convertToDouble()); @@ -1641,7 +1655,11 @@ void CWriter::printConstant(llvm::Constant *CPV, bool Static) { // useful. llvm::APFloat Tmp = FPC->getValueAPF(); bool LosesInfo; +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 // <= 3.9 Tmp.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmTowardZero, &LosesInfo); +#else // LLVM 4.0+ + Tmp.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmTowardZero, &LosesInfo); +#endif V = Tmp.convertToDouble(); } @@ -4556,7 +4574,11 @@ void CWriter::printGEPExpression(llvm::Value *Ptr, llvm::gep_type_iterator I, llvm::VectorType *LastIndexIsVector = 0; { for (llvm::gep_type_iterator TmpI = I; TmpI != E; ++TmpI) +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 LastIndexIsVector = llvm::dyn_cast(*TmpI); +#else // LLVM 4.0+ + LastIndexIsVector = llvm::dyn_cast(TmpI.getIndexedType()); +#endif } Out << "("; @@ -4585,7 +4607,11 @@ void CWriter::printGEPExpression(llvm::Value *Ptr, llvm::gep_type_iterator I, // exposed, like a global, avoid emitting (&foo)[0], just emit foo instead. if (isAddressExposed(Ptr)) { writeOperandInternal(Ptr, Static); +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 } else if (I != E && (*I)->isStructTy()) { +#else // LLVM 4.0+ + } else if (I != E && I.isStruct()) { +#endif // If we didn't already emit the first operand, see if we can print it as // P->f instead of "P[0].f" writeOperand(Ptr); @@ -4600,13 +4626,18 @@ void CWriter::printGEPExpression(llvm::Value *Ptr, llvm::gep_type_iterator I, } for (; I != E; ++I) { - if ((*I)->isStructTy()) { +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 + llvm::Type *type = *I; +#else // LLVM 4.0+ + llvm::Type *type = I.getIndexedType(); +#endif + if (type->isStructTy()) { Out << ".field" << llvm::cast(I.getOperand())->getZExtValue(); - } else if ((*I)->isArrayTy()) { + } else if (type->isArrayTy()) { Out << ".array["; writeOperandWithCast(I.getOperand(), llvm::Instruction::GetElementPtr); Out << ']'; - } else if (!(*I)->isVectorTy()) { + } else if (!type->isVectorTy()) { Out << '['; writeOperandWithCast(I.getOperand(), llvm::Instruction::GetElementPtr); Out << ']'; diff --git a/ispc.h b/ispc.h index c73d1345..a2f0d440 100644 --- a/ispc.h +++ b/ispc.h @@ -41,7 +41,7 @@ #include "ispc_version.h" #if ISPC_LLVM_VERSION < OLDEST_SUPPORTED_LLVM || ISPC_LLVM_VERSION > LATEST_SUPPORTED_LLVM -#error "Only LLVM 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9 and 4.0 development branch are supported" +#error "Only LLVM 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0 and 5.0 development branch are supported" #endif #if defined(_WIN32) || defined(_WIN64) diff --git a/ispc_version.h b/ispc_version.h index 7122d55c..25d31688 100644 --- a/ispc_version.h +++ b/ispc_version.h @@ -52,9 +52,10 @@ #define ISPC_LLVM_3_8 30800 #define ISPC_LLVM_3_9 30900 #define ISPC_LLVM_4_0 40000 +#define ISPC_LLVM_5_0 50000 #define OLDEST_SUPPORTED_LLVM ISPC_LLVM_3_2 -#define LATEST_SUPPORTED_LLVM ISPC_LLVM_4_0 +#define LATEST_SUPPORTED_LLVM ISPC_LLVM_5_0 #ifdef __ispc__xstr #undef __ispc__xstr diff --git a/llvmutil.h b/llvmutil.h index 3d4de774..2ff64dc0 100644 --- a/llvmutil.h +++ b/llvmutil.h @@ -51,7 +51,11 @@ #include #endif +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 #define PTYPE(p) (llvm::cast((p)->getType()->getScalarType())->getElementType()) +#else // LLVM 4.0+ +#define PTYPE(p) (llvm::cast((p)->getType()->getScalarType())->getElementType()) +#endif namespace llvm { class PHINode; diff --git a/module.cpp b/module.cpp index 6a5a2f4f..c2497aff 100644 --- a/module.cpp +++ b/module.cpp @@ -431,9 +431,7 @@ Module::Module(const char *fn) { sprintf(producerString, "ispc version %s (built on %s)", ISPC_VERSION, __DATE__); #endif -#if ISPC_LLVM_VERSION >= ISPC_LLVM_3_4 // LLVM 3.4+ - diCompileUnit = -#endif // LLVM_3_4+ +#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_3 diBuilder->createCompileUnit(llvm::dwarf::DW_LANG_C99, /* lang */ name, /* filename */ directory, /* directory */ @@ -441,6 +439,25 @@ Module::Module(const char *fn) { g->opt.level > 0 /* is optimized */, "-g", /* command line args */ 0 /* run time version */); +#elif ISPC_LLVM_VERSION <= ISPC_LLVM_3_9 // LLVM 3.4-3.9 + diCompileUnit = + diBuilder->createCompileUnit(llvm::dwarf::DW_LANG_C99, /* lang */ + name, /* filename */ + directory, /* directory */ + producerString, /* producer */ + g->opt.level > 0 /* is optimized */, + "-g", /* command line args */ + 0 /* run time version */); +#elif ISPC_LLVM_VERSION >= ISPC_LLVM_4_0 // LLVM 4.0+ + auto srcFile = diBuilder->createFile(name, directory); + diCompileUnit = + diBuilder->createCompileUnit(llvm::dwarf::DW_LANG_C99, /* lang */ + srcFile, /* filename */ + producerString, /* producer */ + g->opt.level > 0 /* is optimized */, + "-g", /* command line args */ + 0 /* run time version */); +#endif } } else @@ -758,7 +775,7 @@ Module::AddGlobalVariable(const std::string &name, const Type *type, Expr *initE //llvm::MDFile *file = pos.GetDIFile(); llvm::GlobalVariable *sym_GV_storagePtr = llvm::dyn_cast(sym->storagePtr); Assert(sym_GV_storagePtr); - llvm::DIGlobalVariable *var = diBuilder->createGlobalVariable( + llvm::DIGlobalVariableExpression *var = diBuilder->createGlobalVariableExpression( file, name, name,