[gomp4,trunk] Two simd fixes

Submitted by Jakub Jelinek on Sept. 16, 2013, 4:50 p.m.

Details

Message ID 20130916165030.GT1817@tucnak.redhat.com
State New
Headers show

Commit Message

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

Comments

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 hide | download patch | download mbox

--- 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;
 				    }