mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
VirtRegRewriter assertion fix.
Apparently it's ok for multiple operands to "kill" the same register. Fixes PR9237. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126190 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4ecc82e592
commit
fcfcdbc86a
@ -478,7 +478,8 @@ static void ResurrectConfirmedKill(unsigned Reg, const TargetRegisterInfo* TRI,
|
|||||||
if (!RegKills[KReg])
|
if (!RegKills[KReg])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
assert(KillOps[KReg] == KillOp && "invalid superreg kill flags");
|
assert(KillOps[KReg]->getParent() == KillOp->getParent() &&
|
||||||
|
"invalid superreg kill flags");
|
||||||
KillOps[KReg] = NULL;
|
KillOps[KReg] = NULL;
|
||||||
RegKills.reset(KReg);
|
RegKills.reset(KReg);
|
||||||
|
|
||||||
@ -487,7 +488,8 @@ static void ResurrectConfirmedKill(unsigned Reg, const TargetRegisterInfo* TRI,
|
|||||||
for (const unsigned *SR = TRI->getSubRegisters(KReg); *SR; ++SR) {
|
for (const unsigned *SR = TRI->getSubRegisters(KReg); *SR; ++SR) {
|
||||||
DEBUG(dbgs() << " Resurrect subreg " << TRI->getName(*SR) << "\n");
|
DEBUG(dbgs() << " Resurrect subreg " << TRI->getName(*SR) << "\n");
|
||||||
|
|
||||||
assert(KillOps[*SR] == KillOp && "invalid subreg kill flags");
|
assert(KillOps[*SR]->getParent() == KillOp->getParent() &&
|
||||||
|
"invalid subreg kill flags");
|
||||||
KillOps[*SR] = NULL;
|
KillOps[*SR] = NULL;
|
||||||
RegKills.reset(*SR);
|
RegKills.reset(*SR);
|
||||||
}
|
}
|
||||||
|
50
test/CodeGen/X86/2011-02-21-VirtRegRewriter-KillSubReg.ll
Normal file
50
test/CodeGen/X86/2011-02-21-VirtRegRewriter-KillSubReg.ll
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
; RUN: llc < %s -O2 -march=x86 -mtriple=i386-pc-linux-gnu -relocation-model=pic | FileCheck %s
|
||||||
|
; PR9237: Assertion in VirtRegRewriter.cpp, ResurrectConfirmedKill
|
||||||
|
; `KillOps[*SR] == KillOp && "invalid subreg kill flags"'
|
||||||
|
|
||||||
|
%t = type { i32 }
|
||||||
|
|
||||||
|
define i32 @foo(%t* %s) nounwind {
|
||||||
|
entry:
|
||||||
|
br label %if.then735
|
||||||
|
|
||||||
|
if.then735:
|
||||||
|
%call747 = call i32 undef(%t* %s, i8* null, i8* undef, i32 128, i8* undef, i32 516) nounwind
|
||||||
|
br i1 undef, label %if.then751, label %if.then758
|
||||||
|
|
||||||
|
if.then751:
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
if.then758:
|
||||||
|
%add761 = add i32 %call747, 4
|
||||||
|
%add763 = add i32 %add761, %call747
|
||||||
|
%add.ptr768 = getelementptr inbounds [516 x i8]* null, i32 0, i32 %add761
|
||||||
|
br i1 undef, label %cond.false783, label %cond.true771
|
||||||
|
|
||||||
|
cond.true771:
|
||||||
|
%call782 = call i8* @__memmove_chk(i8* %add.ptr768, i8* undef, i32 %call747, i32 undef)
|
||||||
|
br label %cond.end791
|
||||||
|
|
||||||
|
; CHECK: calll __memmove_chk
|
||||||
|
cond.false783:
|
||||||
|
%call.i1035 = call i8* @__memmove_chk(i8* %add.ptr768, i8* undef, i32 %call747, i32 undef) nounwind
|
||||||
|
br label %cond.end791
|
||||||
|
|
||||||
|
cond.end791:
|
||||||
|
%conv801 = trunc i32 %call747 to i8
|
||||||
|
%add.ptr822.sum = add i32 %call747, 3
|
||||||
|
%arrayidx833 = getelementptr inbounds [516 x i8]* null, i32 0, i32 %add.ptr822.sum
|
||||||
|
store i8 %conv801, i8* %arrayidx833, align 1
|
||||||
|
%cmp841 = icmp eq i8* undef, null
|
||||||
|
br i1 %cmp841, label %if.end849, label %if.then843
|
||||||
|
|
||||||
|
if.then843:
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
if.end849:
|
||||||
|
%call921 = call i32 undef(%t* %s, i8* undef, i8* undef, i32 %add763) nounwind
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i8* @__memmove_chk(i8*, i8*, i32, i32) nounwind
|
Loading…
Reference in New Issue
Block a user