Commit 79f512ff by Richard Biener Committed by Richard Biener

re PR tree-optimization/80170 (SLP vectorization creates aligned access)

2017-03-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/80170
	* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Make
	sure DR/SCEV didnt fold in constants we do not see when looking
	at the reference base alignment.

	* gcc.dg/pr80170.c: New testcase.

From-SVN: r246491
parent 672d9f8e
2017-03-27 Richard Biener <rguenther@suse.de> 2017-03-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/80170
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Make
sure DR/SCEV didnt fold in constants we do not see when looking
at the reference base alignment.
2017-03-27 Richard Biener <rguenther@suse.de>
PR middle-end/80171 PR middle-end/80171
* gimple-fold.c (fold_ctor_reference): Properly guard against * gimple-fold.c (fold_ctor_reference): Properly guard against
NULL return value from canonicalize_constructor_val. NULL return value from canonicalize_constructor_val.
......
2017-03-27 Richard Biener <rguenther@suse.de> 2017-03-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/80170
* gcc.dg/pr80170.c: New testcase.
2017-03-27 Richard Biener <rguenther@suse.de>
PR middle-end/80171 PR middle-end/80171
* g++.dg/torture/pr80171.C: New testcase. * g++.dg/torture/pr80171.C: New testcase.
......
/* { dg-do run } */
/* { dg-options "-fgimple -O2 -ftree-slp-vectorize" } */
struct A
{
void * a;
void * b;
};
struct __attribute__((aligned(16))) B
{
void * pad;
void * misaligned;
void * pad2;
struct A a;
};
__attribute__((noclone, noinline))
void __GIMPLE (startwith("slp"))
NullB (void * misalignedPtr)
{
struct B * b;
bb_2:
#if __SIZEOF_LONG__ == 8
b_2 = misalignedPtr_1(D) + 18446744073709551608ul;
#else
b_2 = misalignedPtr_1(D) + 4294967292ul;
#endif
__MEM <struct B> (b_2).a.a = _Literal (void *) 0;
__MEM <struct B> (b_2).a.b = _Literal (void *) 0;
return;
}
int main()
{
struct B b;
NullB (&b.misaligned);
return 0;
}
...@@ -779,7 +779,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr) ...@@ -779,7 +779,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
base = ref; base = ref;
while (handled_component_p (base)) while (handled_component_p (base))
base = TREE_OPERAND (base, 0); base = TREE_OPERAND (base, 0);
unsigned int base_alignment; unsigned int base_alignment = 0;
unsigned HOST_WIDE_INT base_bitpos; unsigned HOST_WIDE_INT base_bitpos;
get_object_alignment_1 (base, &base_alignment, &base_bitpos); get_object_alignment_1 (base, &base_alignment, &base_bitpos);
/* As data-ref analysis strips the MEM_REF down to its base operand /* As data-ref analysis strips the MEM_REF down to its base operand
...@@ -788,8 +788,17 @@ vect_compute_data_ref_alignment (struct data_reference *dr) ...@@ -788,8 +788,17 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
DR_BASE_ADDRESS. */ DR_BASE_ADDRESS. */
if (TREE_CODE (base) == MEM_REF) if (TREE_CODE (base) == MEM_REF)
{ {
base_bitpos -= mem_ref_offset (base).to_short_addr () * BITS_PER_UNIT; /* Note all this only works if DR_BASE_ADDRESS is the same as
base_bitpos &= (base_alignment - 1); MEM_REF operand zero, otherwise DR/SCEV analysis might have factored
in other offsets. We need to rework DR to compute the alingment
of DR_BASE_ADDRESS as long as all information is still available. */
if (operand_equal_p (TREE_OPERAND (base, 0), base_addr, 0))
{
base_bitpos -= mem_ref_offset (base).to_short_addr () * BITS_PER_UNIT;
base_bitpos &= (base_alignment - 1);
}
else
base_bitpos = BITS_PER_UNIT;
} }
if (base_bitpos != 0) if (base_bitpos != 0)
base_alignment = base_bitpos & -base_bitpos; base_alignment = base_bitpos & -base_bitpos;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment