[LLVMdev] TableGen and computed expressions

Marcello Maggioni marcello at codeplay.com
Sun Sep 29 02:58:36 PDT 2013

 From what I understand you want to be able to define values in TableGen 
as "function calls" to a specific evaluator that returns a value 
depending on the architecture subtarget you are compiling for.

As far as I know this is not possible, because TableGen is like a table 
of values that have to be known at compile time (compile time of the 
compiler I mean) so that can they can be stored where they are needed 
(like instruction binary encoding, operand types and numbers , implicit 
defs ... etc). The solution Elior proposed gives you more flexibility, 
but it is still a compile time flexibility.

There are certain specific places where in TableGen is possible to 
inject dynamic behavior , like with predicates for instruction selection 
patterns or ParseMethods/DecodeMethods (where basically the value stored 
is the string containing the method to call when it is needed to 
decode/parse a certain operand) ... etc, but these values have very 
specialized purposes in llvm tablegen autogenerated code (instruction 
selection patterns for ISel, Parse method for tablegen generated 
MCParser code, DecodeMethods for MCDisassembler), for any other kind of 
values this is not how it works, but the values are stored statically.


Il 27/09/2013 13:49, Martin O'Riordan ha scritto:
> Thanks Elior,
> Sorry for the delay - emergencies never seem to go away in compiler
> development ;-)
> That sounds like an interesting approach, a kind-of pre-processor for TD
> files.  But will this still not result in a constant, although externally
> provided, or have I misunderstood?
> What I would like to do is compute a different value depending on which
> '-target-cpu <cpu>' option was selected for 'clang'.  The "[{...}]" syntax
> should work for this, but I haven't been able to convince TableGen to do
> what I want - it maybe a problem with the context I have:
> 	let attrList = [Attr<2, id1>, Attr<2, id2>] in { ... }
> I want to be able to replace the value '2' with the value returned from a
> function-call.
> I managed to get the opcode name issue resolved in a neat way using
> 'multiclass' and 'defm' controlled by a predicate, and this worked pretty
> well requiring a minimum amount of re-writing and giving me a good
> opportunity to cleanup the code, but the list construction outlined above
> doesn't seem to be as straight-forward.
> All the best,
> 	MartinO
> PS:	My next bit of fun will be moving to v3.3 before v3.4 is shipped :-)
> -----Original Message-----
> From: Malul, Elior [mailto:elior.malul at intel.com]
> Sent: 22 September 2013 08:06
> To: Martin.ORiordan at movidius.com; llvmdev at cs.uiuc.edu
> Subject: RE: [LLVMdev] TableGen and computed expressions
> Martin hi.
> I encountered a similar problem, and made a solution for it.
> The solution is a tblgen enhancement, and enables tblgen code expressions to
> be dynamically evaluated.
> It works as follows:
> 1. Code expressions have 'special runtime evaluation' expression (very
> similar to strings in ruby), e.g.:
>   code c =   {[ My name is #{injected}. }.
> 2. I have added another command line switch for tablegen, named
> '--inject-value', that assigns values to records upon activation, so you
> could use it like so:
> tblgen --inject-value=injected->Spartacus <other switches and input files>.
> As a consequence, the record 'c' of 1. Will have the value:
> 'My name is Spartacus'.
> If you find this feature helpful, I am willing to send you a patch and a
> small 'how to' over.
> Yours, Elior.
> -----Original Message-----
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
> Behalf Of Martin O'Riordan
> Sent: Monday, September 09, 2013 17:21
> To: llvmdev at cs.uiuc.edu
> Subject: [LLVMdev] TableGen and computed expressions
> Hi LLVMDev,
> I am revising an existing LLVM backend for a new variant of our CPU
> architecture.  I have looked at other targets, and the approach used by
> Hexagon seems to suit most of my needs quite well, so I am using Predicates
> to enable/disable instructions for the architectures.  This works very well
> for disabling old instructions, and enabling new instructions.
> For the remaining instructions there are many which have to be revised, and
> these fall into three principal groups:
> 1.  Those that are very different
>      I treat these as if they were an old instruction to be retired
>      and a new instruction to be introduced.
> 2.  Those whose latencies have changed
> 3.  Those whose mnemonics have changed
> For the latter two, I was wondering if there is some way of providing a
> computed value instead of a constant?
> For example, with the latency issues, the old instruction might have a
> latency of 2 - expressed as the constant '2' - while the value for the
> revised instruction is '3'.  I would like to be able to provide this value
> using a function call ( e.g. 'getLatency()'), or some other externally
> computed value.
> For the mnemonics I was wondering if it is possible to provide a fragment to
> 'strconcat' from a function call, or perhaps from an array with an index
> (e.g. 'AsmFrag[VALUE]')?
> I have tried variants of '[{ code }]' but this does not seem to work for me.
> I would like to avoid a wholesale replication of 100s of instruction
> patterns that really only differ in minute ways; are there any recommended
> ways of doing this type of thing with TableGen?
> Thanks,
>      Martin O'Riordan - Movidius Ltd.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
> This e-mail and any attachments may contain confidential material for the
> sole use of the intended recipient(s). Any review or distribution by others
> is strictly prohibited. If you are not the intended recipient, please
> contact the sender and delete all copies.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

Marcello Maggioni

Compiler Engineer


Codeplay Software Ltd

45 York Place, Edinburgh, EH1 3HP

Tel: 0131 466 0503

Fax: 0131 557 6600




This email and any attachments may contain confidential and /or privileged information and  is for use  by the addressee only. If you are not the intended recipient, please notify Codeplay Software Ltd immediately and delete the message from your computer. You may not copy or forward it,or use or disclose its contents to any other person. Any views or other information in this message which do not relate to our business are not authorized by Codeplay software Ltd, nor does this message form part of any contract unless so stated.

As internet communications are capable of data corruption Codeplay Software Ltd does not accept any responsibility for any changes made to this message after it was sent. Please note that Codeplay Software Ltd does not accept any liability or responsibility for viruses and it is your responsibility to scan any attachments.

Company registered in England and Wales, number: 04567874

Registered office: 81 Linkfield Street, Redhill RH1 6BY

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

More information about the llvm-dev mailing list