[LLVMdev] TableGen and computed expressions

Malul, Elior elior.malul at intel.com
Sun Sep 22 00:06:06 PDT 2013

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


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?


    Martin O'Riordan - Movidius Ltd.

LLVM Developers mailing list
LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
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.

More information about the llvm-dev mailing list