[llvm] 0733381 - Revert "Revert "Revert "Recommit "Revert "[CVP] processSwitch: Remove default case when switch cover all possible values."""""

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 23 18:44:46 PST 2021


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.

~Craig


On Tue, Nov 23, 2021 at 6:26 PM Jun Ma via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

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


More information about the llvm-commits mailing list