On Wed, Jun 24, 2015 at 2:28 PM, Richard Sandiford
<richard.sandif...@arm.com> wrote:
> Richard Biener <richard.guent...@gmail.com> writes:
>> On Wed, Jun 24, 2015 at 1:10 PM, Richard Sandiford
>> <richard.sandif...@arm.com> wrote:
>>> Richard Biener <richard.guent...@gmail.com> writes:
>>>>>> I'm fine with using tree_nop_conversion_p for now.
>>>>>
>>>>> I like the suggestion about checking TYPE_VECTOR_SUBPARTS and the element
>>>>> mode.  How about:
>>>>>
>>>>>  (if (VECTOR_INTEGER_TYPE_P (type)
>>>>>       && TYPE_VECTOR_SUBPARTS (type) == TYPE_VECTOR_SUBPARTS (TREE_TYPE 
>>>>> (@0))
>>>>>       && (TYPE_MODE (TREE_TYPE (type))
>>>>>           == TYPE_MODE (TREE_TYPE (TREE_TYPE (@0)))))
>>>>>
>>>>> (But is it really OK to be adding more mode-based compatibility checks?
>>>>> I thought you were hoping to move away from modes in the middle end.)
>>>>
>>>> The TYPE_MODE check makes the VECTOR_INTEGER_TYPE_P check redundant
>>>> (the type of a comparison is always a signed vector integer type).
>>>
>>> OK, will just use VECTOR_TYPE_P then.
>>
>> Given we're in a VEC_COND_EXPR that's redundant as well.
>
> Hmm, but is it really guaranteed in:
>
>  (plus:c @3 (view_convert (vec_cond @0 integer_each_onep@1 integer_zerop@2)))
>
> that the @3 and the view_convert are also vectors?  I thought we allowed
> view_converts from vector to non-vector types.

Hmm, true.

>>>>>>>> +/* We could instead convert all instances of the vec_cond to negate,
>>>>>>>> +   but that isn't necessarily a win on its own.  */
>>>>>>
>>>>>> so p ? 1 : 0 -> -p?  Why isn't that a win on its own?  It looks
>>>>>> more compact
>>>>>> at least ;)  It would also simplify the patterns below.
>>>>>
>>>>> In the past I've dealt with processors where arithmetic wasn't handled
>>>>> as efficiently as logical ops.  Seems like an especial risk for 64-bit
>>>>> elements, from a quick scan of the i386 scheduling models.
>>>>
>>>> But then expansion could undo this ...
>>>
>>> So do the inverse fold and convert (neg (cond)) to (vec_cond cond 1 0)?
>>> Is there precendent for doing that kind of thing?
>>
>> Expanding it as this, yes.  Whether there is precedence no idea, but
>> surely the expand_unop path could, if there is no optab for neg:vector_mode,
>> try expanding as vec_cond .. 1 0.
>
> Yeah, that part isn't the problem.  It's when there is an implementation
> of (neg ...) (which I'd hope all real integer vector architectures would
> support) but it's not as efficient as the (and ...) that most targets
> would use for a (vec_cond ... 0).

I would suppose that a single-operand op (neg) is always bettter than a
two-operand (and) one.  But you of course never know...

>> There is precedence for different
>> expansion paths dependent on optabs (or even rtx cost?).  Of course
>> expand_unop doesn't get the original tree ops (expand_expr.c does,
>> where some special-casing using get_gimple_for_expr is).  Not sure
>> if expand_unop would get 'cond' in a form where it can recognize
>> the result is either -1 or 0.
>
> It just seems inconsistent to have the optabs machinery try to detect
> this ad-hoc combination opportunity while still leaving the vcond optab
> to handle more arbitrary cases, like (vec_cond (eq x y) 0xbeef 0).
> The vcond optabs would still have the logic needed to produce the
> right code, but we'd be circumventing it and trying to reimplement
> one particular case in a different way.

That's true.  One could also leave it to combine / simplify_rtx and
thus rtx_cost.  But that's true of all of the match.pd stuff you add, no?

Richard.

> Thanks,
> Richard
>

Reply via email to