[flang-commits] [flang] Skip compiler directives between OMP PARALLEL DO and the loop (PR #81021)
Mats Petersson via flang-commits
flang-commits at lists.llvm.org
Wed Feb 7 10:37:51 PST 2024
https://github.com/Leporacanthicus created https://github.com/llvm/llvm-project/pull/81021
This fixes a compilation error when code like this is presented to the compiler:
!$OMP PARALLEL DO
!DIR$ VECTOR ALIGNED
DO 20 i=1,N
a = a + 0.5
20 CONTINUE
The directive itself is later ignored (with a warning that this is happening), but because the compiler already errored out before that point, it completely fails to compile this code. Other compilers accept the code without complaints.
>From 851b4173418073afa23cdf5cecdcb4a52b1b5251 Mon Sep 17 00:00:00 2001
From: Mats Petersson <mats.petersson at arm.com>
Date: Wed, 7 Feb 2024 17:29:36 +0000
Subject: [PATCH] Skip compiler directives between OMP PARALLEL DO and the loop
This fixes a compilation error when code like this is presented to the
compiler:
!$OMP PARALLEL DO
!DIR$ VECTOR ALIGNED
DO 20 i=1,N
a = a + 0.5
20 CONTINUE
The directive itself is later ignored (with a warning that this is
happening), but because the compiler already errored out before that
point, it completely fails to compile this code. Other compilers
accept the code without complaints.
---
flang/lib/Semantics/canonicalize-omp.cpp | 16 +++++++++++-----
flang/test/Semantics/OpenMP/loop-association.f90 | 7 +++++++
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/flang/lib/Semantics/canonicalize-omp.cpp b/flang/lib/Semantics/canonicalize-omp.cpp
index 013fb408214ee..01adcf5372842 100644
--- a/flang/lib/Semantics/canonicalize-omp.cpp
+++ b/flang/lib/Semantics/canonicalize-omp.cpp
@@ -90,7 +90,11 @@ class CanonicalizationOfOmp {
auto &dir{std::get<parser::OmpLoopDirective>(beginDir.t)};
nextIt = it;
- if (++nextIt != block.end()) {
+ while (++nextIt != block.end()) {
+ // Ignore compiler directives.
+ if (auto *directive{GetConstructIf<parser::CompilerDirective>(*nextIt)})
+ continue;
+
if (auto *doCons{GetConstructIf<parser::DoConstruct>(*nextIt)}) {
if (doCons->GetLoopControl()) {
// move DoConstruct
@@ -111,12 +115,14 @@ class CanonicalizationOfOmp {
"DO loop after the %s directive must have loop control"_err_en_US,
parser::ToUpperCaseLetters(dir.source.ToString()));
}
- return; // found do-loop
+ } else {
+ messages_.Say(dir.source,
+ "A DO loop must follow the %s directive"_err_en_US,
+ parser::ToUpperCaseLetters(dir.source.ToString()));
}
+ // If we get here, we either found a loop, or issued an error message.
+ return;
}
- messages_.Say(dir.source,
- "A DO loop must follow the %s directive"_err_en_US,
- parser::ToUpperCaseLetters(dir.source.ToString()));
}
void RewriteOmpAllocations(parser::ExecutionPart &body) {
diff --git a/flang/test/Semantics/OpenMP/loop-association.f90 b/flang/test/Semantics/OpenMP/loop-association.f90
index 8a28fd8878f49..29fca3b4be590 100644
--- a/flang/test/Semantics/OpenMP/loop-association.f90
+++ b/flang/test/Semantics/OpenMP/loop-association.f90
@@ -30,6 +30,13 @@
c = c - 1
END DO outer
+ ! Accept directives between parallel do and actual loop.
+ !$OMP PARALLEL DO
+ !DIR$ VECTOR ALIGNED
+ DO 20 i=1,N
+ a = a + 0.5
+20 CONTINUE
+
c = 16
!ERROR: DO loop after the PARALLEL DO directive must have loop control
!$omp parallel do
More information about the flang-commits
mailing list