On Thu, Aug 13, 2015 at 1:32 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote:
> Hi Richard,
>
> Did you have a chance to look at updated patch?

Having a quick look now.  Btw, you didn't try the simpler alternative of

 tree type = type_for_mode (int_mode_for_mode (TYPE_MODE (vectype)));
 build2 (EQ_EXPR, boolean_type_node,
   build1 (VIEW_CONVERT, type, op0), build1 (VIEW_CONVERT, type, op1));

?  That is, use the GIMPLE level equivalent of

 (cmp (subreg:TI reg:V4SI) (subreg:TI reg:V4SI))

?  That should be supported by the expander already, though again not sure if
the target(s) have compares that match this.

Btw, the tree-cfg.c hook wasn't what was agreed on - the restriction
on EQ/NE_EXPR
is missing.  Operand type equality is tested anyway.

Why do you need to restrict forward_propagate_into_comparison_1?

Otherwise this looks better, but can you try with the VIEW_CONVERT as well?

Thanks,
Richard.


> Thanks.
> Yuri.
>
> 2015-08-06 14:07 GMT+03:00 Yuri Rumyantsev <ysrum...@gmail.com>:
>> HI All,
>>
>> Here is updated patch which implements Richard proposal to use vector
>> comparison with boolean result instead of target hook. Support for it
>> was added to ix86_expand_branch.
>>
>> Any comments will be appreciated.
>>
>> Bootstrap and regression testing did not show any new failures.
>>
>> ChangeLog:
>> 2015-08-06  Yuri Rumyantsev  <ysrum...@gmail.com>
>>
>> * config/i386/i386.c (ix86_expand_branch): Implement vector
>> comparison with boolean result.
>> * config/i386/sse.md (define_expand "cbranch<mode>4): Add define
>> for vector comparion.
>> * fold-const.c (fold_relational_const): Add handling of vector
>> comparison with boolean result.
>> * params.def (PARAM_ZERO_TEST_FOR_STORE_MASK): New DEFPARAM.
>> * params.h (ENABLE_ZERO_TEST_FOR_STORE_MASK): new macros.
>> * tree-cfg.c (verify_gimple_comparison): Add test for vector
>> comparion with boolean result.
>> * tree-ssa-forwprop.c (forward_propagate_into_comparison_1): Do not
>> propagate vector comparion with boolean result.
>> * tree-vect-stmts.c (vectorizable_mask_load_store): Initialize
>> has_mask_store field of vect_info.
>> * tree-vectorizer.c: Include files ssa.h, cfghooks.h and params.h.
>> (is_valid_sink): New function.
>> (optimize_mask_stores): New function.
>> (vectorize_loops): Invoke optimaze_mask_stores for loops having masked
>> stores.
>> * tree-vectorizer.h (loop_vec_info): Add new has_mask_store field and
>> correspondent macros.
>>
>> gcc/testsuite/ChangeLog:
>> * gcc.target/i386/avx2-vect-mask-store-move1.c: New test.
>>
>>
>> 2015-07-27 11:48 GMT+03:00 Richard Biener <richard.guent...@gmail.com>:
>>> On Fri, Jul 24, 2015 at 9:11 PM, Jeff Law <l...@redhat.com> wrote:
>>>> On 07/24/2015 03:16 AM, Richard Biener wrote:
>>>>>>
>>>>>> Is there any rationale given anywhere for the transformation into
>>>>>> conditional expressions?  ie, is there any reason why we can't have a
>>>>>> GIMPLE_COND where the expression is a vector condition?
>>>>>
>>>>>
>>>>> No rationale for equality compare which would have the semantic of
>>>>> having all elements equal or not equal.  But you can't define a sensible
>>>>> ordering (that HW implements) for other compare operators and you
>>>>> obviously need a single boolean result, not a vector of element comparison
>>>>> results.
>>>>
>>>> Right.  EQ/NE only as others just don't have any real meaning.
>>>>
>>>>
>>>>> I've already replied that I'm fine allowing ==/!= whole-vector compares.
>>>>> But one needs to check whether expansion does anything sensible
>>>>> with them (either expand to integer subreg compares or add optabs
>>>>> for the compares).
>>>>
>>>> Agreed, EQ/NE for whole vector compares only would be fine for me too under
>>>> the same conditions.
>>>
>>> Btw, you can already do this on GIMPLE by doing
>>>
>>>   TImode vec_as_int = VIEW_CONVERT_EXPR <TImode> (vec_2);
>>>   if (vec_as_int == 0)
>>> ...
>>>
>>> which is what the RTL will look like in the end.  So not sure if making this
>>> higher-level in GIMPLE is good or required.
>>>
>>> Richard.
>>>
>>>> jeff

Reply via email to