[LLVMdev] Assert in live update from MI scheduler.
Sergei Larin
slarin at codeaurora.org
Wed Jun 13 07:15:26 PDT 2012
Andy,
Thanks for reply. I was able to trace the problem to the MI DAG dep
constructor. See this:
SU(0): %vreg1<def> = COPY %vreg10<kill>; IntRegs:%vreg1,%vreg10
# preds left : 0
# succs left : 0
# rdefs left : 1
Latency : 1
Depth : 0
Height : 0
SU(1): %vreg10<def> = LDriw %vreg9<kill>, 0; mem:LD4[%stack.0.in]
IntRegs:%vreg10,%vreg9
# preds left : 0
# succs left : 3
# rdefs left : 1
Latency : 1
Depth : 0
Height : 0
Successors:
val SU(3): Latency=1
val SU(2): Latency=1
antiSU(2): Latency=0
SU(2): %vreg9<def> = ADD_ri %vreg10, 8; IntRegs:%vreg9,%vreg10
# preds left : 2
# succs left : 0
# rdefs left : 1
Latency : 1
Depth : 0
Height : 0
Predecessors:
val SU(1): Latency=1 Reg=%vreg10
antiSU(1): Latency=0
The anti dep between SU(0) and SU(1) is missing, so when scheduler decides
to reorder them, LI rightfully complains.
Again, this is branch code, but if I can see something wrong in platform
independent portion, I'll track it on the trunk.
Thanks.
Sergei
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum.
> -----Original Message-----
> From: Andrew Trick [mailto:atrick at apple.com]
> Sent: Tuesday, June 12, 2012 10:21 PM
> To: Sergei Larin
> Cc: llvmdev at cs.uiuc.edu List; Lang Hames
> Subject: Re: [LLVMdev] Assert in live update from MI scheduler.
>
>
> On Jun 12, 2012, at 10:22 AM, Sergei Larin <slarin at codeaurora.org>
> wrote:
>
> >
> > Hello everyone,
> >
> > I am working on a release based on the branch 3.1 version of code.
> > Unfortunately it has enough differences that exact rev does not
> apply.
> > I am hitting an assert in liveness update with seemingly trivial code
> > (attached).
> >
> > /local/mnt/workspace/slarin/tools/llvm-mainline-
> merged/lib/CodeGen/Liv
> > eInter
> > valAnalysis.cpp:1078: void
> > llvm::LiveIntervals::HMEditor::moveAllRangesFrom(llvm::MachineInstr*,
> > llvm::SlotIndex): Assertion `validator.rangesOk() &&
> > "moveAllOperandsFrom broke liveness."' failed.
> >
> > The code being scheduled (function "push") is trivial:
> >
> > # Machine code for function push: Post SSA Function Live Outs: %R0
> >
> > 0B BB#0: derived from LLVM BB %entry
> > 16B %vreg9<def> = TFRI_V4 <ga:@xx_stack>; IntRegs:%vreg9
> > Successors according to CFG: BB#1
> >
> > 48B BB#1: derived from LLVM BB %for.cond
> > Predecessors according to CFG: BB#0 BB#1
> > 80B %vreg1<def> = COPY %vreg10<kill>; IntRegs:%vreg1,%vreg10
> > 96B %vreg10<def> = LDriw %vreg9<kill>, 0; mem:LD4[%stack.0.in]
> > IntRegs:%vreg10,%vreg9
> > 112B %vreg9<def> = ADD_ri %vreg10, 8; IntRegs:%vreg9,%vreg10
> > 128B %vreg6<def> = CMPEQri %vreg10, 0; PredRegs:%vreg6
> IntRegs:%vreg10
> > 176B JMP_cNot %vreg6<kill>, <BB#1>, %PC<imp-def>; PredRegs:%vreg6
> > 192B JMP <BB#2>
> > Successors according to CFG: BB#2 BB#1
> >
> > 208B BB#2: derived from LLVM BB %for.end
> > Predecessors according to CFG: BB#1
> > 224B %vreg7<def> = LDriw %vreg1<kill>, 0;
> mem:LD4[%first1](tbaa=!"any
> > pointer") IntRegs:%vreg7,%vreg1
> > 240B STriw_GP <ga:@yy_instr>, 0, %vreg7<kill>;
> > mem:ST4[@yy_instr](tbaa=!"any pointer") IntRegs:%vreg7
> > 256B JMPR %PC<imp-def>, %R31<imp-use>, %R0<imp-use,undef>
> >
> > Hexagon MI scheduler is working with BB1 and picks this load:
> >
> > %vreg10<def> = LDriw %vreg9<kill>, 0; mem:LD4[%stack.0.in]
> > IntRegs:%vreg10,%vreg9
> >
> > To be scheduled first (!). Right there after
> >
> > 7 clang 0x000000000226aece
> > llvm::LiveIntervals::handleMove(llvm::MachineInstr*) + 378
> > 8 clang 0x0000000001c2574f
> > llvm::VLIWMachineScheduler::listScheduleTopDown() + 595
> > 9 clang 0x0000000001c24cd5
> llvm::VLIWMachineScheduler::schedule()
> > + 505
> >
> > It does not seem to happen on the trunk.
> >
> > My question is - Does anyone recognizes the issue, and what patch(es)
> > do I need to address it. Since my release is based on 3.1, I have to
> > cherry pick them...
> > Any lead is highly appreciated.
> >
> > Thanks.
> >
> > Sergei
> >
>
> Quickly scanning the commit log, I only see this one since 3.1:
>
> commit f905f69668e5dd184c0a2b5fae38d9f3721c0d3b
> Author: Lang Hames <lhames at gmail.com>
> Date: Tue May 29 18:19:54 2012 +0000
>
> Clear the entering, exiting and internal ranges of a bundle before
> collecting
> ranges for the instruction about to be bundled. This fixes a bug in
> an external
> project where an assertion was triggered due to spurious 'multiple
> defs' within
> the bundle.
>
> Patch by Ivan Llopard. Thanks Ivan!
>
> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157632
>
> Maybe Lang can remember something relevant though.
>
> I still see a number of these asserts on trunk. I just haven't gotten
> around to making a push to fix them yet, because I've been focussing on
> other areas. However, if you reproduce your problem on trunk, file a
> bug right away. If you aren't able to work around this, I'll take some
> time to file bugs for asserts that I can reproduce in case they're
> related to your problem.
>
> -Andy
More information about the llvm-dev
mailing list