https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96912
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Note, in:
typedef char V __attribute__((vector_size(16)));
typedef long long W __attribute__((vector_size(16)));
W
foo (W x, W y, V m)
{
W t = (m < 0);
return (~t & x) | (t & y);
}
V
bar (V x, V y, V m)
{
V t = (m < 0);
return (~t & x) | (t & y);
}
we actually optimize bar the way we should, seems it is forwprop1 that turns
_1 = m_5(D) < { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
t_6 = VEC_COND_EXPR <_1, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }>;
_2 = ~t_6;
_3 = x_7(D) & _2;
_4 = t_6 & y_8(D);
_9 = _3 | _4;
return _9;
into:
_1 = m_5(D) < { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
t_6 = VEC_COND_EXPR <_1, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }>;
_2 = VEC_COND_EXPR <_1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }>;
_3 = VEC_COND_EXPR <_1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
x_7(D)>;
_4 = VEC_COND_EXPR <_1, y_8(D), { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0 }>;
_9 = VEC_COND_EXPR <_1, y_8(D), x_7(D)>;
return _9;
but the similar:
_1 = m_6(D) < { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
_2 = VEC_COND_EXPR <_1, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }>;
t_7 = VIEW_CONVERT_EXPR<W>(_2);
_3 = ~t_7;
_4 = x_8(D) & _3;
_5 = t_7 & y_9(D);
_10 = _4 | _5;
return _10;
in foo isn't optimized similarly. I'll look tomorrow at that, we should handle
it likee bar with the VEC_COND_EXPR being done in the vector type corresponding
to the comparison with VCEs to that and back.