[llvm-dev] TableGen and register banks
Dominik Montada via llvm-dev
llvm-dev at lists.llvm.org
Mon Jan 11 03:35:58 PST 2021
Hi Paul,
it's great to see you tackle all of these things. Although I cannot tell
you where to start, I might be able to give at least some info on your
other questions. I think Gabriel already explained the idea behind
register banks in a previous email. The pass where these register banks
are assigned is the RegisterBankSelect pass. It calls into the target
specific RegisterBankInfos to assign register banks to generic
instructions. This is also where those .def files are being used.
As far as I understand, the actual data structures are just used as a
complex lookup table so you don't have to compute the mapping by hand
for each and every instruction. I also noticed that AArch64 and AMDGPU
have quite differing implementations there and from previous GISel round
tables during the dev conference, I remember that AMDGPU seems to do
even more work than simply assigning mappings. You should probably get
in touch with Matt or someone else from the AMD backend to get some
details there. But all in all, I don't see why those lookup tables could
not be tablegen'd.
The register classes and register banks are already available in
TableGen. So the only missing piece should be which operands of a
generic instruction should be put on which bank. You could try to infer
that information from ISel patterns as there you have a mapping from the
generic instructions to target specific instructions including register
classes (from which you can get the register banks). Although this could
get quite complex once you start hitting some of the more complicated
patterns I guess. Also this would miss instructions that are not
selected with TableGen patterns, but only with C++. Also this would not
capture any associated costs, unless the cost for the mapping would also
be inferred by TableGen by how complex the pattern was the mapping was
derived from.
I don't think it's impossible or even unfeasible to try to derive as
much as possible from already existing ISel patterns. But what I could
also envision is to have some description in TableGen that defines the
operand mappings for generic instructions and some associated cost. It
should support declaring multiple mappings for the same instruction,
since you might be able to implement the instruction on multiple
register banks. Our downstream target has a lot of those cases already
and at the moment we have to manually add all of those mappings in C++.
It would be nice if we could simply include some .inc file for this instead.
I haven't thought about how this could look like in TableGen before I
started typing this email, so I don't have any concrete suggestions at
this point.
I hope I was able to shed a little bit of light on these things. Like I
said, I'm just a mere user of GlobalISel myself, so these are just my
own experiences I gathered up to this point. I'm sure one of the actual
GISel developers could give you much more info on this should you need it.
Cheers,
Dominik
Am 30.12.20 um 20:26 schrieb Paul C. Anagnostopoulos via llvm-dev:
> I'm beginning to investigate register banks and how a TableGen backend might generate more of the data structures describing them. This is a bit tricky since I am not yet familiar enough with the code generator to understand all the ramifications.
>
> I'm hoping someone can suggest where to start. That is, which data structures would be the simplest to generate. In particular, is there sufficient information in the register info, instruction info, and instruction selection TableGen files to gather the information needed, or is additional information required in xxxRegisterBanks.td file?
>
> Three targets have xxxGenRegisterBankInfo.def files, which contain data structures tagged for generation by TableGen. Three other targets have similar data structures in C++ files. But looking at the AArch64 and AMDGPU files, for example, I see quite a variation in the organization of those data structures.really
>
> I think perhaps a need a mentor for this little project.
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
----------------------------------------------------------------------
Dominik Montada Email: dominik.montada at hightec-rt.com
HighTec EDV-Systeme GmbH Phone: +49 681 92613 19
Europaallee 19 Fax: +49-681-92613-26
D-66113 Saarbrücken WWW: http://www.hightec-rt.com
Managing Director: Vera Strothmann
Register Court: Saarbrücken, HRB 10445, VAT ID: DE 138344222
This e-mail may contain confidential and/or privileged information. If
you are not the intended recipient please notify the sender immediately
and destroy this e-mail. Any unauthorised copying, disclosure or
distribution of the material in this e-mail is strictly forbidden.
---
-------------- 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/20210111/90e4ab7d/attachment.bin>
More information about the llvm-dev
mailing list