[llvm] r177829 - Use direct types in Sparc def : Pat patterns.

Chris Lattner clattner at apple.com
Sat Mar 23 18:47:08 PDT 2013


Ok, makes sense.  After the targets are all updated, are you going to make tblgen reject reg classes here?

-Chris

On Mar 23, 2013, at 6:45 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk> wrote:

> 
> On Mar 23, 2013, at 6:36 PM, Chris Lattner <clattner at apple.com> wrote:
> 
>>> -def : Pat<(ctpop IntRegs:$src),
>>> -          (POPCrr (SLLri IntRegs:$src, 0))>;
>>> +def : Pat<(ctpop i32:$src),
>>> +          (POPCrr (SLLri i32:$src, 0))>;
> 
>> Does this patch make sense?  SLLri does require its input to be a
>> GPR, not just anything that is i32.
> 
> Right, but the register class in the pattern was never used to enforce that. It was only used to provide a type.
> 
> The register class constraint on SLLri operands comes from the ins and outs lists in the instruction definition:
> 
> multiclass F3_12<string OpcStr, bits<6> Op3Val, SDNode OpNode> {
>  def rr  : F3_1<2, Op3Val, 
>                 (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c),
>                 !strconcat(OpcStr, " $b, $c, $dst"),
>                 [(set i32:$dst, (OpNode i32:$b, i32:$c))]>;
>  def ri  : F3_2<2, Op3Val,
>                 (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c),
>                 !strconcat(OpcStr, " $b, $c, $dst"),
>                 [(set i32:$dst, (OpNode i32:$b, (i32 simm13:$c)))]>;
> }
> 
> Suppose there were an OtherIntRegs register class that could also hold an i32. If the pattern was given as:
> 
>  def : Pat<(ctpop OtherIntRegs:$src),
>            (POPCrr (SLLri OtherIntRegs:$src, 0))>;
> 
> We would still try to use an IntRegs register class, because that is what TLI.getClassFor(i32) returns.
> 
> I think it is misleading to provide register classes in patterns when they are simply ignored except for type information.
> 
> /jakob
> 



More information about the llvm-commits mailing list