[llvm-dev] virtual subregister liveness?

Jesper Antonsson via llvm-dev llvm-dev at lists.llvm.org
Mon Sep 2 00:58:39 PDT 2019


On Fri, 2019-08-30 at 10:03 -0700, Quentin Colombet wrote:
> > On Aug 30, 2019, at 8:31 AM, Jesper Antonsson via llvm-dev <
> > llvm-dev at lists.llvm.org> wrote:
> > 
> > Hi,
> > 
> > After dead-mi-elimination I'm experiencing a machine verifier
> > failure 
> > at this virtual subregister write:
> > 
> >  %5.sub1 = COPY undef %11
> > 
> > The machine verifier essentially complains that the rest of the
> > register is undefined (a subregister write implies a "read" of the
> > other parts).
> > 
> > So the problem is that dead-mi-elimination has removed the
> > previously
> > existing defines of %5.sub0. Yet I'm unsure where the actual fault
> > lies
> > and I can't seem to find any documentation or list email that
> > explains
> > the modeling in detail. A few ideas:
> 
> If %5 is used in full, %5.sub0 is supposed to be defined before that
> use.
> If %5.sub0 was defined with an implicit_def that means, IIRC, that we
> just miss an undef flag on %5.sub1 (undef in that case means that we
> don’t care about the contain of the other lane.)
> 
> Could you provide the MIR before and after dead-mi-elimination? Just
> the part where %5 is involved should suffice.

Thanks. So this is what it looks like before register coalescing (bb.3
dominates bb.1):

  bb.1:
    ...
    %22:an32_0_7 = COPY killed %5.hiPair_then_loAcc
    ...

  bb.3:
    ...
    %5:an32quads = COPY killed %13
    %5.hiPair_then_hiAcc:an32quads = COPY undef %11
    ...


After register coalescing and until dead-mi-elimination, it looks like
this:

  bb.0:
    ...
    undef %5.hiPair_then_loAcc:an32quads = COPY %12
    ...

  bb.1:
    ...
    %5.hiPair_then_loAcc:an32quads = or_a40_a40_a40_aN32
%5.hiPair_then_loAcc, %21, 0, $noreg, 0, implicit-def dead $ccreg
    ...

  bb.3:
    ...
    %5.hiPair_then_hiAcc:an32quads = COPY undef %11
    ...


Then after dead-mi-elimination, all that remains is:

  bb.3:
    ...
    %5.hiPair_then_hiAcc:an32quads = COPY undef %11
    ...

This is what's directly involving %5, so I hope it is the right amount
of info. I included MIR from before simple-register-coalescing because
one possibility is that there is something fishy happening in there.
The code is originally csmith-generated, btw. Thanks again.


> > 
> > Are there some restrictions on where dead-mi-elimination can be
> > run?
> > (I'm working with an out-of-tree target and we've put this failing
> > dead-mi-elimination pass pretty soon after register coalescing.)
> > 
> > Or is the use-list for %5 in MRI incorrectly constructed as it
> > doesn't
> > contain the remaining instruction? (These use-lists are what dead-
> > mi-
> > elimination is using to decide if an instruction is dead or not.)
> > 
> > Or is the fault that there is no MO spelling out an implicit use
> > %5.sub0?
> > 
> > 
> > The actual verifier error is:
> > 
> > *** Bad machine code: Virtual register defs don't dominate all
> > uses.
> > ***
> > - function:    f
> > - v. register: %5
> > LLVM ERROR: Found 1 machine code errors.
> > 
> > 
> > Thanks,
> > Jesper
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org
> > 
> 


More information about the llvm-dev mailing list