[llvm] [SimplifyCFG] Simplify switch instruction that has duplicate arms (PR #114262)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 1 02:52:24 PDT 2024
================
@@ -7436,6 +7437,140 @@ static bool simplifySwitchOfCmpIntrinsic(SwitchInst *SI, IRBuilderBase &Builder,
return true;
}
+namespace llvm {
+template <> struct DenseMapInfo<const SwitchInst::CaseHandle *> {
+ static const SwitchInst::CaseHandle *getEmptyKey() {
+ return reinterpret_cast<const SwitchInst::CaseHandle *>(
+ DenseMapInfo<void *>::getEmptyKey());
+ }
+ static const SwitchInst::CaseHandle *getTombstoneKey() {
+ return reinterpret_cast<const SwitchInst::CaseHandle *>(
+ DenseMapInfo<void *>::getTombstoneKey());
+ }
+ static unsigned getHashValue(const SwitchInst::CaseHandle *Case) {
+ BasicBlock *Succ = Case->getCaseSuccessor();
+ BranchInst *BI = cast<BranchInst>(Succ->getTerminator());
+
+ auto It = BI->successors();
+ return hash_combine(Succ->size(), hash_combine_range(It.begin(), It.end()));
+ }
+ static bool isEqual(const SwitchInst::CaseHandle *LHS,
+ const SwitchInst::CaseHandle *RHS) {
+
+ auto EKey = DenseMapInfo<const SwitchInst::CaseHandle *>::getEmptyKey();
+ auto TKey = DenseMapInfo<const SwitchInst::CaseHandle *>::getTombstoneKey();
+ if (LHS == EKey || RHS == EKey || LHS == TKey || RHS == TKey)
+ return LHS == RHS;
+
+ auto IsBranchEq = [](BranchInst *A, BranchInst *B) {
+ if (A->isConditional() != B->isConditional())
+ return false;
+
+ if (A->isConditional()) {
----------------
nikic wrote:
Why is this code handling conditional branches? As far as I can tell, your motivating case and all test cases use unconditional branches.
https://github.com/llvm/llvm-project/pull/114262
More information about the llvm-commits
mailing list