[llvm-dev] [GlobalISel] What is the correct way to match truncating stores with TableGen?

Dominik Montada via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 27 02:08:38 PST 2019


Hey there,

I am working on a backend that only uses 32-bit registers, but also has 
instructions for storing/loading bytes and half-words. I am using 
GlobalISel for this backend.

As I only have 32-bit registers available, I tell the legalizer to clamp 
the value to be loaded/stored to s32. Now, when I write patterns in 
TableGen to emit code for truncating stores / extending loads I can use 
*extloadi8 and *extloadi16 for matching the extending loads. However, I 
am unable to use truncstorei8 and truncstorei16, as TableGen gives me 
the following error:

warning: Skipped pattern: Src pattern root isn't a trivial operator (Has 
a predicate (unindexedstore unindexed, truncstore truncstore, 
truncstorei8 MemVT=i8), first-failing:truncstorei8)

Is there any way to make GlobalISel work with truncstorei8 and 
truncstorei16?

If not, what are my other possibilities? I already tried to make store 
legal for s8 and s16 and inserting an explicit G_TRUNC, so I can use 
store (i8 (trunc ...)) in my TableGen pattern. This works partially as I 
am only able to match this pattern if I have this explicit G_TRUNC. But 
since I allow G_CONSTANT to be legal for s8 and s16 to get rid of some 
legalization artifacts, I can not match a simple store of an i16 
constant for example.

For this I also (mostly) found a workaround. I created the following 
pattern:

def : Pat<(store i8:$val, ...), (STB GPR:$val, ...)>;

This however causes TableGen to complain about a type contradiction as I 
have defined my GPR register class to only hold i32 (so for TableGen: i8 
!= i32, therefore type contradiction). It works if I add i16 and i8 to 
the value type list for the register class. However looking at other 
backends, I am not sure this would be the correct thing to do. I also 
have no idea what other effects such a change would cause.

What would be the correct way to solve this problem? Add the additional 
value types to my register class? Or will I have to use custom selection 
to make this work?

Thanks,

Dominik

-- 
----------------------------------------------------------------------
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: 3903 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191127/4d85d251/attachment.bin>


More information about the llvm-dev mailing list