forked from OSchip/llvm-project
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
This commit is contained in:
parent
cb40e36d3b
commit
0568e952b6
|
@ -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
|
} // end namespace mlir
|
||||||
|
|
||||||
// Allow tuples to be usable as DenseMap keys.
|
// Allow tuples to be usable as DenseMap keys.
|
||||||
|
|
|
@ -1337,8 +1337,7 @@ struct AffineForEmptyLoopFolder : public OpRewritePattern<AffineForOp> {
|
||||||
PatternMatchResult matchAndRewrite(AffineForOp forOp,
|
PatternMatchResult matchAndRewrite(AffineForOp forOp,
|
||||||
PatternRewriter &rewriter) const override {
|
PatternRewriter &rewriter) const override {
|
||||||
// Check that the body only contains a terminator.
|
// Check that the body only contains a terminator.
|
||||||
auto *body = forOp.getBody();
|
if (!has_single_element(*forOp.getBody()))
|
||||||
if (std::next(body->begin()) != body->end())
|
|
||||||
return matchFailure();
|
return matchFailure();
|
||||||
rewriter.eraseOp(forOp);
|
rewriter.eraseOp(forOp);
|
||||||
return matchSuccess();
|
return matchSuccess();
|
||||||
|
|
|
@ -1418,7 +1418,7 @@ static void print(spirv::LoopOp loopOp, OpAsmPrinter &printer) {
|
||||||
/// given `dstBlock`.
|
/// given `dstBlock`.
|
||||||
static inline bool hasOneBranchOpTo(Block &srcBlock, Block &dstBlock) {
|
static inline bool hasOneBranchOpTo(Block &srcBlock, Block &dstBlock) {
|
||||||
// Check that there is only one op in the `srcBlock`.
|
// 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;
|
return false;
|
||||||
|
|
||||||
auto branchOp = dyn_cast<spirv::BranchOp>(srcBlock.back());
|
auto branchOp = dyn_cast<spirv::BranchOp>(srcBlock.back());
|
||||||
|
|
|
@ -87,7 +87,7 @@ LogicalResult ModuleOp::verify() {
|
||||||
auto &bodyRegion = getOperation()->getRegion(0);
|
auto &bodyRegion = getOperation()->getRegion(0);
|
||||||
|
|
||||||
// The body must contain a single basic block.
|
// 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");
|
return emitOpError("expected body region to have a single block");
|
||||||
|
|
||||||
// Check that the body has no block arguments.
|
// Check that the body has no block arguments.
|
||||||
|
|
Loading…
Reference in New Issue