diff options
Diffstat (limited to 'clang/lib/Parse/ParsePragma.cpp')
-rw-r--r-- | clang/lib/Parse/ParsePragma.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 9e9a749bb98..bff5d1170fe 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -826,20 +826,25 @@ bool Parser::HandlePragmaLoopHint(LoopHint &Hint) { // If no option is specified the argument is assumed to be a constant expr. bool OptionUnroll = false; + bool OptionDistribute = false; bool StateOption = false; if (OptionInfo) { // Pragma Unroll does not specify an option. OptionUnroll = OptionInfo->isStr("unroll"); + OptionDistribute = OptionInfo->isStr("distribute"); StateOption = llvm::StringSwitch<bool>(OptionInfo->getName()) .Case("vectorize", true) .Case("interleave", true) - .Default(false) || OptionUnroll; + .Default(false) || + OptionUnroll || OptionDistribute; } + bool AssumeSafetyArg = !OptionUnroll && !OptionDistribute; // Verify loop hint has an argument. if (Toks[0].is(tok::eof)) { ConsumeToken(); // The annotation token. Diag(Toks[0].getLocation(), diag::err_pragma_loop_missing_argument) - << /*StateArgument=*/StateOption << /*FullKeyword=*/OptionUnroll; + << /*StateArgument=*/StateOption << /*FullKeyword=*/OptionUnroll + << /*AssumeSafetyKeyword=*/AssumeSafetyArg; return false; } @@ -853,11 +858,12 @@ bool Parser::HandlePragmaLoopHint(LoopHint &Hint) { llvm::StringSwitch<bool>(StateInfo->getName()) .Cases("enable", "disable", true) .Case("full", OptionUnroll) - .Case("assume_safety", !OptionUnroll) + .Case("assume_safety", AssumeSafetyArg) .Default(false); if (!Valid) { Diag(Toks[0].getLocation(), diag::err_pragma_invalid_keyword) - << /*FullKeyword=*/OptionUnroll; + << /*FullKeyword=*/OptionUnroll + << /*AssumeSafetyKeyword=*/AssumeSafetyArg; return false; } if (Toks.size() > 2) @@ -2005,6 +2011,7 @@ void PragmaLoopHintHandler::HandlePragma(Preprocessor &PP, .Case("vectorize", true) .Case("interleave", true) .Case("unroll", true) + .Case("distribute", true) .Case("vectorize_width", true) .Case("interleave_count", true) .Case("unroll_count", true) |