[LLVMdev] Instruction bundles before RA: Rematerialization

Ivan Llopard ivanllopard at gmail.com
Thu Jun 7 01:25:47 PDT 2012


Hi Jakob,

2012/6/6 Jakob Stoklund Olesen <stoklund at 2pi.dk <mailto:stoklund at 2pi.dk>>


    On Jun 6, 2012, at 2:53 AM, Ivan Llopard <ivanllopard at gmail.com
    <mailto:ivanllopard at gmail.com>> wrote:

     > We have a new BE for a VLIW-like processor and I'm currently
    working on
     > instruction bundles. Ideally, I'd like to have bundles *before* RA to
     > model certain constraints, e.g. the exposed one by Tzu-Chien a
    while ago
     > in his thread
     > http://lists.cs.uiuc.edu/pipermail/llvmdev/2005-September/004798.html

    The bundle support in the tree should handle constraints like that.
    The register allocator basically sees bundles as single instructions
    when computing interference.

     > In order to build bundles, we have added a new bottom-up MIScheduler,
     > right after reg coalescing, which behaves much like
    ScheduleDAGVLIW but
     > without hazard recognizing. Due to some tricky instructions, we
    cannot
     > schedule on the DAG. Bundles are built at exitRegion() in the
    scheduling
     > process and the live interval information is updated correctly. After
     > this, the RA is aware of bundles, at least from a LiveInterval
    point of
     > view, and I had some problems regarding the rematerialization.
     >
     > AFAIK, the RA cannot remat if the target instruction is not the
    bundle's
     > header.
     > For this, I rather need a light bundle representation, or no
    bundle at
     > all, so it can remat the right instruction with one condition: the
     > remated location should preserve bundles. Nevertheless, for many
    other
     > actions like LI splitting, the current representation works very
    well.
     >
     > In general, I want the RA to preserve bundles as well as to be
    able to
     > model the constraint presented above in the thread.
     > Should I fix the rematerialization code to look for the right
     > instruction into the current bundle ?
     > What's the direction you are following about instruction bundling ?

    Remat is a problem because it breaks the abstraction of treating
    whole bundles as instructions. There are two issues:

    - Should we rematerialize the full bundle defining a value, or
    should we try to dig out the 'real' def inside the bundle?


The second option is the preferred one for us. The remated instruction 
should create a new bundle which may be merged with other bundles later 
by custom passes. The same condition applies for copy insertions.


    - After remat, we run dead code elimination in case the original def
    has no more uses. Again, should DCE erase a single instruction from
    inside a bundle, or should we erase the full bundle once all its
    defs are dead?


In our particular case, the RA can freely remove instructions from a 
bundle without any special constraint. We don't need to wait till all 
defs inside a bundle are dead, which in some situations it may never happen.


    Ideally, I would like to treat the inside of a bundle like a black
    box that only the target understands. I am not too happy about
    erasing instructions inside bundles without some help from the target.

    How do you need remat to work?


As described above.

I understand your concern, other architectures may have stronger 
constraints or use bundles for other purposes (ARM?) which makes the 
task non-trivial.
We have a very particular VLIW architecture with complex operators but 
fewer constraints regarding the packet building and mangling. We need 
remat to work because spill is forbidden for a certain reg class.

Do you plan to add more hooks in TargetLowering to remat?


    /jakob



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120607/a2af9f19/attachment.html>


More information about the llvm-dev mailing list