diff options
| author | Anastasia Stulova <anastasia.stulova@arm.com> | 2016-02-19 18:30:11 +0000 |
|---|---|---|
| committer | Anastasia Stulova <anastasia.stulova@arm.com> | 2016-02-19 18:30:11 +0000 |
| commit | 6bdbcbb3d91ba48e418c8e854c9cacd8f5d24e2f (patch) | |
| tree | 0bcd098bfa46f7c90c3f399ffe997e790df35d08 /clang/test/CodeGenOpenCL/unroll-hint.cl | |
| parent | 7e4ba3dc02dea96a9c56b6b47a7d04de48a28ea3 (diff) | |
| download | bcm5719-llvm-6bdbcbb3d91ba48e418c8e854c9cacd8f5d24e2f.tar.gz bcm5719-llvm-6bdbcbb3d91ba48e418c8e854c9cacd8f5d24e2f.zip | |
[OpenCL] Generate metadata for opencl_unroll_hint attribute
Add support for opencl_unroll_hint attribute from OpenCL v2.0 s6.11.5.
Reusing most of metadata generation from CGLoopInfo helper class.
The code is based on Khronos OpenCL compiler:
https://github.com/KhronosGroup/SPIR/tree/spirv-1.0
Patch by Liu Yaxun (Sam)!
Differential Revision: http://reviews.llvm.org/D16686
llvm-svn: 261350
Diffstat (limited to 'clang/test/CodeGenOpenCL/unroll-hint.cl')
| -rw-r--r-- | clang/test/CodeGenOpenCL/unroll-hint.cl | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/clang/test/CodeGenOpenCL/unroll-hint.cl b/clang/test/CodeGenOpenCL/unroll-hint.cl new file mode 100644 index 00000000000..a86762e02b5 --- /dev/null +++ b/clang/test/CodeGenOpenCL/unroll-hint.cl @@ -0,0 +1,96 @@ +// RUN: %clang_cc1 -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s + +/*** for ***/ +void for_count() +{ +// CHECK-LABEL: for_count + __attribute__((opencl_unroll_hint(8))) + for( int i = 0; i < 1000; ++i); +// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_COUNT:.*]] +} + +void for_disable() +{ +// CHECK-LABEL: for_disable + __attribute__((opencl_unroll_hint(1))) + for( int i = 0; i < 1000; ++i); +// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_DISABLE:.*]] +} + +void for_full() +{ +// CHECK-LABEL: for_full + __attribute__((opencl_unroll_hint)) + for( int i = 0; i < 1000; ++i); +// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_FULL:.*]] +} + +/*** while ***/ +void while_count() +{ +// CHECK-LABEL: while_count + int i = 1000; + __attribute__((opencl_unroll_hint(8))) + while(i-->0); +// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_COUNT:.*]] +} + +void while_disable() +{ +// CHECK-LABEL: while_disable + int i = 1000; + __attribute__((opencl_unroll_hint(1))) + while(i-->0); +// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_DISABLE:.*]] +} + +void while_full() +{ +// CHECK-LABEL: while_full + int i = 1000; + __attribute__((opencl_unroll_hint)) + while(i-->0); +// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_FULL:.*]] +} + +/*** do ***/ +void do_count() +{ +// CHECK-LABEL: do_count + int i = 1000; + __attribute__((opencl_unroll_hint(8))) + do {} while(i--> 0); +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_COUNT:.*]] +} + +void do_disable() +{ +// CHECK-LABEL: do_disable + int i = 1000; + __attribute__((opencl_unroll_hint(1))) + do {} while(i--> 0); +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_DISABLE:.*]] +} + +void do_full() +{ +// CHECK-LABEL: do_full + int i = 1000; + __attribute__((opencl_unroll_hint)) + do {} while(i--> 0); +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_FULL:.*]] +} + + +// CHECK: ![[FOR_COUNT]] = distinct !{![[FOR_COUNT]], ![[COUNT:.*]]} +// CHECK: ![[COUNT]] = !{!"llvm.loop.unroll.count", i32 8} +// CHECK: ![[FOR_DISABLE]] = distinct !{![[FOR_DISABLE]], ![[DISABLE:.*]]} +// CHECK: ![[DISABLE]] = !{!"llvm.loop.unroll.disable"} +// CHECK: ![[FOR_FULL]] = distinct !{![[FOR_FULL]], ![[FULL:.*]]} +// CHECK: ![[FULL]] = !{!"llvm.loop.unroll.full"} +// CHECK: ![[WHILE_COUNT]] = distinct !{![[WHILE_COUNT]], ![[COUNT]]} +// CHECK: ![[WHILE_DISABLE]] = distinct !{![[WHILE_DISABLE]], ![[DISABLE]]} +// CHECK: ![[WHILE_FULL]] = distinct !{![[WHILE_FULL]], ![[FULL]]} +// CHECK: ![[DO_COUNT]] = distinct !{![[DO_COUNT]], ![[COUNT]]} +// CHECK: ![[DO_DISABLE]] = distinct !{![[DO_DISABLE]], ![[DISABLE]]} +// CHECK: ![[DO_FULL]] = distinct !{![[DO_FULL]], ![[FULL]]} |

