<div dir="ltr"><div>In the future, please edit the title from git revert so it doesn't have a long string of "Revert Revert". It makes it hard to know the current state of the change without counting the number of Reverts.</div><div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 23, 2021 at 6:26 PM Jun Ma via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Jun Ma<br>
Date: 2021-11-24T10:26:37+08:00<br>
New Revision: 07333810caee48e94587891191a970be8a117fcf<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/07333810caee48e94587891191a970be8a117fcf" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/07333810caee48e94587891191a970be8a117fcf</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/07333810caee48e94587891191a970be8a117fcf.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/07333810caee48e94587891191a970be8a117fcf.diff</a><br>
<br>
LOG: Revert "Revert "Revert "Recommit "Revert "[CVP] processSwitch: Remove default case when switch cover all possible values."""""<br>
<br>
This reverts commit c93f93b2e3f28997f794265089fb8138dd5b5f13.<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/include/llvm/Transforms/Utils/Local.h<br>
    llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br>
    llvm/lib/Transforms/Utils/Local.cpp<br>
    llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
    llvm/test/Transforms/CorrelatedValuePropagation/basic.ll<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/include/llvm/Transforms/Utils/Local.h b/llvm/include/llvm/Transforms/Utils/Local.h<br>
index 72cb606eb51a2..3c529abce85a2 100644<br>
--- a/llvm/include/llvm/Transforms/Utils/Local.h<br>
+++ b/llvm/include/llvm/Transforms/Utils/Local.h<br>
@@ -55,7 +55,6 @@ class MDNode;<br>
 class MemorySSAUpdater;<br>
 class PHINode;<br>
 class StoreInst;<br>
-class SwitchInst;<br>
 class TargetLibraryInfo;<br>
 class TargetTransformInfo;<br>
<br>
@@ -238,10 +237,6 @@ CallInst *createCallMatchingInvoke(InvokeInst *II);<br>
 /// This function converts the specified invoek into a normall call.<br>
 void changeToCall(InvokeInst *II, DomTreeUpdater *DTU = nullptr);<br>
<br>
-/// This function removes the default destination from the specified switch.<br>
-void createUnreachableSwitchDefault(SwitchInst *Switch,<br>
-                                    DomTreeUpdater *DTU = nullptr);<br>
-<br>
 ///===---------------------------------------------------------------------===//<br>
 ///  Dbg Intrinsic utilities<br>
 ///<br>
<br>
diff  --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br>
index 71509ebb6a209..d1ae35cc17ab2 100644<br>
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br>
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br>
@@ -376,13 +376,7 @@ static bool processSwitch(SwitchInst *I, LazyValueInfo *LVI,<br>
     // ConstantFoldTerminator() as the underlying SwitchInst can be changed.<br>
     SwitchInstProfUpdateWrapper SI(*I);<br>
<br>
-    APInt Low =<br>
-        APInt::getSignedMaxValue(Cond->getType()->getScalarSizeInBits());<br>
-    APInt High =<br>
-        APInt::getSignedMinValue(Cond->getType()->getScalarSizeInBits());<br>
-<br>
-    SwitchInst::CaseIt CI = SI->case_begin();<br>
-    for (auto CE = SI->case_end(); CI != CE;) {<br>
+    for (auto CI = SI->case_begin(), CE = SI->case_end(); CI != CE;) {<br>
       ConstantInt *Case = CI->getCaseValue();<br>
       LazyValueInfo::Tristate State =<br>
           LVI->getPredicateAt(CmpInst::ICMP_EQ, Cond, Case, I,<br>
@@ -415,28 +409,9 @@ static bool processSwitch(SwitchInst *I, LazyValueInfo *LVI,<br>
         break;<br>
       }<br>
<br>
-      // Get Lower/Upper bound from switch cases.<br>
-      Low = APIntOps::smin(Case->getValue(), Low);<br>
-      High = APIntOps::smax(Case->getValue(), High);<br>
-<br>
       // Increment the case iterator since we didn't delete it.<br>
       ++CI;<br>
     }<br>
-<br>
-    // Try to simplify default case as unreachable<br>
-    if (CI == SI->case_end() && SI->getNumCases() != 0 &&<br>
-        !isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg())) {<br>
-      const ConstantRange SIRange =<br>
-          LVI->getConstantRange(SI->getCondition(), SI);<br>
-<br>
-      // If the numbered switch cases cover the entire range of the condition,<br>
-      // then the default case is not reachable.<br>
-      if (SIRange.getSignedMin() == Low && SIRange.getSignedMax() == High &&<br>
-          SI->getNumCases() == High - Low + 1) {<br>
-        createUnreachableSwitchDefault(SI, &DTU);<br>
-        Changed = true;<br>
-      }<br>
-    }<br>
   }<br>
<br>
   if (Changed)<br>
<br>
diff  --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp<br>
index 74ab37fadf36e..3e36f498523d6 100644<br>
--- a/llvm/lib/Transforms/Utils/Local.cpp<br>
+++ b/llvm/lib/Transforms/Utils/Local.cpp<br>
@@ -2190,26 +2190,6 @@ void llvm::changeToCall(InvokeInst *II, DomTreeUpdater *DTU) {<br>
     DTU->applyUpdates({{DominatorTree::Delete, BB, UnwindDestBB}});<br>
 }<br>
<br>
-void llvm::createUnreachableSwitchDefault(SwitchInst *Switch,<br>
-                                          DomTreeUpdater *DTU) {<br>
-  LLVM_DEBUG(dbgs() << "SimplifyCFG: switch default is dead.\n");<br>
-  auto *BB = Switch->getParent();<br>
-  auto *OrigDefaultBlock = Switch->getDefaultDest();<br>
-  OrigDefaultBlock->removePredecessor(BB);<br>
-  BasicBlock *NewDefaultBlock = BasicBlock::Create(<br>
-      BB->getContext(), BB->getName() + ".unreachabledefault", BB->getParent(),<br>
-      OrigDefaultBlock);<br>
-  new UnreachableInst(Switch->getContext(), NewDefaultBlock);<br>
-  Switch->setDefaultDest(&*NewDefaultBlock);<br>
-  if (DTU) {<br>
-    SmallVector<DominatorTree::UpdateType, 2> Updates;<br>
-    Updates.push_back({DominatorTree::Insert, BB, &*NewDefaultBlock});<br>
-    if (!is_contained(successors(BB), OrigDefaultBlock))<br>
-      Updates.push_back({DominatorTree::Delete, BB, &*OrigDefaultBlock});<br>
-    DTU->applyUpdates(Updates);<br>
-  }<br>
-}<br>
-<br>
 BasicBlock *llvm::changeToInvokeAndSplitBasicBlock(CallInst *CI,<br>
                                                    BasicBlock *UnwindEdge,<br>
                                                    DomTreeUpdater *DTU) {<br>
<br>
diff  --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
index f467de5f924e7..32b5855ef9547 100644<br>
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
@@ -4782,6 +4782,26 @@ static bool CasesAreContiguous(SmallVectorImpl<ConstantInt *> &Cases) {<br>
   return true;<br>
 }<br>
<br>
+static void createUnreachableSwitchDefault(SwitchInst *Switch,<br>
+                                           DomTreeUpdater *DTU) {<br>
+  LLVM_DEBUG(dbgs() << "SimplifyCFG: switch default is dead.\n");<br>
+  auto *BB = Switch->getParent();<br>
+  auto *OrigDefaultBlock = Switch->getDefaultDest();<br>
+  OrigDefaultBlock->removePredecessor(BB);<br>
+  BasicBlock *NewDefaultBlock = BasicBlock::Create(<br>
+      BB->getContext(), BB->getName() + ".unreachabledefault", BB->getParent(),<br>
+      OrigDefaultBlock);<br>
+  new UnreachableInst(Switch->getContext(), NewDefaultBlock);<br>
+  Switch->setDefaultDest(&*NewDefaultBlock);<br>
+  if (DTU) {<br>
+    SmallVector<DominatorTree::UpdateType, 2> Updates;<br>
+    Updates.push_back({DominatorTree::Insert, BB, &*NewDefaultBlock});<br>
+    if (!is_contained(successors(BB), OrigDefaultBlock))<br>
+      Updates.push_back({DominatorTree::Delete, BB, &*OrigDefaultBlock});<br>
+    DTU->applyUpdates(Updates);<br>
+  }<br>
+}<br>
+<br>
 /// Turn a switch with two reachable destinations into an integer range<br>
 /// comparison and branch.<br>
 bool SimplifyCFGOpt::TurnSwitchRangeIntoICmp(SwitchInst *SI,<br>
<br>
diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll<br>
index 9caaacfa00d21..7cea6ace5df59 100644<br>
--- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll<br>
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll<br>
@@ -382,7 +382,7 @@ define i32 @switch_range(i32 %cond) {<br>
 ; CHECK-NEXT:  entry:<br>
 ; CHECK-NEXT:    [[S:%.*]] = urem i32 [[COND:%.*]], 3<br>
 ; CHECK-NEXT:    [[S1:%.*]] = add nuw nsw i32 [[S]], 1<br>
-; CHECK-NEXT:    switch i32 [[S1]], label [[ENTRY_UNREACHABLEDEFAULT:%.*]] [<br>
+; CHECK-NEXT:    switch i32 [[S1]], label [[UNREACHABLE:%.*]] [<br>
 ; CHECK-NEXT:    i32 1, label [[EXIT1:%.*]]<br>
 ; CHECK-NEXT:    i32 2, label [[EXIT2:%.*]]<br>
 ; CHECK-NEXT:    i32 3, label [[EXIT1]]<br>
@@ -391,8 +391,6 @@ define i32 @switch_range(i32 %cond) {<br>
 ; CHECK-NEXT:    ret i32 1<br>
 ; CHECK:       exit2:<br>
 ; CHECK-NEXT:    ret i32 2<br>
-; CHECK:       entry.unreachabledefault:<br>
-; CHECK-NEXT:    unreachable<br>
 ; CHECK:       unreachable:<br>
 ; CHECK-NEXT:    ret i32 0<br>
 ;<br>
@@ -455,9 +453,10 @@ define i8 @switch_defaultdest_multipleuse(i8 %t0) {<br>
 ; CHECK-NEXT:  entry:<br>
 ; CHECK-NEXT:    [[O:%.*]] = or i8 [[T0:%.*]], 1<br>
 ; CHECK-NEXT:    [[R:%.*]] = srem i8 1, [[O]]<br>
-; CHECK-NEXT:    br label [[EXIT:%.*]]<br>
-; CHECK:       entry.unreachabledefault:<br>
-; CHECK-NEXT:    unreachable<br>
+; CHECK-NEXT:    switch i8 [[R]], label [[EXIT:%.*]] [<br>
+; CHECK-NEXT:    i8 0, label [[EXIT]]<br>
+; CHECK-NEXT:    i8 1, label [[EXIT]]<br>
+; CHECK-NEXT:    ]<br>
 ; CHECK:       exit:<br>
 ; CHECK-NEXT:    ret i8 0<br>
 ;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>