[flang-commits] [flang] [flang] Fixed a crash with undeclared variable in implicit-do loop (PR #149513)
Eugene Epshteyn via flang-commits
flang-commits at lists.llvm.org
Fri Jul 18 06:41:26 PDT 2025
https://github.com/eugeneepshteyn updated https://github.com/llvm/llvm-project/pull/149513
>From a155a355cc1cef2169c37d069ad72b4c180f0633 Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Thu, 17 Jul 2025 14:56:11 -0400
Subject: [PATCH 1/6] [flang] Control alignment of constant folded reals
When REAL types are constant folded, the underneath implementation uses
arrays of integers. Ensure that these arrays are properly aligned.
This matters when building flang with clang. In some cases, the
resulting code for flang compiler ended up using SSE2 aligned load
instructions for REAL(16) constant folding on x86_64, and these
instructions require that the values are loaded from the aligned
addresses.
---
flang/include/flang/Evaluate/integer.h | 1 +
flang/include/flang/Evaluate/real.h | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/flang/include/flang/Evaluate/integer.h b/flang/include/flang/Evaluate/integer.h
index fccc2ad774a8f..5953fc81cb111 100644
--- a/flang/include/flang/Evaluate/integer.h
+++ b/flang/include/flang/Evaluate/integer.h
@@ -74,6 +74,7 @@ class Integer {
static_assert(std::is_unsigned_v<BigPart>);
static_assert(CHAR_BIT * sizeof(BigPart) >= 2 * partBits);
static constexpr bool littleEndian{IS_LITTLE_ENDIAN};
+ static constexpr int alignment{ALIGNMENT};
private:
static constexpr int maxPartBits{CHAR_BIT * sizeof(Part)};
diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h
index 03294881850a1..fa74792a0377f 100644
--- a/flang/include/flang/Evaluate/real.h
+++ b/flang/include/flang/Evaluate/real.h
@@ -490,7 +490,7 @@ template <typename WORD, int PREC> class Real {
bool isNegative, int exponent, const Fraction &, Rounding, RoundingBits,
bool multiply = false);
- Word word_{}; // an Integer<>
+ alignas(Word::alignment / 8) Word word_{}; // an Integer<>
};
extern template class Real<Integer<16>, 11>; // IEEE half format
>From 43102f9b97cc055124b7e0e730cecf71fecdc29a Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Thu, 17 Jul 2025 15:43:08 -0400
Subject: [PATCH 2/6] Added comment
---
flang/include/flang/Evaluate/real.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h
index fa74792a0377f..af17adc8ad8a3 100644
--- a/flang/include/flang/Evaluate/real.h
+++ b/flang/include/flang/Evaluate/real.h
@@ -490,6 +490,9 @@ template <typename WORD, int PREC> class Real {
bool isNegative, int exponent, const Fraction &, Rounding, RoundingBits,
bool multiply = false);
+ // Require alignment, in case code generation code on x86_64 decides that
+ // our Real object is suitable for SSE2 instructions and then gets surprised
+ // by unaligned address.
alignas(Word::alignment / 8) Word word_{}; // an Integer<>
};
>From 26432b55e826ea49030252b43714baf26afa36ac Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Thu, 17 Jul 2025 19:15:09 -0400
Subject: [PATCH 3/6] Comment update
---
flang/include/flang/Evaluate/real.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h
index af17adc8ad8a3..76d25d9fe2670 100644
--- a/flang/include/flang/Evaluate/real.h
+++ b/flang/include/flang/Evaluate/real.h
@@ -490,8 +490,8 @@ template <typename WORD, int PREC> class Real {
bool isNegative, int exponent, const Fraction &, Rounding, RoundingBits,
bool multiply = false);
- // Require alignment, in case code generation code on x86_64 decides that
- // our Real object is suitable for SSE2 instructions and then gets surprised
+ // Require alignment, in case code generation on x86_64 decides that our
+ // Real object is suitable for SSE2 instructions and then gets surprised
// by unaligned address.
alignas(Word::alignment / 8) Word word_{}; // an Integer<>
};
>From 270cdfcf328bc128f722888baa284fb5fdc67ea8 Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Fri, 18 Jul 2025 08:39:01 -0400
Subject: [PATCH 4/6] [flang]
First change: missing variable name in the error message.
---
flang/lib/Semantics/resolve-names.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index b3268605e7c0c..deafdbd269c78 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -8700,7 +8700,7 @@ const parser::Name *DeclarationVisitor::ResolveName(const parser::Name &name) {
return &name;
}
if (isImplicitNoneType() && !deferImplicitTyping_) {
- Say(name, "No explicit type declared for '%s'"_err_en_US);
+ Say(name, "No explicit type declared for '%s'"_err_en_US, name.source);
return nullptr;
}
// Create the symbol, then ensure that it is accessible
>From fc450bc1dd1b7eddf668e3ceaafdebaa17dc1a8f Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Fri, 18 Jul 2025 09:14:56 -0400
Subject: [PATCH 5/6] Actual fix
---
flang/lib/Semantics/check-do-forall.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/check-do-forall.cpp b/flang/lib/Semantics/check-do-forall.cpp
index cc1d4bf58745a..e258df86a4b1c 100644
--- a/flang/lib/Semantics/check-do-forall.cpp
+++ b/flang/lib/Semantics/check-do-forall.cpp
@@ -1180,7 +1180,9 @@ void DoForallChecker::Leave(const parser::IoControlSpec &ioControlSpec) {
void DoForallChecker::Leave(const parser::OutputImpliedDo &outputImpliedDo) {
const auto &control{std::get<parser::IoImpliedDoControl>(outputImpliedDo.t)};
const parser::Name &name{control.name.thing.thing};
- context_.CheckIndexVarRedefine(name.source, *name.symbol);
+ if (name.symbol) {
+ context_.CheckIndexVarRedefine(name.source, *name.symbol);
+ }
}
void DoForallChecker::Leave(const parser::StatVariable &statVariable) {
>From 95dd942ae95b605eaf65cec91a6bbcf8bfc072c9 Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Fri, 18 Jul 2025 09:40:59 -0400
Subject: [PATCH 6/6] Added test
---
flang/test/Semantics/resolve40.f90 | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/flang/test/Semantics/resolve40.f90 b/flang/test/Semantics/resolve40.f90
index a91507aa62282..81bb5f989ec48 100644
--- a/flang/test/Semantics/resolve40.f90
+++ b/flang/test/Semantics/resolve40.f90
@@ -96,3 +96,10 @@ subroutine s12(x)
!BECAUSE: 'x' is an INTENT(IN) dummy argument
read(*,nml=nl)
end
+
+subroutine s13()
+ implicit none
+ !ERROR: No explicit type declared for 'i'
+ !ERROR: No explicit type declared for 'i'
+ print *, (i, i = 1, 2)
+end
More information about the flang-commits
mailing list