diff mbox

[PR,tree-optimization/68327] Compute vectype for live phi nodes when copmputing VF

Message ID 20151118110701.GB42296@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Nov. 18, 2015, 11:34 a.m. UTC
Hi,

When we compute vectypes we skip non-relevant phi nodes.  But we process non-relevant alive statements and thus may need vectype of non-relevant live phi node to compute mask vectype.  This patch enables vectype computation for live phi nodes.  Botostrapped and regtested on x86_64-unknown-linux-gnu.  OK for trunk?

Thanks,
Ilya
--
gcc/

2015-11-18  Ilya Enkovich  <enkovich.gnu@gmail.com>

	PR tree-optimization/68327
	* tree-vect-loop.c (vect_determine_vectorization_factor): Don't
	skip non-relevant live phi nodes.

gcc/testsuite/

2015-11-18  Ilya Enkovich  <enkovich.gnu@gmail.com>

	PR tree-optimization/68327
	* gcc.dg/pr68327.c: New test.

Comments

Richard Biener Nov. 18, 2015, 1:44 p.m. UTC | #1
On Wed, Nov 18, 2015 at 12:34 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> Hi,
>
> When we compute vectypes we skip non-relevant phi nodes.  But we process non-relevant alive statements and thus may need vectype of non-relevant live phi node to compute mask vectype.  This patch enables vectype computation for live phi nodes.  Botostrapped and regtested on x86_64-unknown-linux-gnu.  OK for trunk?

Hmm.  What breaks if you instead skip all !relevant stmts and not
compute vectype for life but not relevant ones?  We won't ever
"vectorize" !relevant ones, that is, we don't need their vector type.

Richard.

> Thanks,
> Ilya
> --
> gcc/
>
> 2015-11-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
>
>         PR tree-optimization/68327
>         * tree-vect-loop.c (vect_determine_vectorization_factor): Don't
>         skip non-relevant live phi nodes.
>
> gcc/testsuite/
>
> 2015-11-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
>
>         PR tree-optimization/68327
>         * gcc.dg/pr68327.c: New test.
>
>
> diff --git a/gcc/testsuite/gcc.dg/pr68327.c b/gcc/testsuite/gcc.dg/pr68327.c
> new file mode 100644
> index 0000000..c3e6a94
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr68327.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3" } */
> +
> +int a, d;
> +char b, c;
> +
> +void
> +fn1 ()
> +{
> +  int i = 0;
> +  for (; i < 1; i++)
> +    d = 1;
> +  for (; b; b++)
> +    a = 1 && (d & b);
> +}
> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
> index 80937ec..7dba027 100644
> --- a/gcc/tree-vect-loop.c
> +++ b/gcc/tree-vect-loop.c
> @@ -216,7 +216,8 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo)
>
>           gcc_assert (stmt_info);
>
> -         if (STMT_VINFO_RELEVANT_P (stmt_info))
> +         if (STMT_VINFO_RELEVANT_P (stmt_info)
> +             || STMT_VINFO_LIVE_P (stmt_info))
>              {
>               gcc_assert (!STMT_VINFO_VECTYPE (stmt_info));
>                scalar_type = TREE_TYPE (PHI_RESULT (phi));
Ilya Enkovich Nov. 18, 2015, 1:53 p.m. UTC | #2
2015-11-18 16:44 GMT+03:00 Richard Biener <richard.guenther@gmail.com>:
> On Wed, Nov 18, 2015 at 12:34 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>> Hi,
>>
>> When we compute vectypes we skip non-relevant phi nodes.  But we process non-relevant alive statements and thus may need vectype of non-relevant live phi node to compute mask vectype.  This patch enables vectype computation for live phi nodes.  Botostrapped and regtested on x86_64-unknown-linux-gnu.  OK for trunk?
>
> Hmm.  What breaks if you instead skip all !relevant stmts and not
> compute vectype for life but not relevant ones?  We won't ever
> "vectorize" !relevant ones, that is, we don't need their vector type.

I tried it and got regression in SLP.  It expected non-null vectype
for non-releveant but live statement. Regression was in
gcc/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90

Ilya

>
> Richard.
>
>> Thanks,
>> Ilya
Richard Biener Nov. 20, 2015, 11:28 a.m. UTC | #3
On Wed, Nov 18, 2015 at 2:53 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> 2015-11-18 16:44 GMT+03:00 Richard Biener <richard.guenther@gmail.com>:
>> On Wed, Nov 18, 2015 at 12:34 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>>> Hi,
>>>
>>> When we compute vectypes we skip non-relevant phi nodes.  But we process non-relevant alive statements and thus may need vectype of non-relevant live phi node to compute mask vectype.  This patch enables vectype computation for live phi nodes.  Botostrapped and regtested on x86_64-unknown-linux-gnu.  OK for trunk?
>>
>> Hmm.  What breaks if you instead skip all !relevant stmts and not
>> compute vectype for life but not relevant ones?  We won't ever
>> "vectorize" !relevant ones, that is, we don't need their vector type.
>
> I tried it and got regression in SLP.  It expected non-null vectype
> for non-releveant but live statement. Regression was in
> gcc/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90

Because somebody put a vector type check before

  if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
    return false;

@@ -7590,6 +7651,9 @@ vectorizable_comparison (gimple *stmt, g
   tree mask_type;
   tree mask;

+  if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
+    return false;
+
   if (!VECTOR_BOOLEAN_TYPE_P (vectype))
     return false;

@@ -7602,8 +7666,6 @@ vectorizable_comparison (gimple *stmt, g
     ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits;

   gcc_assert (ncopies >= 1);
-  if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
-    return false;

   if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def
       && !(STMT_VINFO_DEF_TYPE (stmt_info) == vect_nested_cycle

fixes this particular fallout for me.

Richard.

> Ilya
>
>>
>> Richard.
>>
>>> Thanks,
>>> Ilya
Ilya Enkovich Nov. 20, 2015, 11:31 a.m. UTC | #4
2015-11-20 14:28 GMT+03:00 Richard Biener <richard.guenther@gmail.com>:
> On Wed, Nov 18, 2015 at 2:53 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>> 2015-11-18 16:44 GMT+03:00 Richard Biener <richard.guenther@gmail.com>:
>>> On Wed, Nov 18, 2015 at 12:34 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>>>> Hi,
>>>>
>>>> When we compute vectypes we skip non-relevant phi nodes.  But we process non-relevant alive statements and thus may need vectype of non-relevant live phi node to compute mask vectype.  This patch enables vectype computation for live phi nodes.  Botostrapped and regtested on x86_64-unknown-linux-gnu.  OK for trunk?
>>>
>>> Hmm.  What breaks if you instead skip all !relevant stmts and not
>>> compute vectype for life but not relevant ones?  We won't ever
>>> "vectorize" !relevant ones, that is, we don't need their vector type.
>>
>> I tried it and got regression in SLP.  It expected non-null vectype
>> for non-releveant but live statement. Regression was in
>> gcc/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90
>
> Because somebody put a vector type check before
>
>   if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
>     return false;
>
> @@ -7590,6 +7651,9 @@ vectorizable_comparison (gimple *stmt, g
>    tree mask_type;
>    tree mask;
>
> +  if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
> +    return false;
> +
>    if (!VECTOR_BOOLEAN_TYPE_P (vectype))
>      return false;
>
> @@ -7602,8 +7666,6 @@ vectorizable_comparison (gimple *stmt, g
>      ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits;
>
>    gcc_assert (ncopies >= 1);
> -  if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
> -    return false;
>
>    if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def
>        && !(STMT_VINFO_DEF_TYPE (stmt_info) == vect_nested_cycle
>
> fixes this particular fallout for me.

I'll try it.

Thanks,
Ilya

>
> Richard.
>
>> Ilya
>>
>>>
>>> Richard.
>>>
>>>> Thanks,
>>>> Ilya
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/pr68327.c b/gcc/testsuite/gcc.dg/pr68327.c
new file mode 100644
index 0000000..c3e6a94
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr68327.c
@@ -0,0 +1,15 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+int a, d;
+char b, c;
+
+void
+fn1 ()
+{
+  int i = 0;
+  for (; i < 1; i++)
+    d = 1;
+  for (; b; b++)
+    a = 1 && (d & b);
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 80937ec..7dba027 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -216,7 +216,8 @@  vect_determine_vectorization_factor (loop_vec_info loop_vinfo)
 
 	  gcc_assert (stmt_info);
 
-	  if (STMT_VINFO_RELEVANT_P (stmt_info))
+	  if (STMT_VINFO_RELEVANT_P (stmt_info)
+	      || STMT_VINFO_LIVE_P (stmt_info))
             {
 	      gcc_assert (!STMT_VINFO_VECTYPE (stmt_info));
               scalar_type = TREE_TYPE (PHI_RESULT (phi));