diff options
Diffstat (limited to 'lib/Sema/SemaStmtAttr.cpp')
-rw-r--r-- | lib/Sema/SemaStmtAttr.cpp | 77 |
1 files changed, 33 insertions, 44 deletions
diff --git a/lib/Sema/SemaStmtAttr.cpp b/lib/Sema/SemaStmtAttr.cpp index a8e54b36b29b..791c52c2d913 100644 --- a/lib/Sema/SemaStmtAttr.cpp +++ b/lib/Sema/SemaStmtAttr.cpp @@ -1,9 +1,8 @@ //===--- SemaStmtAttr.cpp - Statement Attribute Handling ------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // @@ -83,22 +82,17 @@ static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const ParsedAttr &A, IdentifierLoc *StateLoc = A.getArgAsIdent(2); Expr *ValueExpr = A.getArgAsExpr(3); - bool PragmaUnroll = PragmaNameLoc->Ident->getName() == "unroll"; - bool PragmaNoUnroll = PragmaNameLoc->Ident->getName() == "nounroll"; - bool PragmaUnrollAndJam = PragmaNameLoc->Ident->getName() == "unroll_and_jam"; - bool PragmaNoUnrollAndJam = - PragmaNameLoc->Ident->getName() == "nounroll_and_jam"; + StringRef PragmaName = + llvm::StringSwitch<StringRef>(PragmaNameLoc->Ident->getName()) + .Cases("unroll", "nounroll", "unroll_and_jam", "nounroll_and_jam", + PragmaNameLoc->Ident->getName()) + .Default("clang loop"); + if (St->getStmtClass() != Stmt::DoStmtClass && St->getStmtClass() != Stmt::ForStmtClass && St->getStmtClass() != Stmt::CXXForRangeStmtClass && St->getStmtClass() != Stmt::WhileStmtClass) { - const char *Pragma = - llvm::StringSwitch<const char *>(PragmaNameLoc->Ident->getName()) - .Case("unroll", "#pragma unroll") - .Case("nounroll", "#pragma nounroll") - .Case("unroll_and_jam", "#pragma unroll_and_jam") - .Case("nounroll_and_jam", "#pragma nounroll_and_jam") - .Default("#pragma clang loop"); + std::string Pragma = "#pragma " + std::string(PragmaName); S.Diag(St->getBeginLoc(), diag::err_pragma_loop_precedes_nonloop) << Pragma; return nullptr; } @@ -107,34 +101,29 @@ static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const ParsedAttr &A, LoopHintAttr::Spelling(A.getAttributeSpellingListIndex()); LoopHintAttr::OptionType Option; LoopHintAttr::LoopHintState State; - if (PragmaNoUnroll) { - // #pragma nounroll - Option = LoopHintAttr::Unroll; - State = LoopHintAttr::Disable; - } else if (PragmaUnroll) { - if (ValueExpr) { - // #pragma unroll N - Option = LoopHintAttr::UnrollCount; - State = LoopHintAttr::Numeric; - } else { - // #pragma unroll - Option = LoopHintAttr::Unroll; - State = LoopHintAttr::Enable; - } - } else if (PragmaNoUnrollAndJam) { - // #pragma nounroll_and_jam - Option = LoopHintAttr::UnrollAndJam; - State = LoopHintAttr::Disable; - } else if (PragmaUnrollAndJam) { - if (ValueExpr) { - // #pragma unroll_and_jam N - Option = LoopHintAttr::UnrollAndJamCount; - State = LoopHintAttr::Numeric; - } else { - // #pragma unroll_and_jam - Option = LoopHintAttr::UnrollAndJam; - State = LoopHintAttr::Enable; - } + + auto SetHints = [&Option, &State](LoopHintAttr::OptionType O, + LoopHintAttr::LoopHintState S) { + Option = O; + State = S; + }; + + if (PragmaName == "nounroll") { + SetHints(LoopHintAttr::Unroll, LoopHintAttr::Disable); + } else if (PragmaName == "unroll") { + // #pragma unroll N + if (ValueExpr) + SetHints(LoopHintAttr::UnrollCount, LoopHintAttr::Numeric); + else + SetHints(LoopHintAttr::Unroll, LoopHintAttr::Enable); + } else if (PragmaName == "nounroll_and_jam") { + SetHints(LoopHintAttr::UnrollAndJam, LoopHintAttr::Disable); + } else if (PragmaName == "unroll_and_jam") { + // #pragma unroll_and_jam N + if (ValueExpr) + SetHints(LoopHintAttr::UnrollAndJamCount, LoopHintAttr::Numeric); + else + SetHints(LoopHintAttr::UnrollAndJam, LoopHintAttr::Enable); } else { // #pragma clang loop ... assert(OptionLoc && OptionLoc->Ident && |