| //===-- 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<mlir::Value> *lbounds, |
| llvm::SmallVectorImpl<mlir::Value> *extents, |
| llvm::SmallVectorImpl<mlir::Value> *strides) { |
| auto boxType = mlir::dyn_cast<fir::BaseBoxType>(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 |