[flang-commits] [flang] [flang] Added fir.is_contiguous_box and fir.box_total_elements ops. (PR #131047)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Thu Mar 13 05:23:20 PDT 2025
================
@@ -4671,6 +4671,79 @@ void fir::UnpackArrayOp::getEffects(
mlir::SideEffects::DefaultResource::get());
}
+//===----------------------------------------------------------------------===//
+// IsContiguousBoxOp
+//===----------------------------------------------------------------------===//
+
+namespace {
+struct SimplifyIsContiguousBoxOp
+ : public mlir::OpRewritePattern<fir::IsContiguousBoxOp> {
+ using mlir::OpRewritePattern<fir::IsContiguousBoxOp>::OpRewritePattern;
+ mlir::LogicalResult
+ matchAndRewrite(fir::IsContiguousBoxOp op,
+ mlir::PatternRewriter &rewriter) const override;
+};
+} // namespace
+
+mlir::LogicalResult SimplifyIsContiguousBoxOp::matchAndRewrite(
+ fir::IsContiguousBoxOp op, mlir::PatternRewriter &rewriter) const {
+ auto boxType = mlir::cast<fir::BaseBoxType>(op.getBox().getType());
+ // Nothing to do for assumed-rank arrays and !fir.box<none>.
+ if (boxType.isAssumedRank() || fir::isBoxNone(boxType))
+ return mlir::failure();
+
+ if (fir::getBoxRank(boxType) == 0) {
+ // Scalars are always contiguous.
+ mlir::Type i1Type = rewriter.getI1Type();
+ rewriter.replaceOpWithNewOp<mlir::arith::ConstantOp>(
+ op, i1Type, rewriter.getIntegerAttr(i1Type, 1));
+ return mlir::success();
+ }
+
+ return mlir::failure();
+}
+
+void fir::IsContiguousBoxOp::getCanonicalizationPatterns(
+ mlir::RewritePatternSet &patterns, mlir::MLIRContext *context) {
+ patterns.add<SimplifyIsContiguousBoxOp>(context);
+}
+
+//===----------------------------------------------------------------------===//
+// BoxTotalElementsOp
+//===----------------------------------------------------------------------===//
+
+namespace {
+struct SimplifyBoxTotalElementsOp
+ : public mlir::OpRewritePattern<fir::BoxTotalElementsOp> {
+ using mlir::OpRewritePattern<fir::BoxTotalElementsOp>::OpRewritePattern;
+ mlir::LogicalResult
+ matchAndRewrite(fir::BoxTotalElementsOp op,
+ mlir::PatternRewriter &rewriter) const override;
+};
+} // namespace
+
+mlir::LogicalResult SimplifyBoxTotalElementsOp::matchAndRewrite(
----------------
tblah wrote:
I think we could also canonicalize this for cases where the number of elements is known at compile time inside of the type e.g. !fir.box<!fir.array<10xi32>>
https://github.com/llvm/llvm-project/pull/131047
More information about the flang-commits
mailing list