From 0568e952b6d1dc53f44c8eb5af167fc9d2e0bb34 Mon Sep 17 00:00:00 2001 From: River Riddle Date: Wed, 30 Oct 2019 11:13:52 -0700 Subject: [PATCH] Add a utility accessor 'has_single_element' for ranges. This provides an easy way to check if a range has a single element. PiperOrigin-RevId: 277544647 --- mlir/include/mlir/Support/STLExtras.h | 5 +++++ mlir/lib/Dialect/AffineOps/AffineOps.cpp | 3 +-- mlir/lib/Dialect/SPIRV/SPIRVOps.cpp | 2 +- mlir/lib/IR/Module.cpp | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/mlir/include/mlir/Support/STLExtras.h b/mlir/include/mlir/Support/STLExtras.h index 2ab890eb2e60..24e2ac6a5a3a 100644 --- a/mlir/include/mlir/Support/STLExtras.h +++ b/mlir/include/mlir/Support/STLExtras.h @@ -193,6 +193,11 @@ template auto make_second_range(ContainerTy &&c) { }); } +/// Returns true of the given range only contains a single element. +template bool has_single_element(ContainerTy &&c) { + auto it = std::begin(c), e = std::end(c); + return it != e && std::next(it) == e; +} } // end namespace mlir // Allow tuples to be usable as DenseMap keys. diff --git a/mlir/lib/Dialect/AffineOps/AffineOps.cpp b/mlir/lib/Dialect/AffineOps/AffineOps.cpp index 6d90464e632d..76417bb32891 100644 --- a/mlir/lib/Dialect/AffineOps/AffineOps.cpp +++ b/mlir/lib/Dialect/AffineOps/AffineOps.cpp @@ -1337,8 +1337,7 @@ struct AffineForEmptyLoopFolder : public OpRewritePattern { PatternMatchResult matchAndRewrite(AffineForOp forOp, PatternRewriter &rewriter) const override { // Check that the body only contains a terminator. - auto *body = forOp.getBody(); - if (std::next(body->begin()) != body->end()) + if (!has_single_element(*forOp.getBody())) return matchFailure(); rewriter.eraseOp(forOp); return matchSuccess(); diff --git a/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp index 85e22a5c391f..c47d4b870278 100644 --- a/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp +++ b/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp @@ -1418,7 +1418,7 @@ static void print(spirv::LoopOp loopOp, OpAsmPrinter &printer) { /// given `dstBlock`. static inline bool hasOneBranchOpTo(Block &srcBlock, Block &dstBlock) { // Check that there is only one op in the `srcBlock`. - if (srcBlock.empty() || std::next(srcBlock.begin()) != srcBlock.end()) + if (!has_single_element(srcBlock)) return false; auto branchOp = dyn_cast(srcBlock.back()); diff --git a/mlir/lib/IR/Module.cpp b/mlir/lib/IR/Module.cpp index 9f3bdaa854ce..f55f960ffa2b 100644 --- a/mlir/lib/IR/Module.cpp +++ b/mlir/lib/IR/Module.cpp @@ -87,7 +87,7 @@ LogicalResult ModuleOp::verify() { auto &bodyRegion = getOperation()->getRegion(0); // The body must contain a single basic block. - if (bodyRegion.empty() || std::next(bodyRegion.begin()) != bodyRegion.end()) + if (!has_single_element(bodyRegion)) return emitOpError("expected body region to have a single block"); // Check that the body has no block arguments.