[LLVMdev] Type inference on registers with can contain multiple types

David Given dg at cowlark.com
Wed Mar 19 16:18:53 PDT 2014


My architecture has an FPU, but uses integer registers to store
floating-point values. So each register can store either an int or an
IEEE float. I define a register class like this:

def GR32 : RegisterClass<"MyArch", [i32, f32], 32,
	(sequence "R%u", 0, 32)>;

So far so good. However, when I write a rule to store a register:

def STORE32r : S32<
	(outs), (ins GR32:$rS, GR32:$rD),
	"st {$rS, ($rD)}",
	[(store GR32:$rS, (iPTR GR32:$rD))]>;

...then I get the dreaded 'cannot infer all types in pattern' error.
This is presumably because tablegen can't tell whether the input is an
i32 or a f32.

What's the best thing to do here? Explicitly annotating the input type
works, of course, but then I need two rules. Use a multipattern? Or is
there a way to tell tablegen that the input is allowed to be either?

-- 
┌─── dg@cowlark.com ───── http://www.cowlark.com ─────
│
│ "You cannot truly appreciate _Atlas Shrugged_ until you have read it
│ in the original Klingon." --- Sea Wasp on r.a.sf.w

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 876 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140319/8ec15dfa/attachment.sig>


More information about the llvm-dev mailing list