Skip to content

Commit

Permalink
simplifycfg: Fix integer overflow converting switch into icmp.
Browse files Browse the repository at this point in the history
If a switch instruction has a case for every possible value of its type,
with the same successor, SimplifyCFG would replace it with an icmp ult,
but the computation of the bound overflows in that case, which inverts
the test.

Patch by Jed Davis!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179587 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
zmodem authored and jld committed Apr 18, 2013
1 parent 56dd407 commit 2e9f0d2
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
7 changes: 6 additions & 1 deletion lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3073,7 +3073,12 @@ static bool TurnSwitchRangeIntoICmp(SwitchInst *SI, IRBuilder<> &Builder) {
Value *Sub = SI->getCondition();
if (!Offset->isNullValue())
Sub = Builder.CreateAdd(Sub, Offset, Sub->getName()+".off");
Value *Cmp = Builder.CreateICmpULT(Sub, NumCases, "switch");
Value *Cmp;
// If NumCases overflowed, then all possible values jump to the successor.
if (NumCases->isNullValue() && SI->getNumCases() != 0)
Cmp = ConstantInt::getTrue(SI->getContext());
else
Cmp = Builder.CreateICmpULT(Sub, NumCases, "switch");
BranchInst *NewBI = Builder.CreateCondBr(
Cmp, SI->case_begin().getCaseSuccessor(), SI->getDefaultDest());

Expand Down
18 changes: 18 additions & 0 deletions test/Transforms/SimplifyCFG/switch-to-icmp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,21 @@ lor.end:
; CHECK: @test2
; CHECK: %switch = icmp ult i32 %x, 2
}

define i32 @test3(i1 %flag) {
entry:
switch i1 %flag, label %bad [
i1 true, label %good
i1 false, label %good
]

good:
ret i32 0

bad:
ret i32 1

; CHECK: @test3
; CHECK: entry:
; CHECK-NEXT: ret i32 0
}

0 comments on commit 2e9f0d2

Please sign in to comment.