Author: eopXD Date: 2022-11-15T14:37:27-08:00 New Revision: 6dee23919a36a30f3df7e9b20fba8b9edf65340c
URL: https://github.com/llvm/llvm-project/commit/6dee23919a36a30f3df7e9b20fba8b9edf65340c DIFF: https://github.com/llvm/llvm-project/commit/6dee23919a36a30f3df7e9b20fba8b9edf65340c.diff LOG: [Clang][Sema] Refactor category declaration under CheckForIncompatibleAttributes. NFC This change would allow extension of new categories be aware of adding more code here. This patch also updates the comments, which was originally missing the vector predicate. Reviewed By: mikerice Differential Revision: https://reviews.llvm.org/D137570 Added: Modified: clang/lib/Sema/SemaStmtAttr.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 7a35d715eba9..9ec8fe21d0a2 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -306,21 +306,33 @@ CheckForIncompatibleAttributes(Sema &S, if (!DiagnoseMutualExclusions(S, Attrs)) return; - // There are 6 categories of loop hints attributes: vectorize, interleave, - // unroll, unroll_and_jam, pipeline and distribute. Except for distribute they - // come in two variants: a state form and a numeric form. The state form - // selectively defaults/enables/disables the transformation for the loop - // (for unroll, default indicates full unrolling rather than enabling the - // transformation). The numeric form provides an integer hint (for - // example, unroll count) to the transformer. The following array accumulates - // the hints encountered while iterating through the attributes to check for - // compatibility. + enum CategoryType { + // For the following categories, they come in two variants: a state form and + // a numeric form. The state form may be one of default, enable, and + // disable. The numeric form provides an integer hint (for example, unroll + // count) to the transformer. + Vectorize, + Interleave, + UnrollAndJam, + Pipeline, + // For unroll, default indicates full unrolling rather than enabling the + // transformation. + Unroll, + // The loop distribution transformation only has a state form that is + // exposed by #pragma clang loop distribute (enable | disable). + Distribute, + // The vector predication only has a state form that is exposed by + // #pragma clang loop vectorize_predicate (enable | disable). + VectorizePredicate, + // This serves as a indicator to how many category are listed in this enum. + NumberOfCategories + }; + // The following array accumulates the hints encountered while iterating + // through the attributes to check for compatibility. struct { const LoopHintAttr *StateAttr; const LoopHintAttr *NumericAttr; - } HintAttrs[] = {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, - {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, - {nullptr, nullptr}}; + } HintAttrs[CategoryType::NumberOfCategories] = {}; for (const auto *I : Attrs) { const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(I); @@ -329,16 +341,8 @@ CheckForIncompatibleAttributes(Sema &S, if (!LH) continue; + CategoryType Category = CategoryType::NumberOfCategories; LoopHintAttr::OptionType Option = LH->getOption(); - enum { - Vectorize, - Interleave, - Unroll, - UnrollAndJam, - Distribute, - Pipeline, - VectorizePredicate - } Category; switch (Option) { case LoopHintAttr::Vectorize: case LoopHintAttr::VectorizeWidth: @@ -369,7 +373,7 @@ CheckForIncompatibleAttributes(Sema &S, break; }; - assert(Category < sizeof(HintAttrs) / sizeof(HintAttrs[0])); + assert(Category != NumberOfCategories && "Unhandled loop hint option"); auto &CategoryState = HintAttrs[Category]; const LoopHintAttr *PrevAttr; if (Option == LoopHintAttr::Vectorize || _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits