diff options
Diffstat (limited to 'dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-OpenCL-Change-type-of-block-pointer-for-OpenCL.patch')
-rw-r--r-- | dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-OpenCL-Change-type-of-block-pointer-for-OpenCL.patch | 156 |
1 files changed, 0 insertions, 156 deletions
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-OpenCL-Change-type-of-block-pointer-for-OpenCL.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-OpenCL-Change-type-of-block-pointer-for-OpenCL.patch deleted file mode 100644 index 1c491402..00000000 --- a/dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-OpenCL-Change-type-of-block-pointer-for-OpenCL.patch +++ /dev/null | |||
@@ -1,156 +0,0 @@ | |||
1 | From 39a3ac0065c23d1e2d55dfd8792cc28a146a4307 Mon Sep 17 00:00:00 2001 | ||
2 | From: Alexey Bader <alexey.bader@intel.com> | ||
3 | Date: Tue, 19 Feb 2019 15:19:06 +0000 | ||
4 | Subject: [PATCH 1/2] [OpenCL] Change type of block pointer for OpenCL | ||
5 | |||
6 | Summary: | ||
7 | |||
8 | For some reason OpenCL blocks in LLVM IR are represented as function pointers. | ||
9 | These pointers do not point to any real function and never get called. Actually | ||
10 | they point to some structure, which in turn contains pointer to the real block | ||
11 | invoke function. | ||
12 | This patch changes represntation of OpenCL blocks in LLVM IR from function | ||
13 | pointers to pointers to `%struct.__block_literal_generic`. | ||
14 | Such representation allows to avoid unnecessary bitcasts and simplifies | ||
15 | further processing (e.g. translation to SPIR-V ) of the module for targets | ||
16 | which do not support function pointers. | ||
17 | |||
18 | Patch by: Alexey Sotkin. | ||
19 | |||
20 | Reviewers: Anastasia, yaxunl, svenvh | ||
21 | |||
22 | Reviewed By: Anastasia | ||
23 | |||
24 | Subscribers: alexbatashev, cfe-commits | ||
25 | |||
26 | Tags: #clang | ||
27 | |||
28 | Differential Revision: https://reviews.llvm.org/D58277 | ||
29 | |||
30 | git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354337 91177308-0d34-0410-b5e6-96231b3b80d8 | ||
31 | |||
32 | Upstream-Status: Backport | ||
33 | [https://github.com/llvm-mirror/clang/commit/283f308bdb5893bab1f36791711346e746045f94] | ||
34 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
35 | --- | ||
36 | lib/CodeGen/CodeGenTypes.cpp | 4 +++- | ||
37 | test/CodeGenOpenCL/blocks.cl | 18 ++++++++---------- | ||
38 | test/CodeGenOpenCL/cl20-device-side-enqueue.cl | 18 +++++++++--------- | ||
39 | 3 files changed, 20 insertions(+), 20 deletions(-) | ||
40 | |||
41 | diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp | ||
42 | index 2acf1ac..93b3ebf 100644 | ||
43 | --- a/lib/CodeGen/CodeGenTypes.cpp | ||
44 | +++ b/lib/CodeGen/CodeGenTypes.cpp | ||
45 | @@ -637,7 +637,9 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) { | ||
46 | |||
47 | case Type::BlockPointer: { | ||
48 | const QualType FTy = cast<BlockPointerType>(Ty)->getPointeeType(); | ||
49 | - llvm::Type *PointeeType = ConvertTypeForMem(FTy); | ||
50 | + llvm::Type *PointeeType = CGM.getLangOpts().OpenCL | ||
51 | + ? CGM.getGenericBlockLiteralType() | ||
52 | + : ConvertTypeForMem(FTy); | ||
53 | unsigned AS = Context.getTargetAddressSpace(FTy); | ||
54 | ResultType = llvm::PointerType::get(PointeeType, AS); | ||
55 | break; | ||
56 | diff --git a/test/CodeGenOpenCL/blocks.cl b/test/CodeGenOpenCL/blocks.cl | ||
57 | index 675240c..19aacc3 100644 | ||
58 | --- a/test/CodeGenOpenCL/blocks.cl | ||
59 | +++ b/test/CodeGenOpenCL/blocks.cl | ||
60 | @@ -35,11 +35,10 @@ void foo(){ | ||
61 | // SPIR: %[[block_captured:.*]] = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 }>, <{ i32, i32, i8 addrspace(4)*, i32 }>* %[[block]], i32 0, i32 3 | ||
62 | // SPIR: %[[i_value:.*]] = load i32, i32* %i | ||
63 | // SPIR: store i32 %[[i_value]], i32* %[[block_captured]], | ||
64 | - // SPIR: %[[blk_ptr:.*]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 }>* %[[block]] to i32 ()* | ||
65 | - // SPIR: %[[blk_gen_ptr:.*]] = addrspacecast i32 ()* %[[blk_ptr]] to i32 () addrspace(4)* | ||
66 | - // SPIR: store i32 () addrspace(4)* %[[blk_gen_ptr]], i32 () addrspace(4)** %[[block_B:.*]], | ||
67 | - // SPIR: %[[blk_gen_ptr:.*]] = load i32 () addrspace(4)*, i32 () addrspace(4)** %[[block_B]] | ||
68 | - // SPIR: %[[block_literal:.*]] = bitcast i32 () addrspace(4)* %[[blk_gen_ptr]] to %struct.__opencl_block_literal_generic addrspace(4)* | ||
69 | + // SPIR: %[[blk_ptr:.*]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 }>* %[[block]] to %struct.__opencl_block_literal_generic* | ||
70 | + // SPIR: %[[blk_gen_ptr:.*]] = addrspacecast %struct.__opencl_block_literal_generic* %[[blk_ptr]] to %struct.__opencl_block_literal_generic addrspace(4)* | ||
71 | + // SPIR: store %struct.__opencl_block_literal_generic addrspace(4)* %[[blk_gen_ptr]], %struct.__opencl_block_literal_generic addrspace(4)** %[[block_B:.*]], | ||
72 | + // SPIR: %[[block_literal:.*]] = load %struct.__opencl_block_literal_generic addrspace(4)*, %struct.__opencl_block_literal_generic addrspace(4)** %[[block_B]] | ||
73 | // SPIR: %[[invoke_addr:.*]] = getelementptr inbounds %struct.__opencl_block_literal_generic, %struct.__opencl_block_literal_generic addrspace(4)* %[[block_literal]], i32 0, i32 2 | ||
74 | // SPIR: %[[blk_gen_ptr:.*]] = bitcast %struct.__opencl_block_literal_generic addrspace(4)* %[[block_literal]] to i8 addrspace(4)* | ||
75 | // SPIR: %[[invoke_func_ptr:.*]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* %[[invoke_addr]] | ||
76 | @@ -50,11 +49,10 @@ void foo(){ | ||
77 | // AMDGCN: %[[block_captured:.*]] = getelementptr inbounds <{ i32, i32, i8*, i32 }>, <{ i32, i32, i8*, i32 }> addrspace(5)* %[[block]], i32 0, i32 3 | ||
78 | // AMDGCN: %[[i_value:.*]] = load i32, i32 addrspace(5)* %i | ||
79 | // AMDGCN: store i32 %[[i_value]], i32 addrspace(5)* %[[block_captured]], | ||
80 | - // AMDGCN: %[[blk_ptr:.*]] = bitcast <{ i32, i32, i8*, i32 }> addrspace(5)* %[[block]] to i32 () addrspace(5)* | ||
81 | - // AMDGCN: %[[blk_gen_ptr:.*]] = addrspacecast i32 () addrspace(5)* %[[blk_ptr]] to i32 ()* | ||
82 | - // AMDGCN: store i32 ()* %[[blk_gen_ptr]], i32 ()* addrspace(5)* %[[block_B:.*]], | ||
83 | - // AMDGCN: %[[blk_gen_ptr:.*]] = load i32 ()*, i32 ()* addrspace(5)* %[[block_B]] | ||
84 | - // AMDGCN: %[[block_literal:.*]] = bitcast i32 ()* %[[blk_gen_ptr]] to %struct.__opencl_block_literal_generic* | ||
85 | + // AMDGCN: %[[blk_ptr:.*]] = bitcast <{ i32, i32, i8*, i32 }> addrspace(5)* %[[block]] to %struct.__opencl_block_literal_generic addrspace(5)* | ||
86 | + // AMDGCN: %[[blk_gen_ptr:.*]] = addrspacecast %struct.__opencl_block_literal_generic addrspace(5)* %[[blk_ptr]] to %struct.__opencl_block_literal_generic* | ||
87 | + // AMDGCN: store %struct.__opencl_block_literal_generic* %[[blk_gen_ptr]], %struct.__opencl_block_literal_generic* addrspace(5)* %[[block_B:.*]], | ||
88 | + // AMDGCN: %[[block_literal:.*]] = load %struct.__opencl_block_literal_generic*, %struct.__opencl_block_literal_generic* addrspace(5)* %[[block_B]] | ||
89 | // AMDGCN: %[[invoke_addr:.*]] = getelementptr inbounds %struct.__opencl_block_literal_generic, %struct.__opencl_block_literal_generic* %[[block_literal]], i32 0, i32 2 | ||
90 | // AMDGCN: %[[blk_gen_ptr:.*]] = bitcast %struct.__opencl_block_literal_generic* %[[block_literal]] to i8* | ||
91 | // AMDGCN: %[[invoke_func_ptr:.*]] = load i8*, i8** %[[invoke_addr]] | ||
92 | diff --git a/test/CodeGenOpenCL/cl20-device-side-enqueue.cl b/test/CodeGenOpenCL/cl20-device-side-enqueue.cl | ||
93 | index 4732194..8445016 100644 | ||
94 | --- a/test/CodeGenOpenCL/cl20-device-side-enqueue.cl | ||
95 | +++ b/test/CodeGenOpenCL/cl20-device-side-enqueue.cl | ||
96 | @@ -11,7 +11,7 @@ typedef struct {int a;} ndrange_t; | ||
97 | |||
98 | // For a block global variable, first emit the block literal as a global variable, then emit the block variable itself. | ||
99 | // COMMON: [[BL_GLOBAL:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* [[INV_G:@[^ ]+]] to i8*) to i8 addrspace(4)*) } | ||
100 | -// COMMON: @block_G = addrspace(1) constant void (i8 addrspace(3)*) addrspace(4)* addrspacecast (void (i8 addrspace(3)*) addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to void (i8 addrspace(3)*) addrspace(1)*) to void (i8 addrspace(3)*) addrspace(4)*) | ||
101 | +// COMMON: @block_G = addrspace(1) constant %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*) | ||
102 | |||
103 | // For anonymous blocks without captures, emit block literals as global variable. | ||
104 | // COMMON: [[BLG1:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) } | ||
105 | @@ -77,9 +77,9 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) { | ||
106 | // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue | ||
107 | // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags | ||
108 | // COMMON: store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVL1:@__device_side_enqueue_block_invoke[^ ]*]] to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke | ||
109 | - // B32: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block to void ()* | ||
110 | - // B64: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32 addrspace(1)*, i32 }>* %block to void ()* | ||
111 | - // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast void ()* [[BL]] to i8 addrspace(4)* | ||
112 | + // B32: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block to %struct.__opencl_block_literal_generic* | ||
113 | + // B64: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32 addrspace(1)*, i32 }>* %block to %struct.__opencl_block_literal_generic* | ||
114 | + // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast %struct.__opencl_block_literal_generic* [[BL]] to i8 addrspace(4)* | ||
115 | // COMMON-LABEL: call i32 @__enqueue_kernel_basic( | ||
116 | // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* byval [[NDR]]{{([0-9]+)?}}, | ||
117 | // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVLK1:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*), | ||
118 | @@ -95,8 +95,8 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) { | ||
119 | // COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %event_wait_list to %opencl.clk_event_t{{.*}}* addrspace(4)* | ||
120 | // COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)* | ||
121 | // COMMON: store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVL2:@__device_side_enqueue_block_invoke[^ ]*]] to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke | ||
122 | - // COMMON: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32{{.*}}, i32{{.*}}, i32{{.*}} }>* %block3 to void ()* | ||
123 | - // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast void ()* [[BL]] to i8 addrspace(4)* | ||
124 | + // COMMON: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32{{.*}}, i32{{.*}}, i32{{.*}} }>* %block3 to %struct.__opencl_block_literal_generic* | ||
125 | + // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast %struct.__opencl_block_literal_generic* [[BL]] to i8 addrspace(4)* | ||
126 | // COMMON-LABEL: call i32 @__enqueue_kernel_basic_events | ||
127 | // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], | ||
128 | // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVLK2:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*), | ||
129 | @@ -300,13 +300,13 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) { | ||
130 | // Emits global block literal [[BLG8]] and invoke function [[INVG8]]. | ||
131 | // The full type of these expressions are long (and repeated elsewhere), so we | ||
132 | // capture it as part of the regex for convenience and clarity. | ||
133 | - // COMMON: store void () addrspace(4)* addrspacecast (void () addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to void () addrspace(1)*) to void () addrspace(4)*), void () addrspace(4)** %block_A | ||
134 | + // COMMON: store %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*), %struct.__opencl_block_literal_generic addrspace(4)** %block_A | ||
135 | void (^const block_A)(void) = ^{ | ||
136 | return; | ||
137 | }; | ||
138 | |||
139 | // Emits global block literal [[BLG9]] and invoke function [[INVG9]]. | ||
140 | - // COMMON: store void (i8 addrspace(3)*) addrspace(4)* addrspacecast (void (i8 addrspace(3)*) addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG9]] to void (i8 addrspace(3)*) addrspace(1)*) to void (i8 addrspace(3)*) addrspace(4)*), void (i8 addrspace(3)*) addrspace(4)** %block_B | ||
141 | + // COMMON: store %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG9]] to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*), %struct.__opencl_block_literal_generic addrspace(4)** %block_B | ||
142 | void (^const block_B)(local void *) = ^(local void *a) { | ||
143 | return; | ||
144 | }; | ||
145 | @@ -346,7 +346,7 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) { | ||
146 | // COMMON: store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVL3:@__device_side_enqueue_block_invoke[^ ]*]] to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke | ||
147 | // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue | ||
148 | // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags | ||
149 | - // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast void ()* {{.*}} to i8 addrspace(4)* | ||
150 | + // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast %struct.__opencl_block_literal_generic* {{.*}} to i8 addrspace(4)* | ||
151 | // COMMON-LABEL: call i32 @__enqueue_kernel_basic( | ||
152 | // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* byval [[NDR]]{{([0-9]+)?}}, | ||
153 | // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVLK3:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*), | ||
154 | -- | ||
155 | 1.8.3.1 | ||
156 | |||