[LLVMdev] Multi-Instruction Patterns

Evan Cheng evan.cheng at apple.com
Wed Sep 24 00:10:42 PDT 2008


On Sep 23, 2008, at 7:17 PM, David Greene wrote:

> Chris Lattner wrote:
>> On Sep 23, 2008, at 11:26 AM, David Greene wrote:
>>
>>> Are there any examples of using tablegen to generate multiple  
>>> machine
>>> instructions from a single pattern?  Or do these cases always have
>>> to be
>>> manually expanded?
>>
>> PPC has a bunch of examples, for example:
>>
>> // Arbitrary immediate support.  Implement in terms of LIS/ORI.
>> def : Pat<(i32 imm:$imm),
>>           (ORI (LIS (HI16 imm:$imm)), (LO16 imm:$imm))>;
>
> Yep, I actually found some x86 ones buried in the .td files.  :)
>
> So now I have a couple of other questions.
>
> I wrote a pattern that looks something like the above in form, but how
> do I tell the selection DAG to prefer my pattern over another that
> already exists.  I can't easily just disable that other pattern  
> because
> it generates Machine Instruction opcode enums that are assumed to be
> available in other parts of the x86 codegen.

Try AddedComplexity = n to increase "goodness" of the pattern. It's a  
bit of a hack.

>
>
> So given two patterns that match the same thing, what's the  
> tiebreaker?
> I thought it was order in the .td file but that doesn't appear to be  
> the
> case.  I put my pattern first and it isn't selected.  I change the  
> other
> pattern slightly so it won't match anything and then my pattern gets
> used (so I know my pattern is valid).
>
> Also, I really wanted to express this pattern as transforming from one
> DAG to another, not down to machine instructions.  I saw this in
> x86InstSSE.td:
>
> // FIXME: may not be able to eliminate this movss with coalescing the
> src and
> // dest register classes are different. We really want to write this  
> pattern
> // like this:
> // def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (iPTR 0))),
> //           (f32 FR32:$src)>;
>
> (this is actually a very useful and important pattern, I wish it was
> available!)

Right. It would be nice to be able to eliminate the unnecessary  
movss.  It hasn't shown up on my radar so I haven't really thought out  
the right way to model this. I can see a couple of options:

1. Treat these instructions as cross register class copies. The src  
and dst classes are different (VR128 and FR32) but "compatible".
2. Model it as extract_subreg which coalescer can eliminate.

#2 is conceptually correct. The problem is 128 bit XMM0 is the same  
register as 32 bit (or 64 bit) XMM0. So it's not possible to define  
the super-register / sub-register relationship.

That leaves us with #1. I have added support to coalesce cross-class  
copies (see CrossClassJoin in SimpleRegisterCoalescing.cpp).  
Unfortunately, it breaks a few tests and I haven't had the time to  
look into them. If that's done, we just need to add the concept of  
"compatible register classes" and mark MOVPS2SSrr as a copy and *it  
should just work*.

Evan

>
>
> I had actually written my pattern in a similar style before I found
> this.  When I tried to build, tblgen complained about the pattern  
> being
> of an unknown type (didn't match Instruction or SDNodeXForm).
>
> I'm assuming there's some missing tblgen support here and that's why
> this pattern is commented out.  Is that right?  Are there plans to add
> tblgen support for these kinds of patterns?
>
>                                 -Dave
> _______________________________________________
> 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