[flang-commits] [flang] [flang][OpenMP] Detect BLOCK construct through lookahead (PR #150617)

via flang-commits flang-commits at lists.llvm.org
Fri Jul 25 06:24:43 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-parser

Author: Krzysztof Parzyszek (kparzysz)

<details>
<summary>Changes</summary>

Avoid parsing the entire ExecutionPartConstruct in either the strictly- or the loosely-structured block parser only to discard it when it's not BLOCK (or is BLOCK) respectively. Doing so was not incorrct, but in pathological cases (like Fujitsu 0981_0034) the recursive parsing can take a very long time.

Instead, detect the presence of BLOCK first (via a simple lookahead), and fail immediately if necessary.

---
Full diff: https://github.com/llvm/llvm-project/pull/150617.diff


1 Files Affected:

- (modified) flang/lib/Parser/openmp-parsers.cpp (+12-5) 


``````````diff
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 25a692deba3cc..1c626148a03ae 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -1222,11 +1222,14 @@ struct StrictlyStructuredBlockParser {
   using resultType = Block;
 
   std::optional<resultType> Parse(ParseState &state) const {
-    if (auto epc{Parser<ExecutionPartConstruct>{}.Parse(state)}) {
-      if (IsFortranBlockConstruct(*epc)) {
-        Block block;
-        block.emplace_back(std::move(*epc));
-        return std::move(block);
+    // Detect BLOCK construct without parsing the entire thing.
+    if (lookAhead(skipStuffBeforeStatement >> "BLOCK"_tok).Parse(state)) {
+      if (auto epc{Parser<ExecutionPartConstruct>{}.Parse(state)}) {
+        if (IsFortranBlockConstruct(*epc)) {
+          Block block;
+          block.emplace_back(std::move(*epc));
+          return std::move(block);
+        }
       }
     }
     return std::nullopt;
@@ -1237,6 +1240,10 @@ struct LooselyStructuredBlockParser {
   using resultType = Block;
 
   std::optional<resultType> Parse(ParseState &state) const {
+    // Detect BLOCK construct without parsing the entire thing.
+    if (lookAhead(skipStuffBeforeStatement >> "BLOCK"_tok).Parse(state)) {
+      return std::nullopt;
+    }
     Block body;
     if (auto epc{attempt(Parser<ExecutionPartConstruct>{}).Parse(state)}) {
       if (!IsFortranBlockConstruct(*epc)) {

``````````

</details>


https://github.com/llvm/llvm-project/pull/150617


More information about the flang-commits mailing list