On Tue, Jul 19, 2011 at 2:15 PM, Richard Sandiford <richard.sandif...@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; > } > >