[LLVMdev] Predication before CodeGen

Nikhil A. Patil patil.nikhil at gmail.com
Mon Oct 8 07:32:58 PDT 2007


On 08/10/2007, Evan Cheng <evan.cheng at apple.com> wrote:
>
> On Oct 7, 2007, at 12:51 AM, Nikhil A. Patil wrote:
>
> > Hi,
> >
> > I am  planning to generate code for a peculiar architecture with
> > _no_ branch instructions (!), but with predicated loads and stores
> > to memory. This means the architecture is not Turing complete, is
> > going to waste a lot of computation, and any input program that can
> > hope to get compiled for this architecture must have loops that can
> > be fully unrolled, and all its functions must get fully inlined.
> >
> > Since I have no branches, I think I will need to predicate code
> > before DAG Selection. I was thinking of doing this:
> > 1) Run an analysis on the LLVM bitcode that calculates the
> > condition under which an instruction will be "reached" -- this is
> > straightforward since my input program is not allowed to have
> > cycles in the CFG.
> > 2) Run a pass that requires the above analysis and uses it to:
> >    - merge all basic blocks in topological sort order (which
> > exists, because CFG is acyclic).
> >    - insert appropriate instructions to generate the predicates.
> >    - change all PHI-nodes into Select nodes.
> >    - predicate memory operations (well, at least the stores).
>
> I am not aware of a mechanism to completely remove branches for any
> general program. Don't you have to restrict it a loop with known
> iteration count?

Yes, I am going to have to live with that restriction. I also need to
assume no recursive functions, so all calls can be fully inlined.

>
> >
> > It is this final predication step that I am not sure how to handle.
> > Since LLVM does not have predicated load/store instructions, will I
> > have to upgrade the memory operations to a call or something that
> > would then have to be custom handled by the SelectionDAG mechanism?
>
> Target specific instructions can have predicate operands. See ARM.
> I've implemented a if-converter but it runs after register allocation
> so it won't fit your needs.
>
> Ideally (because that's what everyone does) you want a pass that
> operate on 3-address machine specific instructions. Then you can
> predicate code and merge blocks together before you do scheduling.
> The complication our codegen scheme is we do instruction scheduling
> on DAGs and only translate into 3-address code at the end of scheduling.
>
> Sometime down the road we will be implementing whole function
> instruction scheduling. Once that's done, you can perhaps do a
> predication pass that operate on the DAG that represent the whole
> function. But that's not going to help you right now. So for now,
> your choice is either 1) Operate on DAGs that represent basic blocks,
> predicate nodes and merge multiple DAGs  into a larger DAG. 2)
> Operate on the machine instructions and machine basic blocks after
> instruction scheduling and redo scheduling afterwards.

Thanks, that solves my confusion. Actually I did think of this earlier
but rejected the idea since this will mean that the Legalize phase is
going to generate "illegal" output -- it will still have branches in
it. I guess that can't be avoided anyway, because all input programs
aren't even legal :)

Also, is there a straightforward way to directly go from LLVM bitcode
to some generic form of machine instructions -- something like
lib/Target/Generic? The docs mention an "old-style 'simple'
instruction selector, which effectively peephole selects each LLVM
instruction into a series of machine instructions."  Is this still
available?

Thanks,
nikhil

>
> Evan
>
> >
> > Or should I just leave the load/stores alone, and somehow, later
> > after the machine instructions are created predicate them using
> > this predicate information? If so, how do I ensure that the
> > dependency on the predicate generating instructions is preserved
> > (the predicate instructions are not dce'd away)?
> >
> > Or should I be trying to do the predication right before Legalize?
> > If so, I'll need to think about it a little more.
> >
> > Thank you for your time :)
> > nikhil
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> _______________________________________________
> 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