From: eopXD Date: Mon, 7 Nov 2022 17:47:09 +0000 (-0800) Subject: [Clang][Sema] Refactor category declaration under CheckForIncompatibleAttributes... X-Git-Tag: upstream/17.0.6~27558 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6dee23919a36a30f3df7e9b20fba8b9edf65340c;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 7a35d71..9ec8fe2 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(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 ||