[LLVMdev] Assert in LiveInterval update
Sergei Larin
slarin at codeaurora.org
Tue Aug 28 08:18:03 PDT 2012
Andy,
I've described that issue (see below) when you were out of town... I think
I am getting more context on it. Please take a look...
So, in short, when the new MI scheduler performs move of an instruction, it
does something like this:
// Move the instruction to its new location in the instruction stream.
MachineInstr *MI = SU->getInstr();
if (IsTopNode) {
assert(SU->isTopReady() && "node still has unscheduled dependencies");
if (&*CurrentTop == MI) <<<<<<<<<<<<<<<<<< Here we make
sure that CurrentTop != MI.
CurrentTop = nextIfDebug(++CurrentTop, CurrentBottom);
else {
moveInstruction(MI, CurrentTop);
TopRPTracker.setPos(MI);
}
...
But in moveInstruction we use
// Update the instruction stream.
BB->splice(InsertPos, BB, MI);
And splice as far as I understand moves MI to the location right __before__
InsertPos. Our previous check made sure that InsertPos != MI,
But I do hit a case, when MI == InsertPos--, and effectively tries to swap
instruction with itself... which make live update mechanism very unhappy.
If I am missing something in intended logic, please explain, otherwise it
looks like we need to adjust that check to make sure we never even
considering this situation (swapping with self).
I also wonder if we want explicit check in live update with more meaningful
assert :)
Thanks.
Sergei
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum.
> -----Original Message-----
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu]
> On Behalf Of Sergei Larin
> Sent: Friday, August 17, 2012 3:32 PM
> To: 'Andrew Trick'; 'Jakob Olesen'
> Cc: 'LLVM Developers Mailing List'
> Subject: [LLVMdev] Assert in LiveInterval update
>
>
> Andy, Jacob,
>
> I have ported Hexagon MI scheduler to use the new scheduler
> infrastructure, but one of my tests triggers an assert in LiveInterval
> update. On the surface it does not make much sense to me, so I wonder
> if this is something you readily recognize, before I try to prop it
> open...
>
> The assert is:
>
> lib/CodeGen/LiveInterval.cpp:266: llvm::LiveRange*
> llvm::LiveInterval::addRangeFrom(llvm::LiveRange, llvm::LiveRange*):
> Assertion `B->end <= Start && "Cannot overlap two LiveRanges with
> differing ValID's" " (did you def the same reg twice in a
> MachineInstr?)"' failed.
>
> has this following call stack:
>
> #3 in llvm::LiveInterval::addRangeFrom (this=0x46e99a0, LR=...,
> From=0x46ee4b0) at lib/CodeGen/LiveInterval.cpp:266
> #4 in llvm::LiveInterval::addRange (this=0x46e99a0, LR=...) at
> include/llvm/CodeGen/LiveInterval.h:384
> #5 in llvm::LiveIntervals::HMEditor::moveInternalFrom
> (this=0x7fffffff8010, OldIdx=..., P=...) at
> lib/CodeGen/LiveIntervalAnalysis.cpp:1220
> #6 in llvm::LiveIntervals::HMEditor::moveAllInternalFrom
> (this=0x7fffffff8010, OldIdx=..., Internal=...) at
> lib/CodeGen/LiveIntervalAnalysis.cpp:1226
> #7 in llvm::LiveIntervals::HMEditor::moveAllRangesFrom
> (this=0x7fffffff8010, MI=0x462ab80, OldIdx=...) at
> lib/CodeGen/LiveIntervalAnalysis.cpp:938
> #8 in llvm::LiveIntervals::handleMove (this=0x448b6f0, MI=0x462ab80)
> at
> lib/CodeGen/LiveIntervalAnalysis.cpp:1388
> #9 in llvm::VLIWMachineScheduler::moveInstruction (this=0x46b0f50,
> MI=0x462ab80, InsertPos=...) at
> lib/Target/Hexagon/HexagonMachineScheduler.cpp:120
> #10 in llvm::VLIWMachineScheduler::schedule (this=0x46b0f50) at
> lib/Target/Hexagon/HexagonMachineScheduler.cpp:378
> #11 in (anonymous namespace)::MachineScheduler::runOnMachineFunction
> (this=0x448c730, mf=...) at lib/CodeGen/MachineScheduler.cpp:263
> #12 in llvm::MachineFunctionPass::runOnFunction (this=0x448c770, F=...)
> at
> lib/CodeGen/MachineFunctionPass.cpp:33
>
>
> For the purpose of this question, you can assume
> HexagonMachineScheduler.cpp == MachineScheduler.cpp and
> VLIWMachineScheduler == ScheduleDAGMI
>
>
> The instruction being moved is a simple call:
>
> let isCall = 1, neverHasSideEffects = 1,
> Defs = [D0, D1, D2, D3, D4, D5, D6, D7, R28, R31,
> P0, P1, P2, P3, LC0, LC1, SA0, SA1, USR] in {
> def CALLv3 : JInst<(outs), (ins calltarget:$dst),
> "call $dst", []>, Requires<[HasV3T]>; }
>
> CALLv3 <ga:@printf>, %D0<imp-def,dead>, %D1<imp-def,dead>, %D2<imp-
> def,dead>, %R31<imp-def>, %R0<imp-use,kill>, ...
>
> Another clue - slot renumbering just took place:
>
> *** Renumbered SlotIndexes 1056-2120 *** ...
>
> *** Renumbered SlotIndexes 1068-2140 ***
>
> ...and the first move after that produces the assert.
>
> (gdb) p Start.dump()
> 1080r
> (gdb) p B->end.dump()
> 1092r
> (gdb) p *LR.valno
> $7 = {id = 61, def = {lie = {Value = 74160402}}}
> (gdb) p *B->valno
> $9 = {id = 0, def = {lie = {Value = 73472560}}}
>
> I have not yet succeeded to reproduce it on anything other than my
> branch of Hexagon, but I can try...
> This is definitely some corner case, since it is a singular failure in
> a very large test suite. Really hope it rings a bell for you.
>
> Thanks.
>
> Sergei
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum.
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list