Skip to content

Commit

Permalink
Revert "Recommit "Revert "[CVP] processSwitch: Remove default case wh…
Browse files Browse the repository at this point in the history
…en switch cover all possible values."""

This reverts commit 8ba2adc.
  • Loading branch information
junparser committed Sep 27, 2021
1 parent e2eb651 commit 3a998c0
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 57 deletions.
5 changes: 0 additions & 5 deletions llvm/include/llvm/Transforms/Utils/Local.h
Expand Up @@ -55,7 +55,6 @@ class MDNode;
class MemorySSAUpdater;
class PHINode;
class StoreInst;
class SwitchInst;
class TargetLibraryInfo;
class TargetTransformInfo;

Expand Down Expand Up @@ -237,10 +236,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
///
Expand Down
27 changes: 1 addition & 26 deletions llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
Expand Up @@ -341,13 +341,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,
Expand Down Expand Up @@ -380,28 +374,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)
Expand Down
20 changes: 0 additions & 20 deletions llvm/lib/Transforms/Utils/Local.cpp
Expand Up @@ -2182,26 +2182,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) {
Expand Down
20 changes: 20 additions & 0 deletions llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Expand Up @@ -4784,6 +4784,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,
Expand Down
11 changes: 5 additions & 6 deletions llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
Expand Up @@ -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]]
Expand All @@ -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
;
Expand Down Expand Up @@ -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
;
Expand Down

0 comments on commit 3a998c0

Please sign in to comment.