This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Improving uniform_vector_p() function.
- From: Cong Hou <congh at google dot com>
- To: Xinliang David Li <davidxl at google dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Guenther <richard dot guenther at gmail dot com>
- Date: Tue, 1 Oct 2013 14:44:41 -0700
- Subject: Re: [PATCH] Improving uniform_vector_p() function.
- Authentication-results: sourceware.org; auth=none
- References: <CAK=A3=3J=AnCYQSsYVEzoW0ETEov_UcLyjTT9SNGETGOn49Mhg at mail dot gmail dot com> <CAAkRFZKN=RDtO9nd76Ws5e_TEP=8Wj5einR6m+gtNUjqjKn1Jg at mail dot gmail dot com>
Actually I will introduce optimizations in the next patch. Currently
the function uniform_vector_p () is rarely used in GCC, but there are
certainly some optimization opportunities with the help of this
function.
For example, when we widen a vector with 8 identical element of short
type to two vectors of int type, GCC emits the following code:
vect_cst_.15_91 = {_9, _9, _9, _9, _9, _9, _9, _9};
vect__10.16_92 = [vec_unpack_lo_expr] vect_cst_.15_91;
vect__10.16_93 = [vec_unpack_hi_expr] vect_cst_.15_91;
When vect_cst_.15_91 is a uniform vector, we know vect__10.16_92 and
vect__10.16_93 are identical so that we can remove the second
[vec_unpack_hi_expr] operation:
vect_cst_.15_91 = {_9, _9, _9, _9, _9, _9, _9, _9};
vect__10.16_92 = [vec_unpack_lo_expr] vect_cst_.15_91;
vect__10.16_93 = vect__10.16_92;
thanks,
Cong
On Tue, Oct 1, 2013 at 2:37 PM, Xinliang David Li <davidxl@google.com> wrote:
> On Tue, Oct 1, 2013 at 10:31 AM, Cong Hou <congh@google.com> wrote:
>> The current uniform_vector_p() function only returns non-NULL when the
>> vector is directly a uniform vector. For example, for the following
>> gimple code:
>>
>> vect_cst_.15_91 = {_9, _9, _9, _9, _9, _9, _9, _9};
>>
>>
>> The current implementation can only detect that {_9, _9, _9, _9, _9,
>> _9, _9, _9} is a uniform vector, but fails to recognize
>> vect_cst_.15_91 is also one. This simple patch searches through
>> assignment chains to find more uniform vectors.
>>
>>
>> thanks,
>> Cong
>>
>>
>>
>> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
>> index 45c1667..b42f8a9 100644
>> --- a/gcc/ChangeLog
>> +++ b/gcc/ChangeLog
>> @@ -1,3 +1,9 @@
>> +2013-10-01 Cong Hou <congh@google.com>
>> +
>> + * tree.c: Improve the function uniform_vector_p() so that a
>> + vector assigned with a uniform vector is also treated as a
>> + uniform vector.
>> +
>> diff --git a/gcc/tree.c b/gcc/tree.c
>> index 1c881e4..1d6d894 100644
>> --- a/gcc/tree.c
>> +++ b/gcc/tree.c
>> @@ -10297,6 +10297,17 @@ uniform_vector_p (const_tree vec)
>> return first;
>> }
>>
>> + if (TREE_CODE (vec) == SSA_NAME)
>> + {
>> + gimple def = SSA_NAME_DEF_STMT (vec);
>> + if (gimple_code (def) == GIMPLE_ASSIGN)
>
>
> do this:
>
> if (is_gimple_assign (def) && gimple_assign_copy_p (def))
>
>> + {
>> + tree rhs = gimple_op (def, 1);
>> + if (VECTOR_TYPE_P (TREE_TYPE (rhs)))
>> + return uniform_vector_p (rhs);
>> + }
>> + }
>> +
>> return NULL_TREE;
>> }
>
> Do you have a test case showing what missed optimization this fix can enable ?
>
> David