[PATCH] D69897: Add #pragma clang loop aligned
m-happy created this revision. m-happy added reviewers: hfinkel, DTharun, rscottmanley, Meinersbur. m-happy added a project: clang. Herald added subscribers: cfe-commits, zzheng. This patch adds functionality '#pragma clang loop aligned'. The load/store access in for loop following the '#pragma clang loop aligned' uses 32 bit for align access. #pragma clang loop aligned(enable) for(){ } Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D69897 Files: clang/docs/LanguageExtensions.rst clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/include/clang/Basic/DiagnosticParseKinds.td clang/lib/CodeGen/CGLoopInfo.cpp clang/lib/CodeGen/CGLoopInfo.h clang/lib/Parse/ParsePragma.cpp clang/lib/Sema/SemaStmtAttr.cpp clang/test/AST/ast-print-pragmas.cpp clang/test/CodeGenCXX/pragma-loop-aligned.cpp clang/test/Parser/pragma-loop.cpp clang/test/Parser/pragma-unroll-and-jam.cpp Index: clang/test/Parser/pragma-unroll-and-jam.cpp === --- clang/test/Parser/pragma-unroll-and-jam.cpp +++ clang/test/Parser/pragma-unroll-and-jam.cpp @@ -67,7 +67,7 @@ } // pragma clang unroll_and_jam is disabled for the moment -/* expected-error {{invalid option 'unroll_and_jam'; expected vectorize, vectorize_width, interleave, interleave_count, unroll, unroll_count, pipeline, pipeline_initiation_interval, vectorize_predicate, or distribute}} */ #pragma clang loop unroll_and_jam(4) +/* expected-error {{invalid option 'unroll_and_jam'; expected vectorize, vectorize_width, interleave, interleave_count, unroll, unroll_count, pipeline, pipeline_initiation_interval, vectorize_predicate, aligned, or distribute}} */ #pragma clang loop unroll_and_jam(4) for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { List[i * Length + j] = Value; Index: clang/test/Parser/pragma-loop.cpp === --- clang/test/Parser/pragma-loop.cpp +++ clang/test/Parser/pragma-loop.cpp @@ -82,6 +82,7 @@ #pragma clang loop vectorize(enable) #pragma clang loop interleave(enable) #pragma clang loop vectorize_predicate(enable) +#pragma clagn loop aligned(enable) #pragma clang loop unroll(full) while (i + 1 < Length) { List[i] = i; @@ -97,6 +98,7 @@ #pragma clang loop vectorize(disable) #pragma clang loop interleave(disable) #pragma clang loop vectorize_predicate(disable) +#pragma clang loop aligned(disable) #pragma clang loop unroll(disable) while (i - 1 < Length) { List[i] = i; @@ -113,7 +115,7 @@ } int VList[Length]; -#pragma clang loop vectorize(disable) interleave(disable) unroll(disable) vectorize_predicate(disable) +#pragma clang loop vectorize(disable) interleave(disable) unroll(disable) vectorize_predicate(disable) aligned(disable) for (int j : VList) { VList[j] = List[j]; } @@ -133,12 +135,14 @@ /* expected-error {{expected '('}} */ #pragma clang loop vectorize /* expected-error {{expected '('}} */ #pragma clang loop interleave /* expected-error {{expected '('}} */ #pragma clang loop vectorize_predicate +/* expected-error {{expected '('}} */ #pragma clang loop aligned /* expected-error {{expected '('}} */ #pragma clang loop unroll /* expected-error {{expected '('}} */ #pragma clang loop distribute /* expected-error {{expected ')'}} */ #pragma clang loop vectorize(enable /* expected-error {{expected ')'}} */ #pragma clang loop interleave(enable /* expected-error {{expected ')'}} */ #pragma clang loop vectorize_predicate(enable +/* expected-error {{expected ')'}} */ #pragma clang loop aligned(enable /* expected-error {{expected ')'}} */ #pragma clang loop unroll(full /* expected-error {{expected ')'}} */ #pragma clang loop distribute(enable @@ -151,7 +155,7 @@ /* expected-error {{missing argument; expected 'enable', 'full' or 'disable'}} */ #pragma clang loop unroll() /* expected-error {{missing argument; expected 'enable' or 'disable'}} */ #pragma clang loop distribute() -/* expected-error {{missing option; expected vectorize, vectorize_width, interleave, interleave_count, unroll, unroll_count, pipeline, pipeline_initiation_interval, vectorize_predicate, or distribute}} */ #pragma clang loop +/* expected-error {{missing option; expected vectorize, vectorize_width, interleave, interleave_count, unroll, unroll_count, pipeline, pipeline_initiation_interval, vectorize_predicate, aligned, or distribute}} */ #pragma clang loop /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop badkeyword /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop badkeyword(enable) /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop vectorize(enable) badkeyword(4) @@ -252,6 +256,9 @@ #pragma clang loop vectorize_predicate(enable) /* expected-error@+1 {{duplicate directives 'vectorize_predicate(enable)' and 'vectorize_predicate(disable)'}} */
[PATCH] D69897: Add #pragma clang loop vectorize_assume_alignment(n)
m-happy updated this revision to Diff 229190. m-happy added a comment. Updated the syntax as suggested by Michael Kruse, and added functionality to specify the number used for alignment instead of just using 32bits. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D69897/new/ https://reviews.llvm.org/D69897 Files: clang/docs/LanguageExtensions.rst clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/include/clang/Basic/DiagnosticParseKinds.td clang/lib/CodeGen/CGLoopInfo.cpp clang/lib/CodeGen/CGLoopInfo.h clang/lib/Parse/ParsePragma.cpp clang/lib/Sema/SemaStmtAttr.cpp clang/test/AST/ast-print-pragmas.cpp clang/test/CodeGenCXX/pragma-loop-aligned.cpp clang/test/Parser/pragma-loop.cpp clang/test/Parser/pragma-unroll-and-jam.cpp Index: clang/test/Parser/pragma-unroll-and-jam.cpp === --- clang/test/Parser/pragma-unroll-and-jam.cpp +++ clang/test/Parser/pragma-unroll-and-jam.cpp @@ -67,7 +67,7 @@ } // pragma clang unroll_and_jam is disabled for the moment -/* expected-error {{invalid option 'unroll_and_jam'; expected vectorize, vectorize_width, interleave, interleave_count, unroll, unroll_count, pipeline, pipeline_initiation_interval, vectorize_predicate, or distribute}} */ #pragma clang loop unroll_and_jam(4) +/* expected-error {{invalid option 'unroll_and_jam'; expected vectorize, vectorize_width, interleave, interleave_count, unroll, unroll_count, pipeline, pipeline_initiation_interval, vectorize_predicate, vectorize_assume_alignment, or distribute}} */ #pragma clang loop unroll_and_jam(4) for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { List[i * Length + j] = Value; Index: clang/test/Parser/pragma-loop.cpp === --- clang/test/Parser/pragma-loop.cpp +++ clang/test/Parser/pragma-loop.cpp @@ -18,42 +18,36 @@ template void test_nontype_template_vectorize(int *List, int Length) { - /* expected-error {{invalid value '-1'; must be positive}} */ #pragma clang loop vectorize_width(V) - for (int i = 0; i < Length; i++) { + /* expected-error {{invalid value '-1'; must be positive}} */ #pragma clang loop vectorize_width(V) for (int i = 0; i < Length; i++) { List[i] = i; } - /* expected-error {{invalid value '0'; must be positive}} */ #pragma clang loop vectorize_width(V / 2) - for (int i = 0; i < Length; i++) { + /* expected-error {{invalid value '0'; must be positive}} */ #pragma clang loop vectorize_width(V / 2) for (int i = 0; i < Length; i++) { List[i] += i; } } template void test_nontype_template_interleave(int *List, int Length) { - /* expected-error {{invalid value '-1'; must be positive}} */ #pragma clang loop interleave_count(I) - for (int i = 0; i < Length; i++) { + /* expected-error {{invalid value '-1'; must be positive}} */ #pragma clang loop interleave_count(I) for (int i = 0; i < Length; i++) { List[i] = i; } - /* expected-error {{invalid value '0'; must be positive}} */ #pragma clang loop interleave_count(2 % I) - for (int i = 0; i < Length; i++) { + /* expected-error {{invalid value '0'; must be positive}} */ #pragma clang loop interleave_count(2 % I) for (int i = 0; i < Length; i++) { List[i] = i; } } template void test_nontype_template_char(int *List, int Length) { - /* expected-error {{invalid argument of type 'char'; expected an integer type}} */ #pragma clang loop vectorize_width(V) - for (int i = 0; i < Length; i++) { + /* expected-error {{invalid argument of type 'char'; expected an integer type}} */ #pragma clang loop vectorize_width(V) for (int i = 0; i < Length; i++) { List[i] = i; } } template void test_nontype_template_bool(int *List, int Length) { - /* expected-error {{invalid argument of type 'bool'; expected an integer type}} */ #pragma clang loop vectorize_width(V) - for (int i = 0; i < Length; i++) { + /* expected-error {{invalid argument of type 'bool'; expected an integer type}} */ #pragma clang loop vectorize_width(V) for (int i = 0; i < Length; i++) { List[i] = i; } } @@ -61,8 +55,8 @@ template void test_nontype_template_badarg(int *List, int Length) { /* expected-error {{use of undeclared identifier 'Vec'}} */ #pragma clang loop vectorize_width(Vec) interleave_count(I) - /* expected-error {{use of undeclared identifier 'Int'}} */ #pragma clang loop vectorize_width(V) interleave_count(Int) - for (int i = 0; i < Length; i++) { + /* expected-error {{use of undeclared identifier 'Int'}} */ #pragma clang loop + vectorize_width(V) interleave_count(Int) for (int i = 0; i < Length; i++) { List[i] = i; } } @@ -70,8 +64,7 @@ template void test_type_template_vectorize(int *List, int Length) { const T Value = -1; - /* expected-error {{invalid value '-1'; must be positive}} */ #pragma clang loop vectorize