diff --git a/flang/lib/Lower/ConvertConstant.cpp b/flang/lib/Lower/ConvertConstant.cpp index 768a237c92396..376ec12150c71 100644 --- a/flang/lib/Lower/ConvertConstant.cpp +++ b/flang/lib/Lower/ConvertConstant.cpp @@ -145,6 +145,9 @@ class DenseGlobalBuilder { fir::FirOpBuilder &builder, const Fortran::evaluate::Constant> &constant) { + using Element = + Fortran::evaluate::Scalar>; + static_assert(TC != Fortran::common::TypeCategory::Character, "must be numerical or logical"); auto attrTc = TC == Fortran::common::TypeCategory::Logical @@ -152,7 +155,24 @@ class DenseGlobalBuilder { : TC; attributeElementType = Fortran::lower::getFIRType(builder.getContext(), attrTc, KIND, {}); - for (auto element : constant.values()) + + const std::vector &values = constant.values(); + auto sameElements = [&]() -> bool { + if (values.empty()) + return false; + + return std::all_of(values.begin(), values.end(), + [&](const auto &v) { return v == values.front(); }); + }; + + if (sameElements()) { + auto attr = convertToAttribute(builder, values.front(), + attributeElementType); + attributes.assign(values.size(), attr); + return; + } + + for (auto element : values) attributes.push_back( convertToAttribute(builder, element, attributeElementType)); }