diff mbox

Avoid false vector mask conversion

Message ID 20151204150059.GB41884@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Dec. 4, 2015, 3 p.m. UTC
On 02 Dec 16:27, Richard Biener wrote:
> On Wed, Dec 2, 2015 at 4:24 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> >
> > The problem is that conversion is supposed to be handled by
> > vectorizable_conversion,
> > but it fails to because it is not actually a conversion. I suppose it
> > may be handled
> > in vectorizable_assignment but I chose this pattern because it's meant
> > to handle mask
> > conversion issues.
> 
> I think it's always better to avoid patterns if you can.
> 
> Richard.
> 

Here is a variant with vectorizable_assignment change.  Bootstrapped and regtested on x86_64-unknown-linux-gnu.  Does it look better?

Thanks,
Ilya
--
gcc/

2015-12-04  Ilya Enkovich  <enkovich.gnu@gmail.com>

	* tree-vect-stmts.c (vectorizable_assignment): Support
	useless boolean conversion.

Comments

Richard Biener Dec. 10, 2015, 11:18 a.m. UTC | #1
On Fri, Dec 4, 2015 at 4:00 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> On 02 Dec 16:27, Richard Biener wrote:
>> On Wed, Dec 2, 2015 at 4:24 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>> >
>> > The problem is that conversion is supposed to be handled by
>> > vectorizable_conversion,
>> > but it fails to because it is not actually a conversion. I suppose it
>> > may be handled
>> > in vectorizable_assignment but I chose this pattern because it's meant
>> > to handle mask
>> > conversion issues.
>>
>> I think it's always better to avoid patterns if you can.
>>
>> Richard.
>>
>
> Here is a variant with vectorizable_assignment change.  Bootstrapped and regtested on x86_64-unknown-linux-gnu.  Does it look better?

Yes.

Thanks,
Richard.

> Thanks,
> Ilya
> --
> gcc/
>
> 2015-12-04  Ilya Enkovich  <enkovich.gnu@gmail.com>
>
>         * tree-vect-stmts.c (vectorizable_assignment): Support
>         useless boolean conversion.
>
>
> diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
> index 3b078da..2cdbb04 100644
> --- a/gcc/tree-vect-stmts.c
> +++ b/gcc/tree-vect-stmts.c
> @@ -4229,7 +4229,12 @@ vectorizable_assignment (gimple *stmt, gimple_stmt_iterator *gsi,
>        /* But a conversion that does not change the bit-pattern is ok.  */
>        && !((TYPE_PRECISION (TREE_TYPE (scalar_dest))
>             > TYPE_PRECISION (TREE_TYPE (op)))
> -          && TYPE_UNSIGNED (TREE_TYPE (op))))
> +          && TYPE_UNSIGNED (TREE_TYPE (op)))
> +      /* Conversion between boolean types of different sizes is
> +        a simple assignment in case their vectypes are same
> +        boolean vectors.  */
> +      && (!VECTOR_BOOLEAN_TYPE_P (vectype)
> +         || !VECTOR_BOOLEAN_TYPE_P (vectype_in)))
>      {
>        if (dump_enabled_p ())
>          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
diff mbox

Patch

diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 3b078da..2cdbb04 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -4229,7 +4229,12 @@  vectorizable_assignment (gimple *stmt, gimple_stmt_iterator *gsi,
       /* But a conversion that does not change the bit-pattern is ok.  */
       && !((TYPE_PRECISION (TREE_TYPE (scalar_dest))
 	    > TYPE_PRECISION (TREE_TYPE (op)))
-	   && TYPE_UNSIGNED (TREE_TYPE (op))))
+	   && TYPE_UNSIGNED (TREE_TYPE (op)))
+      /* Conversion between boolean types of different sizes is
+	 a simple assignment in case their vectypes are same
+	 boolean vectors.  */
+      && (!VECTOR_BOOLEAN_TYPE_P (vectype)
+	  || !VECTOR_BOOLEAN_TYPE_P (vectype_in)))
     {
       if (dump_enabled_p ())
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,