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).
This commit is contained in:
16
alloy.py
16
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',
|
||||
|
||||
@@ -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<llvm::GlobalVariable>(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<llvm::GlobalVariable>(sym->storagePtr);
|
||||
llvm::DIGlobalVariable *var = m->diBuilder->createGlobalVariable(
|
||||
llvm::DIGlobalVariableExpression *var = m->diBuilder->createGlobalVariableExpression(
|
||||
file,
|
||||
sym->name.c_str(),
|
||||
sym->name.c_str(),
|
||||
|
||||
@@ -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 *''
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
|
||||
|
||||
@@ -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 *''
|
||||
)
|
||||
|
||||
@@ -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
|
||||
')
|
||||
|
||||
37
cbackend.cpp
37
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 "<unknown format in ftostr>"; // 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<llvm::VectorType>(*TmpI);
|
||||
#else // LLVM 4.0+
|
||||
LastIndexIsVector = llvm::dyn_cast<llvm::VectorType>(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<llvm::ConstantInt>(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 << ']';
|
||||
|
||||
2
ispc.h
2
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -51,7 +51,11 @@
|
||||
#include <llvm/IR/Constants.h>
|
||||
#endif
|
||||
|
||||
#if ISPC_LLVM_VERSION <= ISPC_LLVM_3_9
|
||||
#define PTYPE(p) (llvm::cast<llvm::SequentialType>((p)->getType()->getScalarType())->getElementType())
|
||||
#else // LLVM 4.0+
|
||||
#define PTYPE(p) (llvm::cast<llvm::PointerType>((p)->getType()->getScalarType())->getElementType())
|
||||
#endif
|
||||
|
||||
namespace llvm {
|
||||
class PHINode;
|
||||
|
||||
25
module.cpp
25
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<llvm::GlobalVariable>(sym->storagePtr);
|
||||
Assert(sym_GV_storagePtr);
|
||||
llvm::DIGlobalVariable *var = diBuilder->createGlobalVariable(
|
||||
llvm::DIGlobalVariableExpression *var = diBuilder->createGlobalVariableExpression(
|
||||
file,
|
||||
name,
|
||||
name,
|
||||
|
||||
Reference in New Issue
Block a user