forked from llvm-mirror/clang
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[OpenCL] Add separate read_only and write_only pipe IR types
SPIR-V encodes the read_only and write_only access qualifiers of pipes, so separate LLVM IR types are required to target SPIR-V. Other backends may also find this useful. These new types are `opencl.pipe_ro_t` and `opencl.pipe_wo_t`, which replace `opencl.pipe_t`. This replaces __get_pipe_num_packets(...) and __get_pipe_max_packets(...) which took a read_only pipe with separate versions for read_only and write_only pipes, namely: * __get_pipe_num_packets_ro(...) * __get_pipe_num_packets_wo(...) * __get_pipe_max_packets_ro(...) * __get_pipe_max_packets_wo(...) These separate versions exist to avoid needing a bitcast to one of the two qualified pipe types. Patch by Stuart Brady. Differential Revision: https://reviews.llvm.org/D46015 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@331026 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
7 changed files
with
86 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,79 +1,93 @@ | ||
// RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=CL2.0 -o - %s | FileCheck %s | ||
|
||
// CHECK: %opencl.pipe_t = type opaque | ||
// CHECK: %opencl.reserve_id_t = type opaque | ||
// CHECK-DAG: %opencl.pipe_ro_t = type opaque | ||
// CHECK-DAG: %opencl.pipe_wo_t = type opaque | ||
// CHECK-DAG: %opencl.reserve_id_t = type opaque | ||
|
||
#pragma OPENCL EXTENSION cl_khr_subgroups : enable | ||
|
||
void test1(read_only pipe int p, global int *ptr) { | ||
// CHECK: call i32 @__read_pipe_2(%opencl.pipe_t* %{{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call i32 @__read_pipe_2(%opencl.pipe_ro_t* %{{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
read_pipe(p, ptr); | ||
// CHECK: call %opencl.reserve_id_t* @__reserve_read_pipe(%opencl.pipe_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
// CHECK: call %opencl.reserve_id_t* @__reserve_read_pipe(%opencl.pipe_ro_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
reserve_id_t rid = reserve_read_pipe(p, 2); | ||
// CHECK: call i32 @__read_pipe_4(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 {{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call i32 @__read_pipe_4(%opencl.pipe_ro_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 {{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
read_pipe(p, rid, 2, ptr); | ||
// CHECK: call void @__commit_read_pipe(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call void @__commit_read_pipe(%opencl.pipe_ro_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
commit_read_pipe(p, rid); | ||
} | ||
|
||
void test2(write_only pipe int p, global int *ptr) { | ||
// CHECK: call i32 @__write_pipe_2(%opencl.pipe_t* %{{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call i32 @__write_pipe_2(%opencl.pipe_wo_t* %{{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
write_pipe(p, ptr); | ||
// CHECK: call %opencl.reserve_id_t* @__reserve_write_pipe(%opencl.pipe_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
// CHECK: call %opencl.reserve_id_t* @__reserve_write_pipe(%opencl.pipe_wo_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
reserve_id_t rid = reserve_write_pipe(p, 2); | ||
// CHECK: call i32 @__write_pipe_4(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 {{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call i32 @__write_pipe_4(%opencl.pipe_wo_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 {{.*}}, i8* %{{.*}}, i32 4, i32 4) | ||
write_pipe(p, rid, 2, ptr); | ||
// CHECK: call void @__commit_write_pipe(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call void @__commit_write_pipe(%opencl.pipe_wo_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
commit_write_pipe(p, rid); | ||
} | ||
|
||
void test3(read_only pipe int p, global int *ptr) { | ||
// CHECK: call %opencl.reserve_id_t* @__work_group_reserve_read_pipe(%opencl.pipe_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
// CHECK: call %opencl.reserve_id_t* @__work_group_reserve_read_pipe(%opencl.pipe_ro_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
reserve_id_t rid = work_group_reserve_read_pipe(p, 2); | ||
// CHECK: call void @__work_group_commit_read_pipe(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call void @__work_group_commit_read_pipe(%opencl.pipe_ro_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
work_group_commit_read_pipe(p, rid); | ||
} | ||
|
||
void test4(write_only pipe int p, global int *ptr) { | ||
// CHECK: call %opencl.reserve_id_t* @__work_group_reserve_write_pipe(%opencl.pipe_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
// CHECK: call %opencl.reserve_id_t* @__work_group_reserve_write_pipe(%opencl.pipe_wo_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
reserve_id_t rid = work_group_reserve_write_pipe(p, 2); | ||
// CHECK: call void @__work_group_commit_write_pipe(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call void @__work_group_commit_write_pipe(%opencl.pipe_wo_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
work_group_commit_write_pipe(p, rid); | ||
} | ||
|
||
void test5(read_only pipe int p, global int *ptr) { | ||
// CHECK: call %opencl.reserve_id_t* @__sub_group_reserve_read_pipe(%opencl.pipe_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
// CHECK: call %opencl.reserve_id_t* @__sub_group_reserve_read_pipe(%opencl.pipe_ro_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
reserve_id_t rid = sub_group_reserve_read_pipe(p, 2); | ||
// CHECK: call void @__sub_group_commit_read_pipe(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call void @__sub_group_commit_read_pipe(%opencl.pipe_ro_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
sub_group_commit_read_pipe(p, rid); | ||
} | ||
|
||
void test6(write_only pipe int p, global int *ptr) { | ||
// CHECK: call %opencl.reserve_id_t* @__sub_group_reserve_write_pipe(%opencl.pipe_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
// CHECK: call %opencl.reserve_id_t* @__sub_group_reserve_write_pipe(%opencl.pipe_wo_t* %{{.*}}, i32 {{.*}}, i32 4, i32 4) | ||
reserve_id_t rid = sub_group_reserve_write_pipe(p, 2); | ||
// CHECK: call void @__sub_group_commit_write_pipe(%opencl.pipe_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call void @__sub_group_commit_write_pipe(%opencl.pipe_wo_t* %{{.*}}, %opencl.reserve_id_t* %{{.*}}, i32 4, i32 4) | ||
sub_group_commit_write_pipe(p, rid); | ||
} | ||
|
||
void test7(write_only pipe int p, global int *ptr) { | ||
// CHECK: call i32 @__get_pipe_num_packets(%opencl.pipe_t* %{{.*}}, i32 4, i32 4) | ||
void test7(read_only pipe int p, global int *ptr) { | ||
// CHECK: call i32 @__get_pipe_num_packets_ro(%opencl.pipe_ro_t* %{{.*}}, i32 4, i32 4) | ||
*ptr = get_pipe_num_packets(p); | ||
// CHECK: call i32 @__get_pipe_max_packets(%opencl.pipe_t* %{{.*}}, i32 4, i32 4) | ||
// CHECK: call i32 @__get_pipe_max_packets_ro(%opencl.pipe_ro_t* %{{.*}}, i32 4, i32 4) | ||
*ptr = get_pipe_max_packets(p); | ||
} | ||
|
||
void test8(read_only pipe int r, write_only pipe int w, global int *ptr) { | ||
void test8(write_only pipe int p, global int *ptr) { | ||
// CHECK: call i32 @__get_pipe_num_packets_wo(%opencl.pipe_wo_t* %{{.*}}, i32 4, i32 4) | ||
*ptr = get_pipe_num_packets(p); | ||
// CHECK: call i32 @__get_pipe_max_packets_wo(%opencl.pipe_wo_t* %{{.*}}, i32 4, i32 4) | ||
*ptr = get_pipe_max_packets(p); | ||
} | ||
|
||
void test9(read_only pipe int r, write_only pipe int w, global int *ptr) { | ||
// verify that return type is correctly casted to i1 value | ||
// CHECK: %[[R:[0-9]+]] = call i32 @__read_pipe_2 | ||
// CHECK: icmp ne i32 %[[R]], 0 | ||
if (read_pipe(r, ptr)) *ptr = -1; | ||
// CHECK: %[[W:[0-9]+]] = call i32 @__write_pipe_2 | ||
// CHECK: icmp ne i32 %[[W]], 0 | ||
if (write_pipe(w, ptr)) *ptr = -1; | ||
// CHECK: %[[N:[0-9]+]] = call i32 @__get_pipe_num_packets | ||
// CHECK: icmp ne i32 %[[N]], 0 | ||
// CHECK: %[[NR:[0-9]+]] = call i32 @__get_pipe_num_packets_ro | ||
// CHECK: icmp ne i32 %[[NR]], 0 | ||
if (get_pipe_num_packets(r)) *ptr = -1; | ||
// CHECK: %[[M:[0-9]+]] = call i32 @__get_pipe_max_packets | ||
// CHECK: icmp ne i32 %[[M]], 0 | ||
// CHECK: %[[NW:[0-9]+]] = call i32 @__get_pipe_num_packets_wo | ||
// CHECK: icmp ne i32 %[[NW]], 0 | ||
if (get_pipe_num_packets(w)) *ptr = -1; | ||
// CHECK: %[[MR:[0-9]+]] = call i32 @__get_pipe_max_packets_ro | ||
// CHECK: icmp ne i32 %[[MR]], 0 | ||
if (get_pipe_max_packets(r)) *ptr = -1; | ||
// CHECK: %[[MW:[0-9]+]] = call i32 @__get_pipe_max_packets_wo | ||
// CHECK: icmp ne i32 %[[MW]], 0 | ||
if (get_pipe_max_packets(w)) *ptr = -1; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters