Changes for if-convert to recognize simple conditional reduction.
Richard Biener
richard.guenther@gmail.com
Tue Apr 29 09:16:00 GMT 2014
On Mon, Apr 28, 2014 at 10:05 PM, Richard Henderson <rth@redhat.com> wrote:
> On 04/17/2014 06:09 AM, Yuri Rumyantsev wrote:
>> + /* Build cond expression using COND and constant operand
>> + of reduction rhs. */
>> + c = fold_build_cond_expr (TREE_TYPE (rhs1),
>> + unshare_expr (cond),
>> + swap? zero: op1,
>> + swap? op1: zero);
>
> Do we recognize somewhere the canonical value for the comparison is -1, and
> simplify this further?
>
> E.g.
>
> if (A[i] != 0) num += 1;
>
> _vec_cmp = (_vec_A != _vec_ZERO);
> _vec_num -= _vec_cmp;
>
>
> if (A[i] != 0) num += x;
>
> _vec_cmp = (_vec_A != _vec_ZERO);
> _vec_cmp *= _vec_x;
> _vec_num -= _vec_cmp;
While the middle-end knows that vector comparisons result in
{0,0...} or {-1,-1,...} I doubt that anyone implemented the above
transform.
Note that it depends on the target on whether the transform
would be profitable - a target may only implement
a vector conditional move for example (the XOP vcond one).
So the correct place for the optimization would be the
expander or combine (unless we apply some canonicalization
rule on GIMPLE - but the back-transform is certainly more
complicated than optimally expanding vec_A != vec_ZERO ? 0 : 1)
Richard.
>
>
> r~
More information about the Gcc-patches
mailing list