Patchwork [gomp4,trunk] Two simd fixes

login
register
mail settings
Submitter Jakub Jelinek
Date Sept. 16, 2013, 4:50 p.m.
Message ID <20130916165030.GT1817@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/275245/
State New
Headers show

Comments

Jakub Jelinek - Sept. 16, 2013, 4:50 p.m.
Hi!

This patch fixes two issues I found on the pr58392.c testcase:
1) we weren't copying decl attributes, so e.g. inside #pragma omp parallel
"omp simd array" temporary arrays lost their attribute and weren't
adjusted because of that
2) DR_ALIGNED_TO wasn't reset after resetting DR_OFFSET on simd lane access
DRs, which resulted in the vectorizer trying to peel for alignment on those.
Those are always automatic vars that can be just aligned more.

Ok?

2013-09-16  Jakub Jelinek  <jakub@redhat.com>

	* omp-low.c (copy_var_decl): Copy DECL_ATTRIBUTES.
	* tree-vect-data-refs.c (vect_analyze_data_refs): For
	simd_lane_access drs, update also DR_ALIGNED_TO.


	Jakub
Richard Guenther - Sept. 17, 2013, 7:57 a.m.
On Mon, 16 Sep 2013, Jakub Jelinek wrote:

> Hi!
> 
> This patch fixes two issues I found on the pr58392.c testcase:
> 1) we weren't copying decl attributes, so e.g. inside #pragma omp parallel
> "omp simd array" temporary arrays lost their attribute and weren't
> adjusted because of that
> 2) DR_ALIGNED_TO wasn't reset after resetting DR_OFFSET on simd lane access
> DRs, which resulted in the vectorizer trying to peel for alignment on those.
> Those are always automatic vars that can be just aligned more.
> 
> Ok?
> 
> 2013-09-16  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* omp-low.c (copy_var_decl): Copy DECL_ATTRIBUTES.
> 	* tree-vect-data-refs.c (vect_analyze_data_refs): For
> 	simd_lane_access drs, update also DR_ALIGNED_TO.
> 
> --- gcc/omp-low.c.jj	2013-09-16 10:08:43.000000000 +0200
> +++ gcc/omp-low.c	2013-09-16 15:25:31.683903448 +0200
> @@ -888,6 +888,7 @@ copy_var_decl (tree var, tree name, tree
>    TREE_NO_WARNING (copy) = TREE_NO_WARNING (var);
>    TREE_USED (copy) = 1;
>    DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
> +  DECL_ATTRIBUTES (copy) = DECL_ATTRIBUTES (var);
>  
>    return copy;
>  }

Ok.

> --- gcc/tree-vect-data-refs.c.jj	2013-09-13 16:48:28.000000000 +0200
> +++ gcc/tree-vect-data-refs.c	2013-09-16 14:47:56.500538758 +0200
> @@ -3039,6 +3039,9 @@ again:
>  				    {
>  				      DR_OFFSET (newdr) = ssize_int (0);
>  				      DR_STEP (newdr) = step;
> +				      DR_ALIGNED_TO (newdr)
> +					= size_int (highest_pow2_factor
> +							(DR_OFFSET (newdr)));

That looks odd - DR_OFFSET (newdr) is constant zero, so you can
as well immediately use BIGGEST_ALIGNMENT here (that's what
highest_pow2_factor does).

Ok with that change.

Thanks,
Richard.

>  				      dr = newdr;
>  				      simd_lane_access = true;
>  				    }
> 
> 	Jakub
>

Patch

--- gcc/omp-low.c.jj	2013-09-16 10:08:43.000000000 +0200
+++ gcc/omp-low.c	2013-09-16 15:25:31.683903448 +0200
@@ -888,6 +888,7 @@  copy_var_decl (tree var, tree name, tree
   TREE_NO_WARNING (copy) = TREE_NO_WARNING (var);
   TREE_USED (copy) = 1;
   DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
+  DECL_ATTRIBUTES (copy) = DECL_ATTRIBUTES (var);
 
   return copy;
 }
--- gcc/tree-vect-data-refs.c.jj	2013-09-13 16:48:28.000000000 +0200
+++ gcc/tree-vect-data-refs.c	2013-09-16 14:47:56.500538758 +0200
@@ -3039,6 +3039,9 @@  again:
 				    {
 				      DR_OFFSET (newdr) = ssize_int (0);
 				      DR_STEP (newdr) = step;
+				      DR_ALIGNED_TO (newdr)
+					= size_int (highest_pow2_factor
+							(DR_OFFSET (newdr)));
 				      dr = newdr;
 				      simd_lane_access = true;
 				    }