-
Notifications
You must be signed in to change notification settings - Fork 14.5k
[mlir][NFC] Use hasOneBlock
instead of llvm::hasSingleElement(region)
#149809
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
@llvm/pr-subscribers-mlir-linalg @llvm/pr-subscribers-mlir-gpu Author: Longsheng Mou (CoTinker) ChangesFull diff: https://github.com/llvm/llvm-project/pull/149809.diff 19 Files Affected:
diff --git a/mlir/include/mlir/IR/OpDefinition.h b/mlir/include/mlir/IR/OpDefinition.h
index 883ece32967e4..be92fe0a6c7e3 100644
--- a/mlir/include/mlir/IR/OpDefinition.h
+++ b/mlir/include/mlir/IR/OpDefinition.h
@@ -889,7 +889,7 @@ struct SingleBlock : public TraitBase<ConcreteType, SingleBlock> {
continue;
// Non-empty regions must contain a single basic block.
- if (!llvm::hasSingleElement(region))
+ if (!region.hasOneBlock())
return op->emitOpError("expects region #")
<< i << " to have 0 or 1 blocks";
diff --git a/mlir/include/mlir/Parser/Parser.h b/mlir/include/mlir/Parser/Parser.h
index 828760fcbefa9..6683c2b4401d5 100644
--- a/mlir/include/mlir/Parser/Parser.h
+++ b/mlir/include/mlir/Parser/Parser.h
@@ -66,8 +66,7 @@ inline OwningOpRef<ContainerOpT> constructContainerOpForParserIfNecessary(
OpBuilder builder(context);
ContainerOpT op = builder.create<ContainerOpT>(sourceFileLoc);
OwningOpRef<ContainerOpT> opRef(op);
- assert(op->getNumRegions() == 1 &&
- llvm::hasSingleElement(op->getRegion(0)) &&
+ assert(op->getNumRegions() == 1 && op->getRegion(0).hasOneBlock() &&
"expected generated operation to have a single region with a single "
"block");
Block *opBlock = &op->getRegion(0).front();
diff --git a/mlir/lib/Analysis/SliceAnalysis.cpp b/mlir/lib/Analysis/SliceAnalysis.cpp
index 991c71e3f689a..7037fa644c7be 100644
--- a/mlir/lib/Analysis/SliceAnalysis.cpp
+++ b/mlir/lib/Analysis/SliceAnalysis.cpp
@@ -137,7 +137,7 @@ static LogicalResult getBackwardSliceImpl(Operation *op,
// into us. For now, just bail.
if (parentOp && backwardSlice->count(parentOp) == 0) {
if (parentOp->getNumRegions() == 1 &&
- llvm::hasSingleElement(parentOp->getRegion(0).getBlocks())) {
+ parentOp->getRegion(0).hasOneBlock()) {
return getBackwardSliceImpl(parentOp, visited, backwardSlice,
options);
}
diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
index ee5db073ffc4e..8d7053c02fd84 100644
--- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
+++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
@@ -169,7 +169,7 @@ struct AffineInlinerInterface : public DialectInlinerInterface {
// Multi-block regions cannot be inlined into affine constructs, all of
// which require single-block regions.
- if (!llvm::hasSingleElement(*src))
+ if (!src->hasOneBlock())
return false;
// Side-effecting operations that the affine dialect cannot understand
diff --git a/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp b/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
index 57b529daa3c1e..9bf11c7905aa1 100644
--- a/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
@@ -158,7 +158,7 @@ getEffectsBefore(Operation *op,
// If there is a non-structured control flow, bail.
Region *region = op->getBlock()->getParent();
- if (region && !llvm::hasSingleElement(region->getBlocks())) {
+ if (region && !region->hasOneBlock()) {
addAllValuelessEffects(effects);
return false;
}
@@ -250,7 +250,7 @@ getEffectsAfter(Operation *op,
// If there is a non-structured control flow, bail.
Region *region = op->getBlock()->getParent();
- if (region && !llvm::hasSingleElement(region->getBlocks())) {
+ if (region && !region->hasOneBlock()) {
addAllValuelessEffects(effects);
return false;
}
diff --git a/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp b/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
index 14c44f27a6249..a93f658051276 100644
--- a/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
@@ -126,8 +126,7 @@ static void insertCopies(Region ®ion, Location loc, Value from, Value to) {
(void)toType;
assert(fromType.getShape() == toType.getShape());
assert(fromType.getRank() != 0);
- assert(llvm::hasSingleElement(region) &&
- "unstructured control flow not supported");
+ assert(region.hasOneBlock() && "unstructured control flow not supported");
auto b = ImplicitLocOpBuilder::atBlockBegin(loc, ®ion.front());
insertCopyLoops(b, from, to);
diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
index 085ae4c93b829..f49d9a1eb96b5 100644
--- a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
+++ b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
@@ -1277,8 +1277,7 @@ LogicalResult mlir::linalg::detail::verifyStructuredOpInterface(Operation *op) {
return op->emitOpError("expected the shape-to-loops map to be non-null");
// Check the region has exactly one block.
- if (linalgOp->getNumRegions() != 1 ||
- !llvm::hasSingleElement(linalgOp->getRegion(0)))
+ if (linalgOp->getNumRegions() != 1 || !linalgOp->getRegion(0).hasOneBlock())
return op->emitOpError("expects to have 1 region with 1 block");
// Simplifying assumption: bbargs match 1-1 with shape operands elemental
diff --git a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
index e89e80b07d20d..14d62005e2a07 100644
--- a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
@@ -92,7 +92,7 @@ static bool isTiled(AffineMap map, ArrayRef<OpFoldResult> tileSizes) {
std::optional<RegionMatcher::BinaryOpKind>
RegionMatcher::matchAsScalarBinaryOp(GenericOp op) {
auto ®ion = op.getRegion();
- if (!llvm::hasSingleElement(region))
+ if (!region.hasOneBlock())
return std::nullopt;
Block &block = region.front();
@@ -204,7 +204,7 @@ bool allIndexingsAreProjectedPermutation(LinalgOp op) {
}
bool hasOnlyScalarElementwiseOp(Region &r) {
- if (!llvm::hasSingleElement(r))
+ if (!r.hasOneBlock())
return false;
for (Operation &op : r.front()) {
if (!(isa<arith::ConstantOp, func::ConstantOp, tensor::ExtractOp,
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index fbc1f003ab648..e73bdd3e11621 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -859,7 +859,7 @@ struct RemoveConstantIfCondition : public OpRewritePattern<OpTy> {
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(PatternRewriter &rewriter, Operation *op,
Region ®ion, ValueRange blockArgs = {}) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp
index df41eba4ef533..d769f83ca1520 100644
--- a/mlir/lib/Dialect/SCF/IR/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp
@@ -112,7 +112,7 @@ static TerminatorTy verifyAndGetTerminator(Operation *op, Region ®ion,
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(PatternRewriter &rewriter, Operation *op,
Region ®ion, ValueRange blockArgs = {}) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
@@ -184,7 +184,7 @@ struct SingleBlockExecuteInliner : public OpRewritePattern<ExecuteRegionOp> {
LogicalResult matchAndRewrite(ExecuteRegionOp op,
PatternRewriter &rewriter) const override {
- if (!llvm::hasSingleElement(op.getRegion()))
+ if (!op.getRegion().hasOneBlock())
return failure();
replaceOpWithRegion(rewriter, op, op.getRegion());
return success();
diff --git a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
index 181a29ef70e82..9a68565450774 100644
--- a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
+++ b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
@@ -418,7 +418,7 @@ transform::LoopCoalesceOp::applyToOne(transform::TransformRewriter &rewriter,
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(RewriterBase &rewriter, Operation *op,
Region ®ion) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
@@ -434,7 +434,7 @@ DiagnosedSilenceableFailure transform::TakeAssumedBranchOp::applyToOne(
rewriter.setInsertionPoint(ifOp);
Region ®ion =
getTakeElseBranch() ? ifOp.getElseRegion() : ifOp.getThenRegion();
- if (!llvm::hasSingleElement(region)) {
+ if (!region.hasOneBlock()) {
return emitDefiniteFailure()
<< "requires an scf.if op with a single-block "
<< ((getTakeElseBranch()) ? "`else`" : "`then`") << " region";
diff --git a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
index 99d021081f866..85093828efa96 100644
--- a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -51,8 +51,7 @@ static Value castBuffer(OpBuilder &b, Value buffer, Type type) {
static bool doesNotAliasExternalValue(Value value, Region *region,
ValueRange exceptions,
const OneShotAnalysisState &state) {
- assert(llvm::hasSingleElement(region->getBlocks()) &&
- "expected region with single block");
+ assert(region->hasOneBlock() && "expected region with single block");
bool result = true;
state.applyOnAliases(value, [&](Value alias) {
if (llvm::is_contained(exceptions, alias))
diff --git a/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
index 23a4266d6b780..e4054750b9fe5 100644
--- a/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -37,7 +37,7 @@ struct AssumingOpInterface
size_t resultNum = std::distance(op->getOpResults().begin(),
llvm::find(op->getOpResults(), value));
// TODO: Support multiple blocks.
- assert(llvm::hasSingleElement(assumingOp.getDoRegion().getBlocks()) &&
+ assert(assumingOp.getDoRegion().hasOneBlock() &&
"expected exactly 1 block");
auto yieldOp = dyn_cast<shape::AssumingYieldOp>(
assumingOp.getDoRegion().front().getTerminator());
@@ -49,8 +49,7 @@ struct AssumingOpInterface
const BufferizationOptions &options,
BufferizationState &state) const {
auto assumingOp = cast<shape::AssumingOp>(op);
- assert(llvm::hasSingleElement(assumingOp.getDoRegion().getBlocks()) &&
- "only 1 block supported");
+ assert(assumingOp.getDoRegion().hasOneBlock() && "only 1 block supported");
auto yieldOp = cast<shape::AssumingYieldOp>(
assumingOp.getDoRegion().front().getTerminator());
diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp
index aaa4d5617eb4f..07c311b64aa20 100644
--- a/mlir/lib/IR/SymbolTable.cpp
+++ b/mlir/lib/IR/SymbolTable.cpp
@@ -121,7 +121,7 @@ SymbolTable::SymbolTable(Operation *symbolTableOp)
"expected operation to have SymbolTable trait");
assert(symbolTableOp->getNumRegions() == 1 &&
"expected operation to have a single region");
- assert(llvm::hasSingleElement(symbolTableOp->getRegion(0)) &&
+ assert(symbolTableOp->getRegion(0).hasOneBlock() &&
"expected operation to have a single block");
StringAttr symbolNameId = StringAttr::get(symbolTableOp->getContext(),
@@ -484,7 +484,7 @@ LogicalResult detail::verifySymbolTable(Operation *op) {
if (op->getNumRegions() != 1)
return op->emitOpError()
<< "Operations with a 'SymbolTable' must have exactly one region";
- if (!llvm::hasSingleElement(op->getRegion(0)))
+ if (!op->getRegion(0).hasOneBlock())
return op->emitOpError()
<< "Operations with a 'SymbolTable' must have exactly one block";
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 3185f28fe6681..da39b19388627 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -898,7 +898,7 @@ static LogicalResult inlineConvertOmpRegions(
// Special case for single-block regions that don't create additional blocks:
// insert operations without creating additional blocks.
- if (llvm::hasSingleElement(region)) {
+ if (region.hasOneBlock()) {
llvm::Instruction *potentialTerminator =
builder.GetInsertBlock()->empty() ? nullptr
: &builder.GetInsertBlock()->back();
diff --git a/mlir/lib/Transforms/CSE.cpp b/mlir/lib/Transforms/CSE.cpp
index 8e03f62894bab..4d09c5ff8ab2c 100644
--- a/mlir/lib/Transforms/CSE.cpp
+++ b/mlir/lib/Transforms/CSE.cpp
@@ -239,9 +239,8 @@ LogicalResult CSEDriver::simplifyOperation(ScopedMapTy &knownValues,
// Don't simplify operations with regions that have multiple blocks.
// TODO: We need additional tests to verify that we handle such IR correctly.
- if (!llvm::all_of(op->getRegions(), [](Region &r) {
- return r.getBlocks().empty() || llvm::hasSingleElement(r.getBlocks());
- }))
+ if (!llvm::all_of(op->getRegions(),
+ [](Region &r) { return r.empty() || r.hasOneBlock(); }))
return failure();
// Some simple use case of operation with memory side-effect are dealt with
diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp
index 353f8a58b3ace..a1d975dfb1476 100644
--- a/mlir/lib/Transforms/Utils/RegionUtils.cpp
+++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp
@@ -417,7 +417,7 @@ static LogicalResult deleteDeadness(RewriterBase &rewriter,
for (Region ®ion : regions) {
if (region.empty())
continue;
- bool hasSingleBlock = llvm::hasSingleElement(region);
+ bool hasSingleBlock = region.hasOneBlock();
// Delete every operation that is not live. Graph regions may have cycles
// in the use-def graph, so we must explicitly dropAllUses() from each
@@ -850,7 +850,7 @@ LogicalResult BlockMergeCluster::merge(RewriterBase &rewriter) {
/// failure otherwise.
static LogicalResult mergeIdenticalBlocks(RewriterBase &rewriter,
Region ®ion) {
- if (region.empty() || llvm::hasSingleElement(region))
+ if (region.empty() || region.hasOneBlock())
return failure();
// Identify sets of blocks, other than the entry block, that branch to the
diff --git a/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp b/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
index 7535994955f57..a4a8bfbb2178f 100644
--- a/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
+++ b/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
@@ -53,7 +53,7 @@ void TestCFGLoopInfo::runOnOperation() {
}
llvm::errs() << "\n";
- if (llvm::hasSingleElement(region.getBlocks())) {
+ if (region.hasOneBlock()) {
llvm::errs() << "no loops\n";
return;
}
diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
index 6b22b171822ae..b4aeccf2a46af 100644
--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp
+++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
@@ -2114,7 +2114,7 @@ struct TestMergeBlocksPatternDriver
/// Expect the op to have a single block after legalization.
target.addDynamicallyLegalOp<TestMergeBlocksOp>(
[&](TestMergeBlocksOp op) -> bool {
- return llvm::hasSingleElement(op.getBody());
+ return op.getBody().hasOneBlock();
});
/// Only allow `test.br` within test.merge_blocks op.
|
@llvm/pr-subscribers-mlir Author: Longsheng Mou (CoTinker) ChangesFull diff: https://github.com/llvm/llvm-project/pull/149809.diff 19 Files Affected:
diff --git a/mlir/include/mlir/IR/OpDefinition.h b/mlir/include/mlir/IR/OpDefinition.h
index 883ece32967e4..be92fe0a6c7e3 100644
--- a/mlir/include/mlir/IR/OpDefinition.h
+++ b/mlir/include/mlir/IR/OpDefinition.h
@@ -889,7 +889,7 @@ struct SingleBlock : public TraitBase<ConcreteType, SingleBlock> {
continue;
// Non-empty regions must contain a single basic block.
- if (!llvm::hasSingleElement(region))
+ if (!region.hasOneBlock())
return op->emitOpError("expects region #")
<< i << " to have 0 or 1 blocks";
diff --git a/mlir/include/mlir/Parser/Parser.h b/mlir/include/mlir/Parser/Parser.h
index 828760fcbefa9..6683c2b4401d5 100644
--- a/mlir/include/mlir/Parser/Parser.h
+++ b/mlir/include/mlir/Parser/Parser.h
@@ -66,8 +66,7 @@ inline OwningOpRef<ContainerOpT> constructContainerOpForParserIfNecessary(
OpBuilder builder(context);
ContainerOpT op = builder.create<ContainerOpT>(sourceFileLoc);
OwningOpRef<ContainerOpT> opRef(op);
- assert(op->getNumRegions() == 1 &&
- llvm::hasSingleElement(op->getRegion(0)) &&
+ assert(op->getNumRegions() == 1 && op->getRegion(0).hasOneBlock() &&
"expected generated operation to have a single region with a single "
"block");
Block *opBlock = &op->getRegion(0).front();
diff --git a/mlir/lib/Analysis/SliceAnalysis.cpp b/mlir/lib/Analysis/SliceAnalysis.cpp
index 991c71e3f689a..7037fa644c7be 100644
--- a/mlir/lib/Analysis/SliceAnalysis.cpp
+++ b/mlir/lib/Analysis/SliceAnalysis.cpp
@@ -137,7 +137,7 @@ static LogicalResult getBackwardSliceImpl(Operation *op,
// into us. For now, just bail.
if (parentOp && backwardSlice->count(parentOp) == 0) {
if (parentOp->getNumRegions() == 1 &&
- llvm::hasSingleElement(parentOp->getRegion(0).getBlocks())) {
+ parentOp->getRegion(0).hasOneBlock()) {
return getBackwardSliceImpl(parentOp, visited, backwardSlice,
options);
}
diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
index ee5db073ffc4e..8d7053c02fd84 100644
--- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
+++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
@@ -169,7 +169,7 @@ struct AffineInlinerInterface : public DialectInlinerInterface {
// Multi-block regions cannot be inlined into affine constructs, all of
// which require single-block regions.
- if (!llvm::hasSingleElement(*src))
+ if (!src->hasOneBlock())
return false;
// Side-effecting operations that the affine dialect cannot understand
diff --git a/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp b/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
index 57b529daa3c1e..9bf11c7905aa1 100644
--- a/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
@@ -158,7 +158,7 @@ getEffectsBefore(Operation *op,
// If there is a non-structured control flow, bail.
Region *region = op->getBlock()->getParent();
- if (region && !llvm::hasSingleElement(region->getBlocks())) {
+ if (region && !region->hasOneBlock()) {
addAllValuelessEffects(effects);
return false;
}
@@ -250,7 +250,7 @@ getEffectsAfter(Operation *op,
// If there is a non-structured control flow, bail.
Region *region = op->getBlock()->getParent();
- if (region && !llvm::hasSingleElement(region->getBlocks())) {
+ if (region && !region->hasOneBlock()) {
addAllValuelessEffects(effects);
return false;
}
diff --git a/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp b/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
index 14c44f27a6249..a93f658051276 100644
--- a/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
@@ -126,8 +126,7 @@ static void insertCopies(Region ®ion, Location loc, Value from, Value to) {
(void)toType;
assert(fromType.getShape() == toType.getShape());
assert(fromType.getRank() != 0);
- assert(llvm::hasSingleElement(region) &&
- "unstructured control flow not supported");
+ assert(region.hasOneBlock() && "unstructured control flow not supported");
auto b = ImplicitLocOpBuilder::atBlockBegin(loc, ®ion.front());
insertCopyLoops(b, from, to);
diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
index 085ae4c93b829..f49d9a1eb96b5 100644
--- a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
+++ b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
@@ -1277,8 +1277,7 @@ LogicalResult mlir::linalg::detail::verifyStructuredOpInterface(Operation *op) {
return op->emitOpError("expected the shape-to-loops map to be non-null");
// Check the region has exactly one block.
- if (linalgOp->getNumRegions() != 1 ||
- !llvm::hasSingleElement(linalgOp->getRegion(0)))
+ if (linalgOp->getNumRegions() != 1 || !linalgOp->getRegion(0).hasOneBlock())
return op->emitOpError("expects to have 1 region with 1 block");
// Simplifying assumption: bbargs match 1-1 with shape operands elemental
diff --git a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
index e89e80b07d20d..14d62005e2a07 100644
--- a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
@@ -92,7 +92,7 @@ static bool isTiled(AffineMap map, ArrayRef<OpFoldResult> tileSizes) {
std::optional<RegionMatcher::BinaryOpKind>
RegionMatcher::matchAsScalarBinaryOp(GenericOp op) {
auto ®ion = op.getRegion();
- if (!llvm::hasSingleElement(region))
+ if (!region.hasOneBlock())
return std::nullopt;
Block &block = region.front();
@@ -204,7 +204,7 @@ bool allIndexingsAreProjectedPermutation(LinalgOp op) {
}
bool hasOnlyScalarElementwiseOp(Region &r) {
- if (!llvm::hasSingleElement(r))
+ if (!r.hasOneBlock())
return false;
for (Operation &op : r.front()) {
if (!(isa<arith::ConstantOp, func::ConstantOp, tensor::ExtractOp,
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index fbc1f003ab648..e73bdd3e11621 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -859,7 +859,7 @@ struct RemoveConstantIfCondition : public OpRewritePattern<OpTy> {
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(PatternRewriter &rewriter, Operation *op,
Region ®ion, ValueRange blockArgs = {}) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp
index df41eba4ef533..d769f83ca1520 100644
--- a/mlir/lib/Dialect/SCF/IR/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp
@@ -112,7 +112,7 @@ static TerminatorTy verifyAndGetTerminator(Operation *op, Region ®ion,
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(PatternRewriter &rewriter, Operation *op,
Region ®ion, ValueRange blockArgs = {}) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
@@ -184,7 +184,7 @@ struct SingleBlockExecuteInliner : public OpRewritePattern<ExecuteRegionOp> {
LogicalResult matchAndRewrite(ExecuteRegionOp op,
PatternRewriter &rewriter) const override {
- if (!llvm::hasSingleElement(op.getRegion()))
+ if (!op.getRegion().hasOneBlock())
return failure();
replaceOpWithRegion(rewriter, op, op.getRegion());
return success();
diff --git a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
index 181a29ef70e82..9a68565450774 100644
--- a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
+++ b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
@@ -418,7 +418,7 @@ transform::LoopCoalesceOp::applyToOne(transform::TransformRewriter &rewriter,
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(RewriterBase &rewriter, Operation *op,
Region ®ion) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
@@ -434,7 +434,7 @@ DiagnosedSilenceableFailure transform::TakeAssumedBranchOp::applyToOne(
rewriter.setInsertionPoint(ifOp);
Region ®ion =
getTakeElseBranch() ? ifOp.getElseRegion() : ifOp.getThenRegion();
- if (!llvm::hasSingleElement(region)) {
+ if (!region.hasOneBlock()) {
return emitDefiniteFailure()
<< "requires an scf.if op with a single-block "
<< ((getTakeElseBranch()) ? "`else`" : "`then`") << " region";
diff --git a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
index 99d021081f866..85093828efa96 100644
--- a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -51,8 +51,7 @@ static Value castBuffer(OpBuilder &b, Value buffer, Type type) {
static bool doesNotAliasExternalValue(Value value, Region *region,
ValueRange exceptions,
const OneShotAnalysisState &state) {
- assert(llvm::hasSingleElement(region->getBlocks()) &&
- "expected region with single block");
+ assert(region->hasOneBlock() && "expected region with single block");
bool result = true;
state.applyOnAliases(value, [&](Value alias) {
if (llvm::is_contained(exceptions, alias))
diff --git a/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
index 23a4266d6b780..e4054750b9fe5 100644
--- a/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -37,7 +37,7 @@ struct AssumingOpInterface
size_t resultNum = std::distance(op->getOpResults().begin(),
llvm::find(op->getOpResults(), value));
// TODO: Support multiple blocks.
- assert(llvm::hasSingleElement(assumingOp.getDoRegion().getBlocks()) &&
+ assert(assumingOp.getDoRegion().hasOneBlock() &&
"expected exactly 1 block");
auto yieldOp = dyn_cast<shape::AssumingYieldOp>(
assumingOp.getDoRegion().front().getTerminator());
@@ -49,8 +49,7 @@ struct AssumingOpInterface
const BufferizationOptions &options,
BufferizationState &state) const {
auto assumingOp = cast<shape::AssumingOp>(op);
- assert(llvm::hasSingleElement(assumingOp.getDoRegion().getBlocks()) &&
- "only 1 block supported");
+ assert(assumingOp.getDoRegion().hasOneBlock() && "only 1 block supported");
auto yieldOp = cast<shape::AssumingYieldOp>(
assumingOp.getDoRegion().front().getTerminator());
diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp
index aaa4d5617eb4f..07c311b64aa20 100644
--- a/mlir/lib/IR/SymbolTable.cpp
+++ b/mlir/lib/IR/SymbolTable.cpp
@@ -121,7 +121,7 @@ SymbolTable::SymbolTable(Operation *symbolTableOp)
"expected operation to have SymbolTable trait");
assert(symbolTableOp->getNumRegions() == 1 &&
"expected operation to have a single region");
- assert(llvm::hasSingleElement(symbolTableOp->getRegion(0)) &&
+ assert(symbolTableOp->getRegion(0).hasOneBlock() &&
"expected operation to have a single block");
StringAttr symbolNameId = StringAttr::get(symbolTableOp->getContext(),
@@ -484,7 +484,7 @@ LogicalResult detail::verifySymbolTable(Operation *op) {
if (op->getNumRegions() != 1)
return op->emitOpError()
<< "Operations with a 'SymbolTable' must have exactly one region";
- if (!llvm::hasSingleElement(op->getRegion(0)))
+ if (!op->getRegion(0).hasOneBlock())
return op->emitOpError()
<< "Operations with a 'SymbolTable' must have exactly one block";
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 3185f28fe6681..da39b19388627 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -898,7 +898,7 @@ static LogicalResult inlineConvertOmpRegions(
// Special case for single-block regions that don't create additional blocks:
// insert operations without creating additional blocks.
- if (llvm::hasSingleElement(region)) {
+ if (region.hasOneBlock()) {
llvm::Instruction *potentialTerminator =
builder.GetInsertBlock()->empty() ? nullptr
: &builder.GetInsertBlock()->back();
diff --git a/mlir/lib/Transforms/CSE.cpp b/mlir/lib/Transforms/CSE.cpp
index 8e03f62894bab..4d09c5ff8ab2c 100644
--- a/mlir/lib/Transforms/CSE.cpp
+++ b/mlir/lib/Transforms/CSE.cpp
@@ -239,9 +239,8 @@ LogicalResult CSEDriver::simplifyOperation(ScopedMapTy &knownValues,
// Don't simplify operations with regions that have multiple blocks.
// TODO: We need additional tests to verify that we handle such IR correctly.
- if (!llvm::all_of(op->getRegions(), [](Region &r) {
- return r.getBlocks().empty() || llvm::hasSingleElement(r.getBlocks());
- }))
+ if (!llvm::all_of(op->getRegions(),
+ [](Region &r) { return r.empty() || r.hasOneBlock(); }))
return failure();
// Some simple use case of operation with memory side-effect are dealt with
diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp
index 353f8a58b3ace..a1d975dfb1476 100644
--- a/mlir/lib/Transforms/Utils/RegionUtils.cpp
+++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp
@@ -417,7 +417,7 @@ static LogicalResult deleteDeadness(RewriterBase &rewriter,
for (Region ®ion : regions) {
if (region.empty())
continue;
- bool hasSingleBlock = llvm::hasSingleElement(region);
+ bool hasSingleBlock = region.hasOneBlock();
// Delete every operation that is not live. Graph regions may have cycles
// in the use-def graph, so we must explicitly dropAllUses() from each
@@ -850,7 +850,7 @@ LogicalResult BlockMergeCluster::merge(RewriterBase &rewriter) {
/// failure otherwise.
static LogicalResult mergeIdenticalBlocks(RewriterBase &rewriter,
Region ®ion) {
- if (region.empty() || llvm::hasSingleElement(region))
+ if (region.empty() || region.hasOneBlock())
return failure();
// Identify sets of blocks, other than the entry block, that branch to the
diff --git a/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp b/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
index 7535994955f57..a4a8bfbb2178f 100644
--- a/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
+++ b/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
@@ -53,7 +53,7 @@ void TestCFGLoopInfo::runOnOperation() {
}
llvm::errs() << "\n";
- if (llvm::hasSingleElement(region.getBlocks())) {
+ if (region.hasOneBlock()) {
llvm::errs() << "no loops\n";
return;
}
diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
index 6b22b171822ae..b4aeccf2a46af 100644
--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp
+++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
@@ -2114,7 +2114,7 @@ struct TestMergeBlocksPatternDriver
/// Expect the op to have a single block after legalization.
target.addDynamicallyLegalOp<TestMergeBlocksOp>(
[&](TestMergeBlocksOp op) -> bool {
- return llvm::hasSingleElement(op.getBody());
+ return op.getBody().hasOneBlock();
});
/// Only allow `test.br` within test.merge_blocks op.
|
@llvm/pr-subscribers-flang-openmp Author: Longsheng Mou (CoTinker) ChangesFull diff: https://github.com/llvm/llvm-project/pull/149809.diff 19 Files Affected:
diff --git a/mlir/include/mlir/IR/OpDefinition.h b/mlir/include/mlir/IR/OpDefinition.h
index 883ece32967e4..be92fe0a6c7e3 100644
--- a/mlir/include/mlir/IR/OpDefinition.h
+++ b/mlir/include/mlir/IR/OpDefinition.h
@@ -889,7 +889,7 @@ struct SingleBlock : public TraitBase<ConcreteType, SingleBlock> {
continue;
// Non-empty regions must contain a single basic block.
- if (!llvm::hasSingleElement(region))
+ if (!region.hasOneBlock())
return op->emitOpError("expects region #")
<< i << " to have 0 or 1 blocks";
diff --git a/mlir/include/mlir/Parser/Parser.h b/mlir/include/mlir/Parser/Parser.h
index 828760fcbefa9..6683c2b4401d5 100644
--- a/mlir/include/mlir/Parser/Parser.h
+++ b/mlir/include/mlir/Parser/Parser.h
@@ -66,8 +66,7 @@ inline OwningOpRef<ContainerOpT> constructContainerOpForParserIfNecessary(
OpBuilder builder(context);
ContainerOpT op = builder.create<ContainerOpT>(sourceFileLoc);
OwningOpRef<ContainerOpT> opRef(op);
- assert(op->getNumRegions() == 1 &&
- llvm::hasSingleElement(op->getRegion(0)) &&
+ assert(op->getNumRegions() == 1 && op->getRegion(0).hasOneBlock() &&
"expected generated operation to have a single region with a single "
"block");
Block *opBlock = &op->getRegion(0).front();
diff --git a/mlir/lib/Analysis/SliceAnalysis.cpp b/mlir/lib/Analysis/SliceAnalysis.cpp
index 991c71e3f689a..7037fa644c7be 100644
--- a/mlir/lib/Analysis/SliceAnalysis.cpp
+++ b/mlir/lib/Analysis/SliceAnalysis.cpp
@@ -137,7 +137,7 @@ static LogicalResult getBackwardSliceImpl(Operation *op,
// into us. For now, just bail.
if (parentOp && backwardSlice->count(parentOp) == 0) {
if (parentOp->getNumRegions() == 1 &&
- llvm::hasSingleElement(parentOp->getRegion(0).getBlocks())) {
+ parentOp->getRegion(0).hasOneBlock()) {
return getBackwardSliceImpl(parentOp, visited, backwardSlice,
options);
}
diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
index ee5db073ffc4e..8d7053c02fd84 100644
--- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
+++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
@@ -169,7 +169,7 @@ struct AffineInlinerInterface : public DialectInlinerInterface {
// Multi-block regions cannot be inlined into affine constructs, all of
// which require single-block regions.
- if (!llvm::hasSingleElement(*src))
+ if (!src->hasOneBlock())
return false;
// Side-effecting operations that the affine dialect cannot understand
diff --git a/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp b/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
index 57b529daa3c1e..9bf11c7905aa1 100644
--- a/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp
@@ -158,7 +158,7 @@ getEffectsBefore(Operation *op,
// If there is a non-structured control flow, bail.
Region *region = op->getBlock()->getParent();
- if (region && !llvm::hasSingleElement(region->getBlocks())) {
+ if (region && !region->hasOneBlock()) {
addAllValuelessEffects(effects);
return false;
}
@@ -250,7 +250,7 @@ getEffectsAfter(Operation *op,
// If there is a non-structured control flow, bail.
Region *region = op->getBlock()->getParent();
- if (region && !llvm::hasSingleElement(region->getBlocks())) {
+ if (region && !region->hasOneBlock()) {
addAllValuelessEffects(effects);
return false;
}
diff --git a/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp b/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
index 14c44f27a6249..a93f658051276 100644
--- a/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/MemoryPromotion.cpp
@@ -126,8 +126,7 @@ static void insertCopies(Region ®ion, Location loc, Value from, Value to) {
(void)toType;
assert(fromType.getShape() == toType.getShape());
assert(fromType.getRank() != 0);
- assert(llvm::hasSingleElement(region) &&
- "unstructured control flow not supported");
+ assert(region.hasOneBlock() && "unstructured control flow not supported");
auto b = ImplicitLocOpBuilder::atBlockBegin(loc, ®ion.front());
insertCopyLoops(b, from, to);
diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
index 085ae4c93b829..f49d9a1eb96b5 100644
--- a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
+++ b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp
@@ -1277,8 +1277,7 @@ LogicalResult mlir::linalg::detail::verifyStructuredOpInterface(Operation *op) {
return op->emitOpError("expected the shape-to-loops map to be non-null");
// Check the region has exactly one block.
- if (linalgOp->getNumRegions() != 1 ||
- !llvm::hasSingleElement(linalgOp->getRegion(0)))
+ if (linalgOp->getNumRegions() != 1 || !linalgOp->getRegion(0).hasOneBlock())
return op->emitOpError("expects to have 1 region with 1 block");
// Simplifying assumption: bbargs match 1-1 with shape operands elemental
diff --git a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
index e89e80b07d20d..14d62005e2a07 100644
--- a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
@@ -92,7 +92,7 @@ static bool isTiled(AffineMap map, ArrayRef<OpFoldResult> tileSizes) {
std::optional<RegionMatcher::BinaryOpKind>
RegionMatcher::matchAsScalarBinaryOp(GenericOp op) {
auto ®ion = op.getRegion();
- if (!llvm::hasSingleElement(region))
+ if (!region.hasOneBlock())
return std::nullopt;
Block &block = region.front();
@@ -204,7 +204,7 @@ bool allIndexingsAreProjectedPermutation(LinalgOp op) {
}
bool hasOnlyScalarElementwiseOp(Region &r) {
- if (!llvm::hasSingleElement(r))
+ if (!r.hasOneBlock())
return false;
for (Operation &op : r.front()) {
if (!(isa<arith::ConstantOp, func::ConstantOp, tensor::ExtractOp,
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index fbc1f003ab648..e73bdd3e11621 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -859,7 +859,7 @@ struct RemoveConstantIfCondition : public OpRewritePattern<OpTy> {
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(PatternRewriter &rewriter, Operation *op,
Region ®ion, ValueRange blockArgs = {}) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp
index df41eba4ef533..d769f83ca1520 100644
--- a/mlir/lib/Dialect/SCF/IR/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp
@@ -112,7 +112,7 @@ static TerminatorTy verifyAndGetTerminator(Operation *op, Region ®ion,
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(PatternRewriter &rewriter, Operation *op,
Region ®ion, ValueRange blockArgs = {}) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
@@ -184,7 +184,7 @@ struct SingleBlockExecuteInliner : public OpRewritePattern<ExecuteRegionOp> {
LogicalResult matchAndRewrite(ExecuteRegionOp op,
PatternRewriter &rewriter) const override {
- if (!llvm::hasSingleElement(op.getRegion()))
+ if (!op.getRegion().hasOneBlock())
return failure();
replaceOpWithRegion(rewriter, op, op.getRegion());
return success();
diff --git a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
index 181a29ef70e82..9a68565450774 100644
--- a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
+++ b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
@@ -418,7 +418,7 @@ transform::LoopCoalesceOp::applyToOne(transform::TransformRewriter &rewriter,
/// using the operands of the block terminator to replace operation results.
static void replaceOpWithRegion(RewriterBase &rewriter, Operation *op,
Region ®ion) {
- assert(llvm::hasSingleElement(region) && "expected single-region block");
+ assert(region.hasOneBlock() && "expected single-block region");
Block *block = ®ion.front();
Operation *terminator = block->getTerminator();
ValueRange results = terminator->getOperands();
@@ -434,7 +434,7 @@ DiagnosedSilenceableFailure transform::TakeAssumedBranchOp::applyToOne(
rewriter.setInsertionPoint(ifOp);
Region ®ion =
getTakeElseBranch() ? ifOp.getElseRegion() : ifOp.getThenRegion();
- if (!llvm::hasSingleElement(region)) {
+ if (!region.hasOneBlock()) {
return emitDefiniteFailure()
<< "requires an scf.if op with a single-block "
<< ((getTakeElseBranch()) ? "`else`" : "`then`") << " region";
diff --git a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
index 99d021081f866..85093828efa96 100644
--- a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -51,8 +51,7 @@ static Value castBuffer(OpBuilder &b, Value buffer, Type type) {
static bool doesNotAliasExternalValue(Value value, Region *region,
ValueRange exceptions,
const OneShotAnalysisState &state) {
- assert(llvm::hasSingleElement(region->getBlocks()) &&
- "expected region with single block");
+ assert(region->hasOneBlock() && "expected region with single block");
bool result = true;
state.applyOnAliases(value, [&](Value alias) {
if (llvm::is_contained(exceptions, alias))
diff --git a/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
index 23a4266d6b780..e4054750b9fe5 100644
--- a/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Shape/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -37,7 +37,7 @@ struct AssumingOpInterface
size_t resultNum = std::distance(op->getOpResults().begin(),
llvm::find(op->getOpResults(), value));
// TODO: Support multiple blocks.
- assert(llvm::hasSingleElement(assumingOp.getDoRegion().getBlocks()) &&
+ assert(assumingOp.getDoRegion().hasOneBlock() &&
"expected exactly 1 block");
auto yieldOp = dyn_cast<shape::AssumingYieldOp>(
assumingOp.getDoRegion().front().getTerminator());
@@ -49,8 +49,7 @@ struct AssumingOpInterface
const BufferizationOptions &options,
BufferizationState &state) const {
auto assumingOp = cast<shape::AssumingOp>(op);
- assert(llvm::hasSingleElement(assumingOp.getDoRegion().getBlocks()) &&
- "only 1 block supported");
+ assert(assumingOp.getDoRegion().hasOneBlock() && "only 1 block supported");
auto yieldOp = cast<shape::AssumingYieldOp>(
assumingOp.getDoRegion().front().getTerminator());
diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp
index aaa4d5617eb4f..07c311b64aa20 100644
--- a/mlir/lib/IR/SymbolTable.cpp
+++ b/mlir/lib/IR/SymbolTable.cpp
@@ -121,7 +121,7 @@ SymbolTable::SymbolTable(Operation *symbolTableOp)
"expected operation to have SymbolTable trait");
assert(symbolTableOp->getNumRegions() == 1 &&
"expected operation to have a single region");
- assert(llvm::hasSingleElement(symbolTableOp->getRegion(0)) &&
+ assert(symbolTableOp->getRegion(0).hasOneBlock() &&
"expected operation to have a single block");
StringAttr symbolNameId = StringAttr::get(symbolTableOp->getContext(),
@@ -484,7 +484,7 @@ LogicalResult detail::verifySymbolTable(Operation *op) {
if (op->getNumRegions() != 1)
return op->emitOpError()
<< "Operations with a 'SymbolTable' must have exactly one region";
- if (!llvm::hasSingleElement(op->getRegion(0)))
+ if (!op->getRegion(0).hasOneBlock())
return op->emitOpError()
<< "Operations with a 'SymbolTable' must have exactly one block";
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 3185f28fe6681..da39b19388627 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -898,7 +898,7 @@ static LogicalResult inlineConvertOmpRegions(
// Special case for single-block regions that don't create additional blocks:
// insert operations without creating additional blocks.
- if (llvm::hasSingleElement(region)) {
+ if (region.hasOneBlock()) {
llvm::Instruction *potentialTerminator =
builder.GetInsertBlock()->empty() ? nullptr
: &builder.GetInsertBlock()->back();
diff --git a/mlir/lib/Transforms/CSE.cpp b/mlir/lib/Transforms/CSE.cpp
index 8e03f62894bab..4d09c5ff8ab2c 100644
--- a/mlir/lib/Transforms/CSE.cpp
+++ b/mlir/lib/Transforms/CSE.cpp
@@ -239,9 +239,8 @@ LogicalResult CSEDriver::simplifyOperation(ScopedMapTy &knownValues,
// Don't simplify operations with regions that have multiple blocks.
// TODO: We need additional tests to verify that we handle such IR correctly.
- if (!llvm::all_of(op->getRegions(), [](Region &r) {
- return r.getBlocks().empty() || llvm::hasSingleElement(r.getBlocks());
- }))
+ if (!llvm::all_of(op->getRegions(),
+ [](Region &r) { return r.empty() || r.hasOneBlock(); }))
return failure();
// Some simple use case of operation with memory side-effect are dealt with
diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp
index 353f8a58b3ace..a1d975dfb1476 100644
--- a/mlir/lib/Transforms/Utils/RegionUtils.cpp
+++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp
@@ -417,7 +417,7 @@ static LogicalResult deleteDeadness(RewriterBase &rewriter,
for (Region ®ion : regions) {
if (region.empty())
continue;
- bool hasSingleBlock = llvm::hasSingleElement(region);
+ bool hasSingleBlock = region.hasOneBlock();
// Delete every operation that is not live. Graph regions may have cycles
// in the use-def graph, so we must explicitly dropAllUses() from each
@@ -850,7 +850,7 @@ LogicalResult BlockMergeCluster::merge(RewriterBase &rewriter) {
/// failure otherwise.
static LogicalResult mergeIdenticalBlocks(RewriterBase &rewriter,
Region ®ion) {
- if (region.empty() || llvm::hasSingleElement(region))
+ if (region.empty() || region.hasOneBlock())
return failure();
// Identify sets of blocks, other than the entry block, that branch to the
diff --git a/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp b/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
index 7535994955f57..a4a8bfbb2178f 100644
--- a/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
+++ b/mlir/test/lib/Analysis/TestCFGLoopInfo.cpp
@@ -53,7 +53,7 @@ void TestCFGLoopInfo::runOnOperation() {
}
llvm::errs() << "\n";
- if (llvm::hasSingleElement(region.getBlocks())) {
+ if (region.hasOneBlock()) {
llvm::errs() << "no loops\n";
return;
}
diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
index 6b22b171822ae..b4aeccf2a46af 100644
--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp
+++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
@@ -2114,7 +2114,7 @@ struct TestMergeBlocksPatternDriver
/// Expect the op to have a single block after legalization.
target.addDynamicallyLegalOp<TestMergeBlocksOp>(
[&](TestMergeBlocksOp op) -> bool {
- return llvm::hasSingleElement(op.getBody());
+ return op.getBody().hasOneBlock();
});
/// Only allow `test.br` within test.merge_blocks op.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No objections here, can't see any reason not to land this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
No description provided.