Skip to content

Commit

Permalink
[SYCL] Add ASFixer pass.
Browse files Browse the repository at this point in the history
Signed-off-by: Vladimir Lazarev <vladimir.lazarev@intel.com>
  • Loading branch information
vladimirlaz committed Jan 22, 2019
1 parent c278543 commit dd5ff0a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 39 deletions.
6 changes: 5 additions & 1 deletion clang/lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@
#include "llvm/Transforms/Utils.h"
#include "llvm/Transforms/Utils/NameAnonGlobals.h"
#include "llvm/Transforms/Utils/SymbolRewriter.h"
#include "LLVMSPIRVLib.h"
#include "llvm/SYCL/ASFixer.h"
#include <memory>

#include "LLVMSPIRVLib.h"
namespace SPIRV {
extern llvm::cl::opt<bool> SPIRVNoDerefAttr;
}
Expand Down Expand Up @@ -703,6 +704,9 @@ void EmitAssemblyHelper::CreatePasses(legacy::PassManager &MPM,
if (!CodeGenOpts.SampleProfileFile.empty())
PMBuilder.PGOSampleUse = CodeGenOpts.SampleProfileFile;

if (LangOpts.SYCL)
MPM.add(createASFixerPass());

PMBuilder.populateFunctionPassManager(FPM);
PMBuilder.populateModulePassManager(MPM);
}
Expand Down
1 change: 1 addition & 0 deletions clang/lib/CodeGen/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ set(LLVM_LINK_COMPONENTS
Support
Target
TransformUtils
ASFixer
SPIRVLib
)

Expand Down
85 changes: 47 additions & 38 deletions clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
// RUN: %clang -cc1 -triple spir64-unknown-linux-sycldevice -std=c++11 -fsycl-is-device -emit-llvm -x c++ %s -o - | FileCheck %s
void bar(int & Data) {}
// CHECK: define spir_func void [[RAW_REF:@[a-zA-Z0-9_]+]](i32* dereferenceable(4) %
// CHECK: define spir_func void @[[RAW_REF:[a-zA-Z0-9_]+]](i32* dereferenceable(4) %
void bar2(int & Data) {}
// CHECK: define spir_func void [[RAW_REF2:@[a-zA-Z0-9_]+]](i32* dereferenceable(4) %
// CHECK: define spir_func void @[[RAW_REF2:[a-zA-Z0-9_]+]](i32* dereferenceable(4) %
void bar(__local int &Data) {}
// CHECK: define spir_func void [[LOC_REF:@[a-zA-Z0-9_]+]](i32 addrspace(3)* dereferenceable(4) %
void foo(int * Data) {}
// CHECK: define spir_func void [[RAW_PTR:@[a-zA-Z0-9_]+]](i32* %
// CHECK: define spir_func void @[[RAW_PTR:[a-zA-Z0-9_]+]](i32* %
void foo2(int * Data) {}
// CHECK: define spir_func void [[RAW_PTR2:@[a-zA-Z0-9_]+]](i32* %
// CHECK: define spir_func void @[[RAW_PTR2:[a-zA-Z0-9_]+]](i32* %
void foo(__attribute__((address_space(3))) int * Data) {}
// CHECK: define spir_func void [[LOC_PTR:@[a-zA-Z0-9_]+]](i32 addrspace(3)* %

Expand All @@ -26,49 +26,49 @@ void usages() {

bar(*GLOB);
// CHECK: [[GLOB_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]]
// CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[GLOB_CAST]])
// CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[GLOB_CAST]])
bar2(*GLOB);
// CHECK: [[GLOB_LOAD2:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]]
// CHECK: [[GLOB_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD2]] to i32*
// CHECK: call spir_func void [[RAW_REF2]](i32* dereferenceable(4) [[GLOB_CAST2]])
// CHECK: [[GLOB_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD2]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF2]](i32 addrspace(4)* [[GLOB_CAST2]])

bar(*LOC);
// CHECK: [[LOC_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]]
// CHECK: call spir_func void [[LOC_REF]](i32 addrspace(3)* dereferenceable(4) [[LOC_LOAD]])
bar2(*LOC);
// CHECK: [[LOC_LOAD2:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]]
// CHECK: [[LOC_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOC_LOAD2]] to i32*
// CHECK: call spir_func void [[RAW_REF2]](i32* dereferenceable(4) [[LOC_CAST2]])
// CHECK: [[LOC_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOC_LOAD2]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF2]](i32 addrspace(4)* [[LOC_CAST2]])

bar(*NoAS);
// CHECK: [[NoAS_LOAD:%[a-zA-Z0-9]+]] = load i32*, i32** [[NoAS]]
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[NoAS_LOAD]])
// CHECK: call spir_func void @[[RAW_REF]](i32* dereferenceable(4) [[NoAS_LOAD]])
bar2(*NoAS);
// CHECK: [[NoAS_LOAD2:%[a-zA-Z0-9]+]] = load i32*, i32** [[NoAS]]
// CHECK: call spir_func void [[RAW_REF2]](i32* dereferenceable(4) [[NoAS_LOAD2]])
// CHECK: call spir_func void @[[RAW_REF2]](i32* dereferenceable(4) [[NoAS_LOAD2]])

foo(GLOB);
// CHECK: [[GLOB_LOAD3:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]]
// CHECK: [[GLOB_CAST3:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD3]] to i32*
// CHECK: call spir_func void [[RAW_PTR]](i32* [[GLOB_CAST3]])
// CHECK: [[GLOB_CAST3:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD3]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_PTR]](i32 addrspace(4)* [[GLOB_CAST3]])
foo2(GLOB);
// CHECK: [[GLOB_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]]
// CHECK: [[GLOB_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD4]] to i32*
// CHECK: call spir_func void [[RAW_PTR2]](i32* [[GLOB_CAST4]])
// CHECK: [[GLOB_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD4]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_PTR2]](i32 addrspace(4)* [[GLOB_CAST4]])
foo(LOC);
// CHECK: [[LOC_LOAD3:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]]
// CHECK: call spir_func void [[LOC_PTR]](i32 addrspace(3)* [[LOC_LOAD3]])
foo2(LOC);
// CHECK: [[LOC_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]]
// CHECK: [[LOC_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOC_LOAD4]] to i32*
// CHECK: call spir_func void [[RAW_PTR2]](i32* [[LOC_CAST4]])
// CHECK: [[LOC_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOC_LOAD4]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_PTR2]](i32 addrspace(4)* [[LOC_CAST4]])
foo(NoAS);
// CHECK: [[NoAS_LOAD3:%[a-zA-Z0-9]+]] = load i32*, i32** [[NoAS]]
// CHECK: call spir_func void [[RAW_PTR]](i32* [[NoAS_LOAD3]])
// CHECK: call spir_func void @[[RAW_PTR]](i32* [[NoAS_LOAD3]])
foo2(NoAS);
// CHECK: [[NoAS_LOAD4:%[a-zA-Z0-9]+]] = load i32*, i32** [[NoAS]]
// CHECK: call spir_func void [[RAW_PTR2]](i32* [[NoAS_LOAD4]])
// CHECK: call spir_func void @[[RAW_PTR2]](i32* [[NoAS_LOAD4]])

// Ensure that we still get 3 different template instantiations.
tmpl(GLOB);
Expand Down Expand Up @@ -108,41 +108,50 @@ void usages2() {

bar(*PRIV_NUM);
// CHECK: [[PRIV_NUM_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(5)*, i32 addrspace(5)** [[PRIV_NUM]]
// CHECK: [[PRIV_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(5)* [[PRIV_NUM_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[PRIV_NUM_CAST]])
// CHECK: [[PRIV_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(5)* [[PRIV_NUM_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[PRIV_NUM_CAST]])
bar(*PRIV_NUM2);
// CHECK: [[PRIV_NUM2_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(5)*, i32 addrspace(5)** [[PRIV_NUM2]]
// CHECK: [[PRIV_NUM2_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(5)* [[PRIV_NUM2_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[PRIV_NUM2_CAST]])
// CHECK: [[PRIV_NUM2_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(5)* [[PRIV_NUM2_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[PRIV_NUM2_CAST]])
bar(*PRIV);
// CHECK: [[PRIV_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(5)*, i32 addrspace(5)** [[PRIV]]
// CHECK: [[PRIV_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(5)* [[PRIV_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[PRIV_CAST]])
// CHECK: [[PRIV_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(5)* [[PRIV_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[PRIV_CAST]])
bar(*GLOB_NUM);
// CHECK: [[GLOB_NUM_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB_NUM]]
// CHECK: [[GLOB_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_NUM_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[GLOB_NUM_CAST]])
// CHECK: [[GLOB_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_NUM_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[GLOB_NUM_CAST]])
bar(*GLOB);
// CHECK: [[GLOB_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]]
// CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[GLOB_CAST]])
// CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[GLOB_CAST]])
bar(*CONST_NUM);
// CHECK: [[CONST_NUM_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(2)*, i32 addrspace(2)** [[CONST_NUM]]
// CHECK: [[CONST_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(2)* [[CONST_NUM_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[CONST_NUM_CAST]])
// CHECK: [[CONST_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(2)* [[CONST_NUM_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[CONST_NUM_CAST]])
bar(*CONST);
// CHECK: [[CONST_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(2)*, i32 addrspace(2)** [[CONST]]
// CHECK: [[CONST_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(2)* [[CONST_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF]](i32* dereferenceable(4) [[CONST_CAST]])
// CHECK: [[CONST_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(2)* [[CONST_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF]](i32 addrspace(4)* [[CONST_CAST]])
bar2(*LOCAL_NUM);
// CHECK: [[LOCAL_NUM_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOCAL_NUM]]
// CHECK: [[LOCAL_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOCAL_NUM_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF2]](i32* dereferenceable(4) [[LOCAL_NUM_CAST]])
// CHECK: [[LOCAL_NUM_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOCAL_NUM_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF2]](i32 addrspace(4)* [[LOCAL_NUM_CAST]])
bar2(*LOCAL);
// CHECK: [[LOCAL_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOCAL]]
// CHECK: [[LOCAL_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOCAL_LOAD]] to i32*
// CHECK: call spir_func void [[RAW_REF2]](i32* dereferenceable(4) [[LOCAL_CAST]])
// CHECK: [[LOCAL_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOCAL_LOAD]] to i32 addrspace(4)*
// CHECK: call spir_func void @new.[[RAW_REF2]](i32 addrspace(4)* [[LOCAL_CAST]])
}

// CHECK: define spir_func void @new.[[RAW_REF]](i32 addrspace(4)* dereferenceable(4)

// CHECK: define spir_func void @new.[[RAW_REF2]](i32 addrspace(4)* dereferenceable(4)

// CHECK: define spir_func void @new.[[RAW_PTR2]](i32 addrspace(4)*

// CHECK: define spir_func void @new.[[RAW_PTR]](i32 addrspace(4)*

template <typename name, typename Func>
__attribute__((sycl_kernel)) void kernel_single_task(Func kernelFunc) {
kernelFunc();
Expand Down

0 comments on commit dd5ff0a

Please sign in to comment.