[LLVMdev] Instruction pattern type inference problem

Christopher Lamb christopher.lamb at gmail.com
Mon Apr 23 15:53:18 PDT 2007


On Apr 23, 2007, at 5:08 PM, Chris Lattner wrote:

> On Sun, 22 Apr 2007, Christopher Lamb wrote:
>> 1. Is there a good reason that v2f32 types are excluded from the
>> isFloatingPoint filter? Looks like a bug to me.
>>
>>     v2f32          =  22,   //  2 x f32
>>     v4f32          =  23,   //  4 x f32 <== start ??
>>     v2f64          =  24,   //  2 x f64 <== end
>>
>>   static inline bool isFloatingPoint(ValueType VT) {
>>     return (VT >= f32 && VT <= f128) || (VT >= v4f32 && VT <= v2f64);
>>   }
>
> Definitely a bug.  I don't think any existing targets support v2f32  
> which
> is probably why it wasn't noticed.

Fix is in.

>> 2. My problem seems to stem from what appears to be under-constrained
>> typing of patterns. With vectors there is a challenge because
>> currently there is no type constraint available to indicate that an
>> operand can/cannot be a vector type, or a constraint that operands
>> must have the same number of elements (either both scalers or vectors
>> with the same number of elements, but not necessarily the same
>> element type or element size).
>>
>> Even with these constraints, it would be difficult to apply them to
>> the standard nodes in a general way, though I could be wrong. Should
>> standard nodes have vector aware type constraints?
>
> It depends on which nodes you mean.  "and" for example, can apply  
> to any
> integer type, including vectors.  The various compares can only  
> apply to
> scalars, as it would be otherwise ambiguous how the comparison is done
> (i.e. is it true if all element satisfy  the predicate, or if any of
> them?)

> Do you have a specific example in mind?

A strategy that we have had luck with in the past is the concept of a  
"vector boolean" type, which is the result of a comparison between  
two vectors. It's then necessary to perform a reduction (and, or) on  
the elements in order to produce a scalar boolean value that's  
suitable for a branch. This also allows stuff like letting 'select'  
accept a vector boolean predicate and vector values to perform a  
vector select.

In these cases you'd want to enforce the kinds of operand type  
constraints as mentioned above to ensure that the types are all  
acceptable.

--
Christopher Lamb



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070423/f13e0f69/attachment.html>


More information about the llvm-dev mailing list