[Beignet] [PATCH] LLVM/Clang 3.7 compatibility

Yang, Rong R rong.r.yang at intel.com
Mon May 4 19:46:30 PDT 2015


I have try your patch with LLVM/Clang 3.7, It works.

And I have quick looked at the utests. 
builtin_pow pass now.

compiler_function_qualifiers failed when build kernel, with error log error: function with no prototype cannot use the spir_kernel calling convention.
Change kernel void compiler_function_qualifiers() to kernel void compiler_function_qualifiers(void) can fix it.

test_load_program_from_spir seems intrinsics relative issue, I think could check it later.

Thanks for your contribution.

But some warning when build:
WARNING: Linking two modules of different data layouts: '/home/champson/source/beignet/build/backend/src/libocl//usr/local/lib/x86_64-linux-gnu/beignet//ocl_barrier.bc' is '' whereas 'llvm-link' is 'e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024'

And the other serious issue is, with your patch, build fail using LLVM/Clang 3.6, when build ocl_memcpy.ll and ocl_memset.ll.
Because llvm changed its IR, I think these files used LLVM IR need two versions to support old llvm and llvm 3.7, choose the correct version in the backend/src/libocl/CMakeList.txt according to LLVM version.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> linedot
> Sent: Sunday, April 19, 2015 19:19
> To: beignet at lists.freedesktop.org
> Cc: linedot
> Subject: [Beignet] [PATCH] LLVM/Clang 3.7 compatibility
> 
> 
> I have modified some files to allow beignet to compile with the current git
> version of LLVM. I ran the utests with the -a option on an Intel HD
> 4000 and had mostly
> successes except for
> 
> builtin_pow()
> compiler_function_qualifiers()
> test_load_program_from_spir()
> 
> Those are probably unrelated to the changes I made, but I haven't tested
> with a lower llvm version.
> 
> I'm not sure about how to deal with the changes in ocl_mem*.ll, but for
> everything in cpp code I used version guards.
> 
> The old pass managers moved to llvm/IR/LegacyPassManager.h, I have used
> those and had to use some pass wrappers.
> 
> LLVMLinkerPreserveSource was removed, The value is still in the enum as
> LLVMLinkerPreserveSource_Removed, but it has no effect.
> 
> From llvm release notes: "The DataLayout is no longer optional. All the IR
> level optimizations expects it to be present and the API has been changed to
> use a reference instead of a pointer to make it explicit. The Module owns the
> datalayout and it has to match the one attached to the TargetMachine for
> generating code.". I'm not sure if that's the right way to do this, but I passed
> the DataLayout from the runModulePass function to
> createLoadStoreOptimizationPass() and removed addition of DataLayout
> passes everywhere.
> 
> There was also a typo in llvm_to_gen.cpp: runFuntionPass ->
> runFunctionPass
> ---
>  backend/src/backend/gen_program.cpp              |   4 +
>  backend/src/libocl/src/ocl_memcpy.ll             | 168 +++++++++++------------
>  backend/src/libocl/src/ocl_memset.ll             |  12 +-
>  backend/src/llvm/llvm_bitcode_link.cpp           |  10 +-
>  backend/src/llvm/llvm_gen_backend.cpp            |  25 +++-
>  backend/src/llvm/llvm_gen_backend.hpp            |   4 +
>  backend/src/llvm/llvm_loadstore_optimization.cpp |  16 ++-
>  backend/src/llvm/llvm_passes.cpp                 |   8 ++
>  backend/src/llvm/llvm_sampler_fix.cpp            |   8 ++
>  backend/src/llvm/llvm_scalarize.cpp              |   4 +
>  backend/src/llvm/llvm_to_gen.cpp                 |  76 ++++++++--
>  backend/src/llvm/llvm_unroll.cpp                 |   9 ++
>  12 files changed, 239 insertions(+), 105 deletions(-)
> 
> diff --git a/backend/src/backend/gen_program.cpp
> b/backend/src/backend/gen_program.cpp
> index f4c74f8..8b12d09 100644
> --- a/backend/src/backend/gen_program.cpp
> +++ b/backend/src/backend/gen_program.cpp
> @@ -393,7 +393,11 @@ namespace gbe {
>        llvm::Module* src = (llvm::Module*)((GenProgram*)src_program)-
> >module;
>        llvm::Module* dst = (llvm::Module*)((GenProgram*)dst_program)-
> >module;
> 
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +      if (LLVMLinkModules(wrap(dst), wrap(src),
> +LLVMLinkerPreserveSource_Removed, &errMsg)) { #else
>        if (LLVMLinkModules(wrap(dst), wrap(src), LLVMLinkerPreserveSource,
> &errMsg)) {
> +#endif
>          if (err != NULL && errSize != NULL && stringSize > 0u) {
>            strncpy(err, errMsg, stringSize-1);
>            err[stringSize-1] = '\0';
> diff --git a/backend/src/libocl/src/ocl_memcpy.ll
> b/backend/src/libocl/src/ocl_memcpy.ll
> index b3fadb2..dae3166 100644
> --- a/backend/src/libocl/src/ocl_memcpy.ll
> +++ b/backend/src/libocl/src/ocl_memcpy.ll
> @@ -22,10 +22,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(1)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(1)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(1)* %add.ptr to i32 addrspace(1)*
> -  %1 = load i32 addrspace(1)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(1)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(1)* %add.ptr1 to i32 addrspace(1)*
>    store i32 %1, i32 addrspace(1)* %2, align 4
>    br label %while.cond
> @@ -36,9 +36,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(1)* %src, i32 %index.1
> -  %3 = load i8 addrspace(1)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(1)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(1)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(1)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -58,10 +58,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(0)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(0)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(0)* %add.ptr to i32 addrspace(0)*
> -  %1 = load i32 addrspace(0)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(0)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(1)* %add.ptr1 to i32 addrspace(1)*
>    store i32 %1, i32 addrspace(1)* %2, align 4
>    br label %while.cond
> @@ -72,9 +72,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(0)* %src, i32 %index.1
> -  %3 = load i8 addrspace(0)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(0)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(0)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(1)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -94,10 +94,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(3)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(3)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(3)* %add.ptr to i32 addrspace(3)*
> -  %1 = load i32 addrspace(3)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(3)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(1)* %add.ptr1 to i32 addrspace(1)*
>    store i32 %1, i32 addrspace(1)* %2, align 4
>    br label %while.cond
> @@ -108,9 +108,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(3)* %src, i32 %index.1
> -  %3 = load i8 addrspace(3)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(3)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(3)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(1)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -130,10 +130,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(1)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(1)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(1)* %add.ptr to i32 addrspace(1)*
> -  %1 = load i32 addrspace(1)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(1)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(0)* %add.ptr1 to i32 addrspace(0)*
>    store i32 %1, i32 addrspace(0)* %2, align 4
>    br label %while.cond
> @@ -144,9 +144,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(1)* %src, i32 %index.1
> -  %3 = load i8 addrspace(1)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(1)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(1)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(0)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -166,10 +166,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(0)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(0)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(0)* %add.ptr to i32 addrspace(0)*
> -  %1 = load i32 addrspace(0)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(0)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(0)* %add.ptr1 to i32 addrspace(0)*
>    store i32 %1, i32 addrspace(0)* %2, align 4
>    br label %while.cond
> @@ -180,9 +180,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(0)* %src, i32 %index.1
> -  %3 = load i8 addrspace(0)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(0)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(0)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(0)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -202,10 +202,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(3)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(3)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(3)* %add.ptr to i32 addrspace(3)*
> -  %1 = load i32 addrspace(3)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(3)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(0)* %add.ptr1 to i32 addrspace(0)*
>    store i32 %1, i32 addrspace(0)* %2, align 4
>    br label %while.cond
> @@ -216,9 +216,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(3)* %src, i32 %index.1
> -  %3 = load i8 addrspace(3)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(3)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(3)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(0)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -238,10 +238,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(1)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(1)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(1)* %add.ptr to i32 addrspace(1)*
> -  %1 = load i32 addrspace(1)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(1)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(3)* %add.ptr1 to i32 addrspace(3)*
>    store i32 %1, i32 addrspace(3)* %2, align 4
>    br label %while.cond
> @@ -252,9 +252,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(1)* %src, i32 %index.1
> -  %3 = load i8 addrspace(1)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(1)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(1)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(3)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -274,10 +274,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(0)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(0)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(0)* %add.ptr to i32 addrspace(0)*
> -  %1 = load i32 addrspace(0)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(0)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(3)* %add.ptr1 to i32 addrspace(3)*
>    store i32 %1, i32 addrspace(3)* %2, align 4
>    br label %while.cond
> @@ -288,9 +288,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(0)* %src, i32 %index.1
> -  %3 = load i8 addrspace(0)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(0)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(0)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(3)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -310,10 +310,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(3)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(3)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(3)* %add.ptr to i32 addrspace(3)*
> -  %1 = load i32 addrspace(3)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(3)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(3)* %add.ptr1 to i32 addrspace(3)*
>    store i32 %1, i32 addrspace(3)* %2, align 4
>    br label %while.cond
> @@ -324,9 +324,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(3)* %src, i32 %index.1
> -  %3 = load i8 addrspace(3)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(3)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(3)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(3)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -354,7 +354,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(1)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(1)*
> -  %3 = load i8 addrspace(1)* %2, align 1
> +  %3 = load i8, i8 addrspace(1)* %2, align 1
>    %4 = ptrtoint i8 addrspace(1)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(1)*
> @@ -377,7 +377,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(0)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(0)*
> -  %3 = load i8 addrspace(0)* %2, align 1
> +  %3 = load i8, i8 addrspace(0)* %2, align 1
>    %4 = ptrtoint i8 addrspace(1)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(1)*
> @@ -400,7 +400,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(3)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(3)*
> -  %3 = load i8 addrspace(3)* %2, align 1
> +  %3 = load i8, i8 addrspace(3)* %2, align 1
>    %4 = ptrtoint i8 addrspace(1)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(1)*
> @@ -423,7 +423,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(1)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(1)*
> -  %3 = load i8 addrspace(1)* %2, align 1
> +  %3 = load i8, i8 addrspace(1)* %2, align 1
>    %4 = ptrtoint i8 addrspace(0)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(0)*
> @@ -446,7 +446,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(0)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(0)*
> -  %3 = load i8 addrspace(0)* %2, align 1
> +  %3 = load i8, i8 addrspace(0)* %2, align 1
>    %4 = ptrtoint i8 addrspace(0)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(0)*
> @@ -469,7 +469,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(3)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(3)*
> -  %3 = load i8 addrspace(3)* %2, align 1
> +  %3 = load i8, i8 addrspace(3)* %2, align 1
>    %4 = ptrtoint i8 addrspace(0)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(0)*
> @@ -492,7 +492,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(1)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(1)*
> -  %3 = load i8 addrspace(1)* %2, align 1
> +  %3 = load i8, i8 addrspace(1)* %2, align 1
>    %4 = ptrtoint i8 addrspace(3)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(3)*
> @@ -515,7 +515,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(0)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(0)*
> -  %3 = load i8 addrspace(0)* %2, align 1
> +  %3 = load i8, i8 addrspace(0)* %2, align 1
>    %4 = ptrtoint i8 addrspace(3)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(3)*
> @@ -538,7 +538,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(3)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(3)*
> -  %3 = load i8 addrspace(3)* %2, align 1
> +  %3 = load i8, i8 addrspace(3)* %2, align 1
>    %4 = ptrtoint i8 addrspace(3)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(3)*
> @@ -562,10 +562,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(2)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(2)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(2)* %add.ptr to i32 addrspace(2)*
> -  %1 = load i32 addrspace(2)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(2)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(1)* %add.ptr1 to i32 addrspace(1)*
>    store i32 %1, i32 addrspace(1)* %2, align 4
>    br label %while.cond
> @@ -576,9 +576,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(2)* %src, i32 %index.1
> -  %3 = load i8 addrspace(2)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(2)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(2)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(1)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -598,10 +598,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(2)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(2)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(2)* %add.ptr to i32 addrspace(2)*
> -  %1 = load i32 addrspace(2)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(2)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(0)* %add.ptr1 to i32 addrspace(0)*
>    store i32 %1, i32 addrspace(0)* %2, align 4
>    br label %while.cond
> @@ -612,9 +612,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(2)* %src, i32 %index.1
> -  %3 = load i8 addrspace(2)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(0)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(2)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(2)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(0)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(0)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -634,10 +634,10 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond3, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(2)* %src, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(2)* %src, i32
> + %index.0
>    %0 = bitcast i8 addrspace(2)* %add.ptr to i32 addrspace(2)*
> -  %1 = load i32 addrspace(2)* %0, align 4
> -  %add.ptr1 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.0
> +  %1 = load i32, i32 addrspace(2)* %0, align 4
> +  %add.ptr1 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.0
>    %2 = bitcast i8 addrspace(3)* %add.ptr1 to i32 addrspace(3)*
>    store i32 %1, i32 addrspace(3)* %2, align 4
>    br label %while.cond
> @@ -648,9 +648,9 @@ while.cond3:                                      ; preds
> = %while.cond, %while.
>    br i1 %cmp4, label %while.body5, label %while.end7
> 
>  while.body5:                                      ; preds = %while.cond3
> -  %arrayidx = getelementptr inbounds i8 addrspace(2)* %src, i32 %index.1
> -  %3 = load i8 addrspace(2)* %arrayidx, align 1
> -  %arrayidx6 = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(2)* %src, i32
> + %index.1
> +  %3 = load i8, i8 addrspace(2)* %arrayidx, align 1
> +  %arrayidx6 = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.1
>    store i8 %3, i8 addrspace(3)* %arrayidx6, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond3
> @@ -669,7 +669,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(2)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(2)*
> -  %3 = load i8 addrspace(2)* %2, align 1
> +  %3 = load i8, i8 addrspace(2)* %2, align 1
>    %4 = ptrtoint i8 addrspace(0)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(0)*
> @@ -692,7 +692,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(2)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(2)*
> -  %3 = load i8 addrspace(2)* %2, align 1
> +  %3 = load i8, i8 addrspace(2)* %2, align 1
>    %4 = ptrtoint i8 addrspace(1)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(1)*
> @@ -715,7 +715,7 @@ while.body:                                       ; preds
> = %entry, %while.body
>    %0 = ptrtoint i8 addrspace(2)* %src to i32
>    %1 = add i32 %0, %index.05
>    %2 = inttoptr i32 %1 to i8 addrspace(2)*
> -  %3 = load i8 addrspace(2)* %2, align 1
> +  %3 = load i8, i8 addrspace(2)* %2, align 1
>    %4 = ptrtoint i8 addrspace(3)* %dst to i32
>    %5 = add i32 %4, %index.05
>    %6 = inttoptr i32 %5 to i8 addrspace(3)* diff --git
> a/backend/src/libocl/src/ocl_memset.ll
> b/backend/src/libocl/src/ocl_memset.ll
> index 665eac4..6506a69 100644
> --- a/backend/src/libocl/src/ocl_memset.ll
> +++ b/backend/src/libocl/src/ocl_memset.ll
> @@ -30,7 +30,7 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond10, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8* %dst, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8* %dst, i32 %index.0
>    %0 = bitcast i8* %add.ptr to i32*
>    store i32 %or7, i32* %0, align 4
>    br label %while.cond
> @@ -41,7 +41,7 @@ while.cond10:                                     ; preds
> = %while.cond, %while.
>    br i1 %cmp11, label %while.body13, label %while.end14
> 
>  while.body13:                                     ; preds = %while.cond10
> -  %arrayidx = getelementptr inbounds i8* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8* %dst, i32 %index.1
>    store i8 %val, i8* %arrayidx, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond10
> @@ -68,7 +68,7 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond10, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.0
>    %0 = bitcast i8 addrspace(1)* %add.ptr to i32 addrspace(1)*
>    store i32 %or7, i32 addrspace(1)* %0, align 4
>    br label %while.cond
> @@ -79,7 +79,7 @@ while.cond10:                                     ; preds
> = %while.cond, %while.
>    br i1 %cmp11, label %while.body13, label %while.end14
> 
>  while.body13:                                     ; preds = %while.cond10
> -  %arrayidx = getelementptr inbounds i8 addrspace(1)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(1)* %dst, i32
> + %index.1
>    store i8 %val, i8 addrspace(1)* %arrayidx, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond10
> @@ -106,7 +106,7 @@ while.cond:                                       ; preds
> = %while.body, %entry
>    br i1 %cmp, label %while.cond10, label %while.body
> 
>  while.body:                                       ; preds = %while.cond
> -  %add.ptr = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.0
> +  %add.ptr = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.0
>    %0 = bitcast i8 addrspace(3)* %add.ptr to i32 addrspace(3)*
>    store i32 %or7, i32 addrspace(3)* %0, align 4
>    br label %while.cond
> @@ -117,7 +117,7 @@ while.cond10:                                     ; preds
> = %while.cond, %while.
>    br i1 %cmp11, label %while.body13, label %while.end14
> 
>  while.body13:                                     ; preds = %while.cond10
> -  %arrayidx = getelementptr inbounds i8 addrspace(3)* %dst, i32 %index.1
> +  %arrayidx = getelementptr inbounds i8, i8 addrspace(3)* %dst, i32
> + %index.1
>    store i8 %val, i8 addrspace(3)* %arrayidx, align 1
>    %inc = add i32 %index.1, 1
>    br label %while.cond10
> diff --git a/backend/src/llvm/llvm_bitcode_link.cpp
> b/backend/src/llvm/llvm_bitcode_link.cpp
> index ebf4386..40040f9 100644
> --- a/backend/src/llvm/llvm_bitcode_link.cpp
> +++ b/backend/src/llvm/llvm_bitcode_link.cpp
> @@ -25,7 +25,11 @@
>  #include "llvm/IR/Instructions.h"
>  #include "llvm/IR/Module.h"
>  #include "llvm/IRReader/IRReader.h"
> -#include "llvm/PassManager.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
> +#include "llvm/PassManager"
> +#endif
>  #include "llvm/Pass.h"
>  #include "llvm/IR/IRBuilder.h"
>  #include "llvm/Support/FileSystem.h"
> @@ -249,7 +253,11 @@ namespace gbe
>        return NULL;
>      }
> 
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +    llvm::legacy::PassManager passes;
> +#else
>      llvm::PassManager passes;
> +#endif
> 
>      passes.add(createInternalizePass(kernels));
>      passes.add(createGlobalDCEPass());
> diff --git a/backend/src/llvm/llvm_gen_backend.cpp
> b/backend/src/llvm/llvm_gen_backend.cpp
> index 9f4ed48..cab9957 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -86,7 +86,12 @@
>  #include "llvm/IR/Instructions.h"
>  #endif  /* LLVM_VERSION_MINOR <= 2 */
>  #include "llvm/Pass.h"
> +
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
>  #include "llvm/PassManager.h"
> +#endif
>  #if LLVM_VERSION_MINOR <= 2
>  #include "llvm/Intrinsics.h"
>  #include "llvm/IntrinsicInst.h"
> @@ -99,7 +104,11 @@
>  #include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/STLExtras.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/InstIterator.h"
> +#else
>  #include "llvm/Analysis/ConstantsScanner.h"
> +#endif
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/CodeGen/Passes.h"
> @@ -514,14 +523,22 @@ namespace gbe
>          TheModule(0),
>          btiBase(BTI_RESERVED_NUM)
>      {
> -      initializeLoopInfoPass(*PassRegistry::getPassRegistry());
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +
> +initializeLoopInfoWrapperPassPass(*PassRegistry::getPassRegistry());
> +#else
> +        initializeLoopInfoPass(*PassRegistry::getPassRegistry());
> +#endif
>        pass = PASS_EMIT_REGISTERS;
>      }
> 
>      virtual const char *getPassName() const { return "Gen Back-End"; }
> 
>      void getAnalysisUsage(AnalysisUsage &AU) const {
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +      AU.addRequired<LoopInfoWrapperPass>();
> +#else
>        AU.addRequired<LoopInfo>();
> +#endif
>        AU.setPreservesAll();
>      }
> 
> @@ -548,7 +565,11 @@ namespace gbe
>        if(!bKernel) return false;
> 
>        analyzePointerOrigin(F);
> -      LI = &getAnalysis<LoopInfo>();
> +      #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +        LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
> +      #else
> +        LI = &getAnalysis<LoopInfo>();
> +      #endif
>        emitFunction(F);
>        phiMap.clear();
>        globalPointer.clear();
> diff --git a/backend/src/llvm/llvm_gen_backend.hpp
> b/backend/src/llvm/llvm_gen_backend.hpp
> index 1f16557..e87c05b 100644
> --- a/backend/src/llvm/llvm_gen_backend.hpp
> +++ b/backend/src/llvm/llvm_gen_backend.hpp
> @@ -133,7 +133,11 @@ namespace gbe
>    llvm::BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit);
> 
>    /*! Merge load/store if possible */
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +  llvm::BasicBlockPass *createLoadStoreOptimizationPass(const
> +llvm::DataLayout* DL); #else
>    llvm::BasicBlockPass *createLoadStoreOptimizationPass();
> +#endif
> 
>    /*! Scalarize all vector op instructions */
>    llvm::FunctionPass* createScalarizePass(); diff --git
> a/backend/src/llvm/llvm_loadstore_optimization.cpp
> b/backend/src/llvm/llvm_loadstore_optimization.cpp
> index c6349fa..a258f55 100644
> --- a/backend/src/llvm/llvm_loadstore_optimization.cpp
> +++ b/backend/src/llvm/llvm_loadstore_optimization.cpp
> @@ -24,7 +24,11 @@
> 
>  #include "llvm/IR/Instructions.h"
>  #include "llvm/Pass.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
>  #include "llvm/PassManager.h"
> +#endif
> 
>  #include "llvm/Config/llvm-config.h"
>  #include "llvm/ADT/DenseMap.h"
> @@ -62,7 +66,11 @@ namespace gbe {
>      static char ID;
>      ScalarEvolution *SE;
>      const DataLayout *TD;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +    GenLoadStoreOptimization(const DataLayout* DL) :
> +BasicBlockPass(ID), TD(DL) {} #else
>      GenLoadStoreOptimization() : BasicBlockPass(ID) {}
> +#endif
> 
>      void getAnalysisUsage(AnalysisUsage &AU) const {
>        AU.addRequired<ScalarEvolution>();
> @@ -72,7 +80,8 @@ namespace gbe {
> 
>      virtual bool runOnBasicBlock(BasicBlock &BB) {
>        SE = &getAnalysis<ScalarEvolution>();
> -      #if LLVM_VERSION_MINOR >= 5
> +      #if LLVM_VERSION_MINOR == 7
> +      #elif LLVM_VERSION_MINOR >= 5
>          DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>();
>          TD = DLP ? &DLP->getDataLayout() : nullptr;
>        #else
> @@ -278,8 +287,13 @@ namespace gbe {
>      return changed;
>    }
> 
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +  BasicBlockPass *createLoadStoreOptimizationPass(const DataLayout* DL) {
> +    return new GenLoadStoreOptimization(DL); #else
>    BasicBlockPass *createLoadStoreOptimizationPass() {
>      return new GenLoadStoreOptimization();
> +#endif
>    }
>  };
> 
> diff --git a/backend/src/llvm/llvm_passes.cpp
> b/backend/src/llvm/llvm_passes.cpp
> index 223f61b..5b3d22f 100644
> --- a/backend/src/llvm/llvm_passes.cpp
> +++ b/backend/src/llvm/llvm_passes.cpp
> @@ -45,7 +45,11 @@
>  #include "llvm/IR/Instructions.h"
>  #endif  /* LLVM_VERSION_MINOR <= 2 */
>  #include "llvm/Pass.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
>  #include "llvm/PassManager.h"
> +#endif
>  #if LLVM_VERSION_MINOR <= 2
>  #include "llvm/Intrinsics.h"
>  #include "llvm/IntrinsicInst.h"
> @@ -58,7 +62,11 @@
>  #include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/STLExtras.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/InstIterator.h"
> +#else
>  #include "llvm/Analysis/ConstantsScanner.h"
> +#endif
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/CodeGen/Passes.h"
> diff --git a/backend/src/llvm/llvm_sampler_fix.cpp
> b/backend/src/llvm/llvm_sampler_fix.cpp
> index 8c76324..a2a57f4 100644
> --- a/backend/src/llvm/llvm_sampler_fix.cpp
> +++ b/backend/src/llvm/llvm_sampler_fix.cpp
> @@ -22,7 +22,11 @@
>   */
>  #include "llvm/IR/Instructions.h"
>  #include "llvm/Pass.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
>  #include "llvm/PassManager.h"
> +#endif
> 
>  #include "llvm/Config/llvm-config.h"
>  #include "llvm/ADT/DenseMap.h"
> @@ -40,7 +44,11 @@
>  #include "llvm/Support/CFG.h"
>  #endif
> 
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/InstIterator.h"
> +#else
>  #include "llvm/Analysis/ConstantsScanner.h"
> +#endif
> 
>  #include "llvm_gen_backend.hpp"
>  #include "ocl_common_defines.h"
> diff --git a/backend/src/llvm/llvm_scalarize.cpp
> b/backend/src/llvm/llvm_scalarize.cpp
> index bc985c6..d9475c7 100644
> --- a/backend/src/llvm/llvm_scalarize.cpp
> +++ b/backend/src/llvm/llvm_scalarize.cpp
> @@ -128,7 +128,11 @@ namespace gbe {
> 
>      Scalarize() : FunctionPass(ID)
>      {
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +
> +initializeLoopInfoWrapperPassPass(*PassRegistry::getPassRegistry());
> +#else
>        initializeLoopInfoPass(*PassRegistry::getPassRegistry());
> +#endif
>  #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
> 
> initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry());
>  #else
> diff --git a/backend/src/llvm/llvm_to_gen.cpp
> b/backend/src/llvm/llvm_to_gen.cpp
> index 4ea722a..4bae3f9 100644
> --- a/backend/src/llvm/llvm_to_gen.cpp
> +++ b/backend/src/llvm/llvm_to_gen.cpp
> @@ -32,11 +32,19 @@
>  #include "llvm/IR/Module.h"
>  #include "llvm/IR/DataLayout.h"
>  #endif  /* LLVM_VERSION_MINOR <= 2 */
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
>  #include "llvm/PassManager.h"
> +#endif
>  #include "llvm/Pass.h"
>  #include "llvm/Analysis/Passes.h"
>  #include "llvm/Transforms/IPO.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/Analysis/TargetLibraryInfo.h"
> +#else
>  #include "llvm/Target/TargetLibraryInfo.h"
> +#endif
>  #include "llvm/ADT/Triple.h"
>  #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 2  #include
> "llvm/Support/IRReader.h"
> @@ -77,12 +85,21 @@ namespace gbe
>    BVAR(OCL_OUTPUT_CFG_GEN_IR, false);
>    using namespace llvm;
> 
> -  void runFuntionPass(Module &mod, TargetLibraryInfo *libraryInfo, const
> DataLayout &DL)
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +  void runFunctionPass(Module &mod, TargetLibraryInfoImpl *libraryInfo,
> +const DataLayout &DL) #else
> +  void runFunctionPass(Module &mod, TargetLibraryInfo *libraryInfo,
> +const DataLayout &DL) #endif
>    {
> -    FunctionPassManager FPM(&mod);
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +      llvm::legacy::FunctionPassManager FPM(&mod); #else
> +      FunctionPassManager FPM(&mod);
> +#endif
> 
> -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> -    FPM.add(new DataLayoutPass());
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #elif
> +LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 6
> +    FPM.add(new DataLayout(DL));
>  #elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 5
>      FPM.add(new DataLayoutPass(DL));
>  #else
> @@ -94,7 +111,12 @@ namespace gbe
>  #else
>      FPM.add(createVerifierPass());
>  #endif
> +
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +    FPM.add(new TargetLibraryInfoWrapperPass(*libraryInfo));
> +#else
>      FPM.add(new TargetLibraryInfo(*libraryInfo));
> +#endif
>      FPM.add(createTypeBasedAliasAnalysisPass());
>      FPM.add(createBasicAliasAnalysisPass());
>      FPM.add(createCFGSimplificationPass());
> @@ -110,18 +132,27 @@ namespace gbe
>      FPM.doFinalization();
>    }
> 
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +  void runModulePass(Module &mod, TargetLibraryInfoImpl *libraryInfo,
> +const DataLayout &DL, int optLevel, bool strictMath) #else
>    void runModulePass(Module &mod, TargetLibraryInfo *libraryInfo, const
> DataLayout &DL, int optLevel, bool strictMath)
> +#endif
>    {
> -    llvm::PassManager MPM;
> +    llvm::legacy::PassManager MPM;
> 
> -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #elif
> +LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 6
>      MPM.add(new DataLayoutPass());
>  #elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 5
>      MPM.add(new DataLayoutPass(DL));
>  #else
>      MPM.add(new DataLayout(DL));
>  #endif
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +    MPM.add(new TargetLibraryInfoWrapperPass(*libraryInfo));
> +#else
>      MPM.add(new TargetLibraryInfo(*libraryInfo));
> +#endif
>      MPM.add(createTypeBasedAliasAnalysisPass());
>      MPM.add(createBasicAliasAnalysisPass());
>      MPM.add(createIntrinsicLoweringPass());
> @@ -199,7 +230,15 @@ namespace gbe
>    }
> 
> 
> -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +#define OUTPUT_BITCODE(STAGE, MOD)  do {         \
> +   llvm::legacy::PassManager passes__;                   \
> +   if (OCL_OUTPUT_LLVM_##STAGE) {                \
> +     passes__.add(createPrintModulePass(*o));    \
> +     passes__.run(MOD);                          \
> +   }                                             \
> + }while(0)
> +#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
>  #define OUTPUT_BITCODE(STAGE, MOD)  do {         \
>     llvm::PassManager passes__;                   \
>     if (OCL_OUTPUT_LLVM_##STAGE) {                \
> @@ -260,15 +299,26 @@ namespace gbe
>      DataLayout DL(&mod);
> 
>      Triple TargetTriple(mod.getTargetTriple());
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +    TargetLibraryInfoImpl *libraryInfo = new
> +TargetLibraryInfoImpl(TargetTriple);
> +#else
>      TargetLibraryInfo *libraryInfo = new TargetLibraryInfo(TargetTriple);
> +#endif
>      libraryInfo->disableAllFunctions();
> 
>      OUTPUT_BITCODE(AFTER_LINK, mod);
> 
> -    runFuntionPass(mod, libraryInfo, DL);
> +    runFunctionPass(mod, libraryInfo, DL);
>      runModulePass(mod, libraryInfo, DL, optLevel, strictMath);
> +
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 7
> +    llvm::legacy::PassManager passes;
> +#else
>      llvm::PassManager passes;
> -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> +#endif
> +
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 7 #elif
> +LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 6
>      passes.add(new DataLayoutPass());
>  #elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 5
>      passes.add(new DataLayoutPass(DL)); @@ -278,9 +328,13 @@ namespace
> gbe
>      // Print the code before further optimizations
>      passes.add(createIntrinsicLoweringPass());
>      passes.add(createStripAttributesPass());     // Strip unsupported attributes
> and calling conventions.
> -    passes.add(createFunctionInliningPass(20000));
> -    passes.add(createScalarReplAggregatesPass(64, true, -1, -1, 64));
> +    passes.add(createFunctionInliningPass(200000));
> +    passes.add(createScalarReplAggregatesPass(64, true, -1, -1, 64));
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 7
> +    passes.add(createLoadStoreOptimizationPass(&DL));
> +#else
>      passes.add(createLoadStoreOptimizationPass());
> +#endif
>      passes.add(createConstantPropagationPass());
>      passes.add(createPromoteMemoryToRegisterPass());
>      if(optLevel > 0)
> diff --git a/backend/src/llvm/llvm_unroll.cpp
> b/backend/src/llvm/llvm_unroll.cpp
> index 5d3fad8..685c297 100644
> --- a/backend/src/llvm/llvm_unroll.cpp
> +++ b/backend/src/llvm/llvm_unroll.cpp
> @@ -40,7 +40,11 @@
>  #include "llvm/IR/IRBuilder.h"
>  #endif /* LLVM_VERSION_MINOR <= 1 */
>  #include "llvm/Support/raw_ostream.h"
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 #include
> +"llvm/IR/LegacyPassManager.h"
> +#else
>  #include "llvm/PassManager.h"
> +#endif
>  #include "llvm/Transforms/Scalar.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/LoopPass.h"
> @@ -61,8 +65,13 @@ namespace gbe {
>         LoopPass(ID) {}
> 
>        void getAnalysisUsage(AnalysisUsage &AU) const {
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +        AU.addRequired<LoopInfoWrapperPass>();
> +        AU.addPreserved<LoopInfoWrapperPass>();
> +#else
>          AU.addRequired<LoopInfo>();
>          AU.addPreserved<LoopInfo>();
> +#endif
>          AU.addRequiredID(LoopSimplifyID);
>          AU.addPreservedID(LoopSimplifyID);
>          AU.addRequiredID(LCSSAID);
> --
> 2.3.5
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list