mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
simplifycfg: Fix integer overflow converting switch into icmp.
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
This commit is contained in:
parent
ad36608499
commit
a121e24c54
@ -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());
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user