diff options
author | Mark Heffernan <meheff@google.com> | 2014-07-24 18:09:38 +0000 |
---|---|---|
committer | Mark Heffernan <meheff@google.com> | 2014-07-24 18:09:38 +0000 |
commit | c888e41c0c003889cedffe56b97b23ab4fcb5689 (patch) | |
tree | b4206d3dcc26feb28e874fb42f72c5fa2d71ed77 /clang/lib/Sema/SemaStmtAttr.cpp | |
parent | 29a20055965510c7e2a99f7f3b01872a31327d1d (diff) | |
download | bcm5719-llvm-c888e41c0c003889cedffe56b97b23ab4fcb5689.tar.gz bcm5719-llvm-c888e41c0c003889cedffe56b97b23ab4fcb5689.zip |
Add support for #pragma nounroll.
llvm-svn: 213885
Diffstat (limited to 'clang/lib/Sema/SemaStmtAttr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmtAttr.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 603581d117b..86c487b4cd9 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -58,9 +58,11 @@ static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const AttributeList &A, St->getStmtClass() != Stmt::ForStmtClass && St->getStmtClass() != Stmt::CXXForRangeStmtClass && St->getStmtClass() != Stmt::WhileStmtClass) { - const char *Pragma = PragmaNameLoc->Ident->getName() == "unroll" - ? "#pragma unroll" - : "#pragma clang loop"; + const char *Pragma = + llvm::StringSwitch<const char *>(PragmaNameLoc->Ident->getName()) + .Case("unroll", "#pragma unroll") + .Case("nounroll", "#pragma nounroll") + .Default("#pragma clang loop"); S.Diag(St->getLocStart(), diag::err_pragma_loop_precedes_nonloop) << Pragma; return nullptr; } @@ -70,6 +72,9 @@ static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const AttributeList &A, if (PragmaNameLoc->Ident->getName() == "unroll") { Option = ValueLoc ? LoopHintAttr::UnrollCount : LoopHintAttr::Unroll; Spelling = LoopHintAttr::Pragma_unroll; + } else if (PragmaNameLoc->Ident->getName() == "nounroll") { + Option = LoopHintAttr::Unroll; + Spelling = LoopHintAttr::Pragma_nounroll; } else { Option = llvm::StringSwitch<LoopHintAttr::OptionType>(OptionInfo->getName()) .Case("vectorize", LoopHintAttr::Vectorize) @@ -86,6 +91,9 @@ static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const AttributeList &A, if (Option == LoopHintAttr::Unroll && Spelling == LoopHintAttr::Pragma_unroll) { ValueInt = 1; + } else if (Option == LoopHintAttr::Unroll && + Spelling == LoopHintAttr::Pragma_nounroll) { + ValueInt = 0; } else if (Option == LoopHintAttr::Vectorize || Option == LoopHintAttr::Interleave || Option == LoopHintAttr::Unroll) { |