diff mbox

PR 49742: call lhs being ignored

Message ID g47h7ewjoa.fsf@linaro.org
State New
Headers show

Commit Message

Richard Sandiford July 19, 2011, 12:15 p.m. UTC
In 49742, we have:

  vect_array.21 = LOAD_LANES (MEM[(int[512] *)vect_pin.17_56]);
  vect_var_.22_58 = vect_array.21[0];

predcom doesn't think that there are any dependencies between
the two statements, so hoists the second one as an invariant.
This in turn is because get_references_in_stmt ignores the lhs
of calls.

Tested on x86_64-linux-gnu and arm-linux-gnueabi.  OK to install?

Richard


gcc/
	PR tree-optimization/49742
	* tree-data-ref.c (get_references_in_stmt): Treat the lhs of a call
	as a potential write.

Comments

Richard Biener July 19, 2011, 12:22 p.m. UTC | #1
On Tue, Jul 19, 2011 at 2:15 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> In 49742, we have:
>
>  vect_array.21 = LOAD_LANES (MEM[(int[512] *)vect_pin.17_56]);
>  vect_var_.22_58 = vect_array.21[0];
>
> predcom doesn't think that there are any dependencies between
> the two statements, so hoists the second one as an invariant.
> This in turn is because get_references_in_stmt ignores the lhs
> of calls.
>
> Tested on x86_64-linux-gnu and arm-linux-gnueabi.  OK to install?

Ok.

Thanks,
Richard.

> Richard
>
>
> gcc/
>        PR tree-optimization/49742
>        * tree-data-ref.c (get_references_in_stmt): Treat the lhs of a call
>        as a potential write.
>
> Index: gcc/tree-data-ref.c
> ===================================================================
> --- gcc/tree-data-ref.c 2011-07-19 10:53:10.000000000 +0100
> +++ gcc/tree-data-ref.c 2011-07-19 13:08:12.000000000 +0100
> @@ -4158,33 +4158,37 @@ get_references_in_stmt (gimple stmt, VEC
>          ref->pos = op1;
>          ref->is_read = true;
>        }
> -
> -      if (DECL_P (*op0)
> -         || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0)))
> -       {
> -         ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
> -         ref->pos = op0;
> -         ref->is_read = false;
> -       }
>     }
>   else if (stmt_code == GIMPLE_CALL)
>     {
> -      unsigned i, n = gimple_call_num_args (stmt);
> +      unsigned i, n;
>
> +      op0 = gimple_call_lhs_ptr (stmt);
> +      n = gimple_call_num_args (stmt);
>       for (i = 0; i < n; i++)
>        {
> -         op0 = gimple_call_arg_ptr (stmt, i);
> +         op1 = gimple_call_arg_ptr (stmt, i);
>
> -         if (DECL_P (*op0)
> -             || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0)))
> +         if (DECL_P (*op1)
> +             || (REFERENCE_CLASS_P (*op1) && get_base_address (*op1)))
>            {
>              ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
> -             ref->pos = op0;
> +             ref->pos = op1;
>              ref->is_read = true;
>            }
>        }
>     }
> +  else
> +    return clobbers_memory;
>
> +  if (*op0
> +      && (DECL_P (*op0)
> +         || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0))))
> +    {
> +      ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
> +      ref->pos = op0;
> +      ref->is_read = false;
> +    }
>   return clobbers_memory;
>  }
>
>
diff mbox

Patch

Index: gcc/tree-data-ref.c
===================================================================
--- gcc/tree-data-ref.c	2011-07-19 10:53:10.000000000 +0100
+++ gcc/tree-data-ref.c	2011-07-19 13:08:12.000000000 +0100
@@ -4158,33 +4158,37 @@  get_references_in_stmt (gimple stmt, VEC
 	  ref->pos = op1;
 	  ref->is_read = true;
 	}
-
-      if (DECL_P (*op0)
-	  || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0)))
-	{
-	  ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
-	  ref->pos = op0;
-	  ref->is_read = false;
-	}
     }
   else if (stmt_code == GIMPLE_CALL)
     {
-      unsigned i, n = gimple_call_num_args (stmt);
+      unsigned i, n;
 
+      op0 = gimple_call_lhs_ptr (stmt);
+      n = gimple_call_num_args (stmt);
       for (i = 0; i < n; i++)
 	{
-	  op0 = gimple_call_arg_ptr (stmt, i);
+	  op1 = gimple_call_arg_ptr (stmt, i);
 
-	  if (DECL_P (*op0)
-	      || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0)))
+	  if (DECL_P (*op1)
+	      || (REFERENCE_CLASS_P (*op1) && get_base_address (*op1)))
 	    {
 	      ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
-	      ref->pos = op0;
+	      ref->pos = op1;
 	      ref->is_read = true;
 	    }
 	}
     }
+  else
+    return clobbers_memory;
 
+  if (*op0
+      && (DECL_P (*op0)
+	  || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0))))
+    {
+      ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
+      ref->pos = op0;
+      ref->is_read = false;
+    }
   return clobbers_memory;
 }