//===-- FIRBoxUtils.cpp ---------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "flang/Optimizer/Dialect/FIRBoxUtils.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "mlir/Dialect/Arith/IR/Arith.h" namespace fir { void genDimInfoFromBox(mlir::OpBuilder &builder, mlir::Location loc, mlir::Value box, llvm::SmallVectorImpl *lbounds, llvm::SmallVectorImpl *extents, llvm::SmallVectorImpl *strides) { auto boxType = mlir::dyn_cast(box.getType()); assert(boxType && "must be a box"); if (!lbounds && !extents && !strides) return; unsigned rank = fir::getBoxRank(boxType); assert(!boxType.isAssumedRank() && "must be an array of known rank"); mlir::Type idxTy = builder.getIndexType(); for (unsigned i = 0; i < rank; ++i) { mlir::Value dim = mlir::arith::ConstantIndexOp::create(builder, loc, i); auto dimInfo = fir::BoxDimsOp::create(builder, loc, idxTy, idxTy, idxTy, box, dim); if (lbounds) lbounds->push_back(dimInfo.getLowerBound()); if (extents) extents->push_back(dimInfo.getExtent()); if (strides) strides->push_back(dimInfo.getByteStride()); } } } // namespace fir