[LLVMdev] Assert in live update from MI scheduler.
Andrew Trick
atrick at apple.com
Tue Jun 12 20:20:30 PDT 2012
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/LiveInter
> 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