diff --git a/mlir/include/mlir/Transforms/RegionUtils.h b/mlir/include/mlir/Transforms/RegionUtils.h index 192ff71384059..f65d0d44eef42 100644 --- a/mlir/include/mlir/Transforms/RegionUtils.h +++ b/mlir/include/mlir/Transforms/RegionUtils.h @@ -87,8 +87,9 @@ LogicalResult eraseUnreachableBlocks(RewriterBase &rewriter, LogicalResult runRegionDCE(RewriterBase &rewriter, MutableArrayRef regions); -/// Get a topologically sorted list of blocks of the given region. -SetVector getTopologicallySortedBlocks(Region ®ion); +/// Get a list of blocks that is sorted according to dominance. This sort is +/// stable. +SetVector getBlocksSortedByDominance(Region ®ion); } // namespace mlir diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp index b964d1c082b20..eeda245ce969f 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp @@ -392,7 +392,7 @@ static LogicalResult convertDataOp(acc::DataOp &op, llvm::BasicBlock *endDataBlock = llvm::BasicBlock::Create( ctx, "acc.end_data", builder.GetInsertBlock()->getParent()); - SetVector blocks = getTopologicallySortedBlocks(op.getRegion()); + SetVector blocks = getBlocksSortedByDominance(op.getRegion()); for (Block *bb : blocks) { llvm::BasicBlock *llvmBB = moduleTranslation.lookupBlock(bb); if (bb->isEntryBlock()) { diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp index a7294632d6667..aa3c516b0c5d6 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -198,7 +198,7 @@ static llvm::BasicBlock *convertOmpOpRegions( // Convert blocks one by one in topological order to ensure // defs are converted before uses. - SetVector blocks = getTopologicallySortedBlocks(region); + SetVector blocks = getBlocksSortedByDominance(region); for (Block *bb : blocks) { llvm::BasicBlock *llvmBB = moduleTranslation.lookupBlock(bb); // Retarget the branch of the entry block to the entry block of the @@ -2146,40 +2146,38 @@ getFirstOrLastMappedMemberPtr(mlir::omp::MapInfoOp mapInfo, bool first) { llvm::SmallVector indices(shape[0]); std::iota(indices.begin(), indices.end(), 0); - llvm::sort( - indices.begin(), indices.end(), [&](const size_t a, const size_t b) { - auto indexValues = indexAttr.getValues(); - for (int i = 0; - i < shape[1]; - ++i) { - int aIndex = indexValues[a * shape[1] + i]; - int bIndex = indexValues[b * shape[1] + i]; + llvm::sort(indices.begin(), indices.end(), + [&](const size_t a, const size_t b) { + auto indexValues = indexAttr.getValues(); + for (int i = 0; i < shape[1]; ++i) { + int aIndex = indexValues[a * shape[1] + i]; + int bIndex = indexValues[b * shape[1] + i]; - if (aIndex == bIndex) - continue; + if (aIndex == bIndex) + continue; - if (aIndex != -1 && bIndex == -1) - return false; + if (aIndex != -1 && bIndex == -1) + return false; - if (aIndex == -1 && bIndex != -1) - return true; + if (aIndex == -1 && bIndex != -1) + return true; - // A is earlier in the record type layout than B - if (aIndex < bIndex) - return first; + // A is earlier in the record type layout than B + if (aIndex < bIndex) + return first; - if (bIndex < aIndex) - return !first; - } + if (bIndex < aIndex) + return !first; + } - // Iterated the entire list and couldn't make a decision, all elements - // were likely the same. Return false, since the sort comparator should - // return false for equal elements. - return false; - }); + // Iterated the entire list and couldn't make a decision, all + // elements were likely the same. Return false, since the sort + // comparator should return false for equal elements. + return false; + }); - return llvm::cast( - mapInfo.getMembers()[indices.front()].getDefiningOp()); + return llvm::cast( + mapInfo.getMembers()[indices.front()].getDefiningOp()); } /// This function calculates the array/pointer offset for map data provided diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 669b95a9c6a5b..21e7c0b50d2a4 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1320,7 +1320,7 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) { // Then, convert blocks one by one in topological order to ensure defs are // converted before uses. - auto blocks = getTopologicallySortedBlocks(func.getBody()); + auto blocks = getBlocksSortedByDominance(func.getBody()); for (Block *bb : blocks) { CapturingIRBuilder builder(llvmContext); if (failed(convertBlockImpl(*bb, bb->isEntryBlock(), builder, diff --git a/mlir/lib/Transforms/Mem2Reg.cpp b/mlir/lib/Transforms/Mem2Reg.cpp index e096747741c0a..e2e240ad865ce 100644 --- a/mlir/lib/Transforms/Mem2Reg.cpp +++ b/mlir/lib/Transforms/Mem2Reg.cpp @@ -517,7 +517,7 @@ getOrCreateBlockIndices(BlockIndexCache &blockIndexCache, Region *region) { return it->second; DenseMap &blockIndices = it->second; - SetVector topologicalOrder = getTopologicallySortedBlocks(*region); + SetVector topologicalOrder = getBlocksSortedByDominance(*region); for (auto [index, block] : llvm::enumerate(topologicalOrder)) blockIndices[block] = index; return blockIndices; diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp index e25867b527b71..192f59b353295 100644 --- a/mlir/lib/Transforms/Utils/RegionUtils.cpp +++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp @@ -837,7 +837,7 @@ LogicalResult mlir::simplifyRegions(RewriterBase &rewriter, mergedIdenticalBlocks); } -SetVector mlir::getTopologicallySortedBlocks(Region ®ion) { +SetVector mlir::getBlocksSortedByDominance(Region ®ion) { // For each block that has not been visited yet (i.e. that has no // predecessors), add it to the list as well as its successors. SetVector blocks;