[LLVMdev] Using frameindex in a pattern

Evan Cheng evan.cheng at apple.com
Mon Dec 3 16:21:05 PST 2007


On Dec 3, 2007, at 12:53 PM, Vladimir Prus wrote:

>
> Suppose I have a target that does not have register+constant
> addressing mode. Then, I have DAG like:
>
> 	(store ..., (frameindex))
>
> Targets like SPARC have the following patterns to catch this:
>
> 	def ADDRri : ComplexPattern<i32, 2,
> 		"SelectADDRri", [frameindex], []>;
> 	def STri  : F3_2<3, 0b000100,
>                 (outs), (ins MEMri:$addr, IntRegs:$src),
>                 "st $src, [$addr]",
>                 [(store IntRegs:$src, ADDRri:$addr)]>;
>
> Where ADDRri will eventually turn into register+constant
> addressing in assembler.
>
> The IA64 target has explicit case in it's Select method
> to handle frameindex -- which is fine, but I though I'd
> try a fully declarative method, so I've added to sparc
> the following:
>
>   def : Pat<(frameindex simm13:$val), (add G0, simm13:$val)>;
>
> (Ignore bogus G0, and '13' -- just for testing). The error
> I get this:
>
>   /home/ghost/Build/llvm/Release/bin/tblgen:
>   In anonymous.24: frameindex node requires exactly 0 operands!
>
>
> Is this really as designed, or nobody got around to making frameindex
> have an true operand? Any way to achive frameindex->add translation
> using a pattern and not C++ code at all?

This is as designed. frameindex node is considered a leaf node. The  
lowering of frameindex into machine instructions is handled late for  
many (good) reasons, e.g. allowing coloring of frame slots.

Evan

>
>
> - Volodya
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list