[llvm-dev] GlobalISel round table follow-up: multi-stage legalization

Dominik Montada via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 7 05:07:06 PDT 2020


Hi all,

first of all thanks to Matt for hosting the round table yesterday and to 
everyone else for their time and the valuable discussions. As promised 
in the chat yesterday, here is the email regarding the legalizer / 
artifact combiner issue we talked about. I will send a separate email 
regarding the regbankselect discussion.

In case someone on the list didn't attend the round table yesterday, 
here is quick summary:

One problem that some of us are seeing in the legalizer is that 
sometimes instructions get expanded before they get folded away in the 
combiner. IIRC Matt sees this happening with division, while I am seeing 
something similar with unmerge.

To my particular problem: due to the nature of the architecture I'm 
working with, we have pretty strict legalization rules. One example is 
that we only allow unmerges from 64 to 32 bit. Unmerges of 32-bit or 
less get lowered to bit-arithmetic. However if we would do the same for 
anything bigger than 64-bit, the legalization of the resulting bit 
arithmetic would introduce illegal unmerges again, which then cause an 
endless loop in the legalizer.

So our rules are carefully designed to create exactly the unmerges we 
can handle and let everything else get handled by the artifact combiner.

The artifact combiner usually cannot get rid of the illegal unmerges on 
the first go and must do some intermediary combines first. Some of those 
try to create other illegal unmerges but ask the legalizer whether those 
are supported. If we only provide rules which work on the unmerges that 
we can handle, then this query would return false and the combine would 
not work. But we also cannot create a rule for those unmerges without 
causing endless loops through legalization.

The way we get around this problem is to add a custom rule, in which we 
simply return false (i.e. UnableToLegalize). This is enough for the 
combiner to produce the intermediary unmerge (because it is now support 
through the custom rule), while also getting around the problem of 
expanding something we don't want in the legalizer (because we say we 
didn't legalize anything). This is obviously a hack.

One of the ideas that was floated around yesterday sounded quite 
interesting to me: multi-stage legalization where you could specify 
which of your rules apply at which stage. I'm pretty sure this would 
solve our problem. In our case we would declare all artifacts as legal 
in the first stage to not hinder the combiner and in the second stage we 
could then focus on actually legalizing any left-over artifacts we have.

I do however see the problem that this could clutter up the existing 
legalization info. Due to the amount of instructions and rules, it 
already is quite complex and if rules could apply to different stages in 
the same file, it could make it quite difficult to understand what 
exactly is happening now.

I think Aditya pointed out that multi-stage legalization might be 
already possible by just having two legalizer passes with different 
legalization info and I feel like this might be the better approach of 
the two. I guess this would still require some tweeks as currently in 
llc we can only say `-stop-before/after=legalizer` but not which one of 
those.

Another thing I was thinking of when I implemented this hack for our 
use-case was that we need some kind of rule which tells the combiner 
that something is supported but is actually not doing any legalization 
in the legalizer (something like a `.combine()`, `.combineFor({s96})`).

Cheers,

Dominik

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 6822 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201007/a0f38a43/attachment.bin>


More information about the llvm-dev mailing list