diff options
Diffstat (limited to 'flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp')
| -rw-r--r-- | flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp index 8104e53920c2..6a57bf2ae6fe 100644 --- a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp +++ b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp @@ -23,6 +23,7 @@ #include "flang/Optimizer/HLFIR/HLFIROps.h" #include "flang/Optimizer/HLFIR/Passes.h" #include "mlir/Transforms/DialectConversion.h" +#include "llvm/ADT/SmallSet.h" namespace hlfir { #define GEN_PASS_DEF_CONVERTHLFIRTOFIR @@ -312,10 +313,12 @@ public: // Propagate other attributes from hlfir.declare to fir.declare. // OpenACC's acc.declare is one example. Right now, the propagation // is verbatim. - mlir::NamedAttrList elidedAttrs = - mlir::NamedAttrList{firDeclareOp->getAttrs()}; + llvm::SmallSet<llvm::StringRef, 8> elidedAttrs; + for (const mlir::NamedAttribute &firAttr : firDeclareOp->getAttrs()) + elidedAttrs.insert(firAttr.getName()); + elidedAttrs.insert(declareOp.getSkipReboxAttrName()); for (const mlir::NamedAttribute &attr : declareOp->getAttrs()) - if (!elidedAttrs.get(attr.getName())) + if (!elidedAttrs.contains(attr.getName())) firDeclareOp->setAttr(attr.getName(), attr.getValue()); auto firBase = firDeclareOp.getResult(); @@ -328,6 +331,8 @@ public: auto genHlfirBox = [&]() -> mlir::Value { if (auto baseBoxType = mlir::dyn_cast<fir::BaseBoxType>(firBase.getType())) { + if (declareOp.getSkipRebox()) + return firBase; // Rebox so that lower bounds and attributes are correct. if (baseBoxType.isAssumedRank()) return fir::ReboxAssumedRankOp::create( |
