Add a utility accessor 'has_single_element' for ranges.
authorRiver Riddle <riverriddle@google.com>
Wed, 30 Oct 2019 18:13:52 +0000 (11:13 -0700)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Wed, 30 Oct 2019 18:14:30 +0000 (11:14 -0700)
This provides an easy way to check if a range has a single element.

PiperOrigin-RevId: 277544647

mlir/include/mlir/Support/STLExtras.h
mlir/lib/Dialect/AffineOps/AffineOps.cpp
mlir/lib/Dialect/SPIRV/SPIRVOps.cpp
mlir/lib/IR/Module.cpp

index 2ab890e..24e2ac6 100644 (file)
@@ -193,6 +193,11 @@ template <typename ContainerTy> auto make_second_range(ContainerTy &&c) {
       });
 }
 
+/// Returns true of the given range only contains a single element.
+template <typename ContainerTy> 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.
index 6d90464..76417bb 100644 (file)
@@ -1337,8 +1337,7 @@ struct AffineForEmptyLoopFolder : public OpRewritePattern<AffineForOp> {
   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();
index 85e22a5..c47d4b8 100644 (file)
@@ -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<spirv::BranchOp>(srcBlock.back());
index 9f3bdaa..f55f960 100644 (file)
@@ -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.