[MergeICmp] We can discard initial blocks that do other work
Summary:
We can discard initial blocks that do other work
We do not need to limit ourselves to just the first block in the chain.
Reviewers: courbet, davide
Reviewed By: courbet
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D44029
llvm-svn: 326698
diff --git a/llvm/lib/Transforms/Scalar/MergeICmps.cpp b/llvm/lib/Transforms/Scalar/MergeICmps.cpp
index 2275a0b..7730162 100644
--- a/llvm/lib/Transforms/Scalar/MergeICmps.cpp
+++ b/llvm/lib/Transforms/Scalar/MergeICmps.cpp
@@ -291,8 +291,8 @@
if (Comparison.doesOtherWork()) {
DEBUG(dbgs() << "block '" << Comparison.BB->getName()
<< "' does extra work besides compare\n");
- if (BlockIdx == 0) { // First block.
- // TODO(courbet): The first block can do other things, and we should
+ if (Comparisons.empty()) {
+ // TODO(courbet): The initial block can do other things, and we should
// split them apart in a separate block before the comparison chain.
// Right now we just discard it and make the chain shorter.
DEBUG(dbgs()
@@ -333,7 +333,12 @@
DEBUG(dbgs() << "\n");
Comparisons.push_back(Comparison);
}
- assert(!Comparisons.empty() && "chain with no BCE basic blocks");
+
+ // It is possible we have no suitable comparison to merge.
+ if (Comparisons.empty()) {
+ DEBUG(dbgs() << "chain with no BCE basic blocks, no merge\n");
+ return;
+ }
EntryBlock_ = Comparisons[0].BB;
Comparisons_ = std::move(Comparisons);
#ifdef MERGEICMPS_DOT_ON