diff --git a/Makefile b/Makefile index 10deb342..55eeb019 100644 --- a/Makefile +++ b/Makefile @@ -5,20 +5,34 @@ ARCH_OS = $(shell uname) ARCH_TYPE = $(shell arch) +ifeq ($(shell llvm-config --version), 3.1svn) + LLVM_LIBS=-lLLVMAsmParser -lLLVMInstrumentation -lLLVMLinker \ + -lLLVMArchive -lLLVMBitReader -lLLVMDebugInfo -lLLVMJIT -lLLVMipo \ + -lLLVMBitWriter -lLLVMTableGen -lLLVMCBackendInfo \ + -lLLVMX86Disassembler -lLLVMX86CodeGen -lLLVMSelectionDAG \ + -lLLVMAsmPrinter -lLLVMX86AsmParser -lLLVMX86Desc -lLLVMX86Info \ + -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCDisassembler -lLLVMMCParser \ + -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \ + -lLLVMipa -lLLVMAnalysis -lLLVMMCJIT -lLLVMRuntimeDyld \ + -lLLVMExecutionEngine -lLLVMTarget -lLLVMMC -lLLVMObject -lLLVMCore \ + -lLLVMSupport +else + LLVM_LIBS=$(shell llvm-config --libs) +endif + CLANG=clang CLANG_LIBS = -lclangFrontend -lclangDriver \ -lclangSerialization -lclangParse -lclangSema \ -lclangAnalysis -lclangAST -lclangLex -lclangBasic -ISPC_LIBS=$(CLANG_LIBS) \ - $(shell llvm-config --ldflags --libs) \ +ISPC_LIBS=$(shell llvm-config --ldflags) $(CLANG_LIBS) $(LLVM_LIBS) \ -lpthread -ldl -ISPC_TEST_LIBS=$(shell llvm-config --ldflags --libs) \ +ISPC_TEST_LIBS=$(shell llvm-config --ldflags) $(LLVM_LIBS) \ -lpthread -ldl LLVM_CXXFLAGS=$(shell llvm-config --cppflags) -LLVM_VERSION=$(shell llvm-config --version | sed s/\\./_/) -LLVM_VERSION_DEF=-DLLVM_$(LLVM_VERSION) +LLVM_VERSION=LLVM_$(shell llvm-config --version | sed s/\\./_/) +LLVM_VERSION_DEF=-D$(LLVM_VERSION) BUILD_DATE=$(shell date +%Y%m%d) BUILD_VERSION=$(shell git log --abbrev-commit --abbrev=16 | head -1) diff --git a/builtins.m4 b/builtins.m4 index 250d7801..268825e1 100644 --- a/builtins.m4 +++ b/builtins.m4 @@ -715,7 +715,7 @@ define <$1 x $3> @__atomic_$2_$4_global($3 * %ptr, <$1 x $3> %val, %eltvec`'i = insertelement <$1 x $3> %eltvec`'eval(i-1), $3 %red`'eval(i-1), i32 i') ; make the atomic call, passing it the final reduced value -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` %final0 = call $3 @llvm.atomic.load.$2.$3.p0$3($3 * %ptr, $3 %red`'eval($1-1))', ` %final0 = atomicrmw $2 $3 * %ptr, $3 %red`'eval($1-1) seq_cst') @@ -747,7 +747,7 @@ ifelse(`LLVM_VERSION', `LLVM_2_9',` define(`global_atomic_uniform', ` -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` declare $3 @llvm.atomic.load.$2.$3.p0$3($3 * %ptr, $3 %delta) define $3 @__atomic_$2_uniform_$4_global($3 * %ptr, $3 %val, @@ -771,7 +771,7 @@ define $3 @__atomic_$2_uniform_$4_global($3 * %ptr, $3 %val, ;; $2: llvm type of the vector elements (e.g. i32) ;; $3: ispc type of the elements (e.g. int32) -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` declare i32 @llvm.atomic.swap.i32.p0i32(i32 * %ptr, i32 %val) declare i64 @llvm.atomic.swap.i64.p0i64(i64 * %ptr, i64 %val)') @@ -784,7 +784,7 @@ define <$1 x $2> @__atomic_swap_$3_global($2* %ptr, <$1 x $2> %val, per_lane($1, <$1 x i32> %mask, ` %val_LANE_ID = extractelement <$1 x $2> %val, i32 LANE -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` %r_LANE_ID = call $2 @llvm.atomic.swap.$2.p0$2($2 * %ptr, $2 %val_LANE_ID)', ` %r_LANE_ID = atomicrmw xchg $2 * %ptr, $2 %val_LANE_ID seq_cst') %rp_LANE_ID = getelementptr $2 * %rptr32, i32 LANE @@ -796,7 +796,7 @@ ifelse(`LLVM_VERSION', `LLVM_2_9',` define $2 @__atomic_swap_uniform_$3_global($2* %ptr, $2 %val, <$1 x i32> %mask) nounwind alwaysinline { -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` %r = call $2 @llvm.atomic.swap.$2.p0$2($2 * %ptr, $2 %val)', ` %r = atomicrmw xchg $2 * %ptr, $2 %val seq_cst') ret $2 %r @@ -812,7 +812,7 @@ ifelse(`LLVM_VERSION', `LLVM_2_9',` define(`global_atomic_exchange', ` -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` declare $2 @llvm.atomic.cmp.swap.$2.p0$2($2 * %ptr, $2 %cmp, $2 %val)') define <$1 x $2> @__atomic_compare_exchange_$3_global($2* %ptr, <$1 x $2> %cmp, @@ -823,7 +823,7 @@ define <$1 x $2> @__atomic_compare_exchange_$3_global($2* %ptr, <$1 x $2> %cmp, per_lane($1, <$1 x i32> %mask, ` %cmp_LANE_ID = extractelement <$1 x $2> %cmp, i32 LANE %val_LANE_ID = extractelement <$1 x $2> %val, i32 LANE -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` %r_LANE_ID = call $2 @llvm.atomic.cmp.swap.$2.p0$2($2 * %ptr, $2 %cmp_LANE_ID, $2 %val_LANE_ID)', ` %r_LANE_ID = cmpxchg $2 * %ptr, $2 %cmp_LANE_ID, $2 %val_LANE_ID seq_cst') @@ -836,7 +836,7 @@ ifelse(`LLVM_VERSION', `LLVM_2_9',` define $2 @__atomic_compare_exchange_uniform_$3_global($2* %ptr, $2 %cmp, $2 %val, <$1 x i32> %mask) nounwind alwaysinline { -ifelse(`LLVM_VERSION', `LLVM_2_9',` +ifelse(LLVM_VERSION, `LLVM_2_9',` %r = call $2 @llvm.atomic.cmp.swap.$2.p0$2($2 * %ptr, $2 %cmp, $2 %val)', ` %r = cmpxchg $2 * %ptr, $2 %cmp, $2 %val seq_cst') ret $2 %r @@ -1784,7 +1784,7 @@ define void ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; prefetching -ifelse(`LLVM_VERSION', `LLVM_2_9', +ifelse(LLVM_VERSION, `LLVM_2_9', ` declare void @llvm.prefetch(i8* nocapture %ptr, i32 %readwrite, i32 %locality) diff --git a/ispc.cpp b/ispc.cpp index 327d994d..9008224a 100644 --- a/ispc.cpp +++ b/ispc.cpp @@ -241,11 +241,19 @@ Target::GetTargetMachine() const { llvm::Reloc::Model relocModel = generatePIC ? llvm::Reloc::PIC_ : llvm::Reloc::Default; -#if defined(LLVM_3_0svn) || defined(LLVM_3_1svn) || defined(LLVM_3_0) +#if defined(LLVM_3_1svn) + std::string featuresString = attributes; + llvm::TargetOptions options; + if (g->opt.fastMath == true) + options.UnsafeFPMath = 1; + llvm::TargetMachine *targetMachine = + target->createTargetMachine(triple, cpu, featuresString, options, + relocModel); +#elif defined(LLVM_3_0) std::string featuresString = attributes; llvm::TargetMachine *targetMachine = target->createTargetMachine(triple, cpu, featuresString, relocModel); -#else +#else // LLVM 2.9 #ifdef ISPC_IS_APPLE relocModel = llvm::Reloc::PIC_; #endif // ISPC_IS_APPLE @@ -255,7 +263,8 @@ Target::GetTargetMachine() const { #ifndef ISPC_IS_WINDOWS targetMachine->setRelocationModel(relocModel); #endif // !ISPC_IS_WINDOWS -#endif +#endif // LLVM_2_9 + assert(targetMachine != NULL); targetMachine->setAsmVerbosityDefault(true); diff --git a/module.cpp b/module.cpp index bfb5e52a..a55a5445 100644 --- a/module.cpp +++ b/module.cpp @@ -150,8 +150,10 @@ extern void yy_delete_buffer(YY_BUFFER_STATE); int Module::CompileFile() { +#ifndef LLVM_3_1svn if (g->opt.fastMath == true) llvm::UnsafeFPMath = true; +#endif // !LLVM_3_1svn // FIXME: it'd be nice to do this in the Module constructor, but this // function ends up calling into routines that expect the global diff --git a/opt.cpp b/opt.cpp index a27dbf32..ecb9340d 100644 --- a/opt.cpp +++ b/opt.cpp @@ -961,9 +961,13 @@ lGetBasePtrAndOffsets(llvm::Value *ptrs, llvm::Value **offsets) { } assert(base != NULL); +#ifdef LLVM_2_9 + *offsets = llvm::ConstantVector::get(delta); +#else llvm::ArrayRef deltas(&delta[0], &delta[elements.size()]); *offsets = llvm::ConstantVector::get(deltas); +#endif return base; }