Author: asavonic Date: Wed Mar 20 09:43:07 2019 New Revision: 356571 URL: http://llvm.org/viewvc/llvm-project?rev=356571&view=rev Log: [OpenCL] Generate 'unroll.enable' metadata for __attribute__((opencl_unroll_hint))
Summary: [OpenCL] Generate 'unroll.enable' metadata for __attribute__((opencl_unroll_hint)) For both !{!"llvm.loop.unroll.enable"} and !{!"llvm.loop.unroll.full"} the unroller will try to fully unroll a loop unless the trip count is not known at compile time. In that case for '.full' metadata no unrolling will be processed, while for '.enable' the loop will be partially unrolled with a heuristically chosen unroll factor. See: docs/LanguageExtensions.rst From https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/attributes-loopUnroll.html __attribute__((opencl_unroll_hint)) for (int i=0; i<2; i++) { ... } In the example above, the compiler will determine how much to unroll the loop. Before the patch for __attribute__((opencl_unroll_hint)) was generated metadata !{!"llvm.loop.unroll.full"}, which limits ability of loop unroller to decide, how much to unroll the loop. Reviewers: Anastasia, yaxunl Reviewed By: Anastasia Subscribers: zzheng, dmgreen, jdoerfert, cfe-commits, asavonic, AlexeySotkin Tags: #clang Differential Revision: https://reviews.llvm.org/D59493 Modified: cfe/trunk/lib/CodeGen/CGLoopInfo.cpp cfe/trunk/test/CodeGenOpenCL/unroll-hint.cl Modified: cfe/trunk/lib/CodeGen/CGLoopInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGLoopInfo.cpp?rev=356571&r1=356570&r2=356571&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGLoopInfo.cpp (original) +++ cfe/trunk/lib/CodeGen/CGLoopInfo.cpp Wed Mar 20 09:43:07 2019 @@ -208,13 +208,13 @@ void LoopInfoStack::push(BasicBlock *Hea // Translate opencl_unroll_hint attribute argument to // equivalent LoopHintAttr enums. // OpenCL v2.0 s6.11.5: - // 0 - full unroll (no argument). + // 0 - enable unroll (no argument). // 1 - disable unroll. // other positive integer n - unroll by n. if (OpenCLHint) { ValueInt = OpenCLHint->getUnrollHint(); if (ValueInt == 0) { - State = LoopHintAttr::Full; + State = LoopHintAttr::Enable; } else if (ValueInt != 1) { Option = LoopHintAttr::UnrollCount; State = LoopHintAttr::Numeric; Modified: cfe/trunk/test/CodeGenOpenCL/unroll-hint.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/unroll-hint.cl?rev=356571&r1=356570&r2=356571&view=diff ============================================================================== --- cfe/trunk/test/CodeGenOpenCL/unroll-hint.cl (original) +++ cfe/trunk/test/CodeGenOpenCL/unroll-hint.cl Wed Mar 20 09:43:07 2019 @@ -18,12 +18,12 @@ void for_disable() // CHECK: br label %{{.*}}, !llvm.loop ![[FOR_DISABLE:.*]] } -void for_full() +void for_enable() { -// CHECK-LABEL: for_full +// CHECK-LABEL: for_enable __attribute__((opencl_unroll_hint)) for( int i = 0; i < 1000; ++i); -// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_FULL:.*]] +// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_ENABLE:.*]] } /*** while ***/ @@ -45,13 +45,13 @@ void while_disable() // CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_DISABLE:.*]] } -void while_full() +void while_enable() { -// CHECK-LABEL: while_full +// CHECK-LABEL: while_enable int i = 1000; __attribute__((opencl_unroll_hint)) while(i-->0); -// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_FULL:.*]] +// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_ENABLE:.*]] } /*** do ***/ @@ -73,13 +73,13 @@ void do_disable() // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_DISABLE:.*]] } -void do_full() +void do_enable() { -// CHECK-LABEL: do_full +// CHECK-LABEL: do_enable int i = 1000; __attribute__((opencl_unroll_hint)) do {} while(i--> 0); -// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_FULL:.*]] +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_ENABLE:.*]] } @@ -87,11 +87,11 @@ void do_full() // 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: ![[FOR_ENABLE]] = distinct !{![[FOR_ENABLE]], ![[ENABLE:.*]]} +// CHECK: ![[ENABLE]] = !{!"llvm.loop.unroll.enable"} // CHECK: ![[WHILE_COUNT]] = distinct !{![[WHILE_COUNT]], ![[COUNT]]} // CHECK: ![[WHILE_DISABLE]] = distinct !{![[WHILE_DISABLE]], ![[DISABLE]]} -// CHECK: ![[WHILE_FULL]] = distinct !{![[WHILE_FULL]], ![[FULL]]} +// CHECK: ![[WHILE_ENABLE]] = distinct !{![[WHILE_ENABLE]], ![[ENABLE]]} // CHECK: ![[DO_COUNT]] = distinct !{![[DO_COUNT]], ![[COUNT]]} // CHECK: ![[DO_DISABLE]] = distinct !{![[DO_DISABLE]], ![[DISABLE]]} -// CHECK: ![[DO_FULL]] = distinct !{![[DO_FULL]], ![[FULL]]} +// CHECK: ![[DO_ENABLE]] = distinct !{![[DO_ENABLE]], ![[ENABLE]]} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits