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,