Commit a0d3edf8 by Richard Biener Committed by Richard Biener

re PR tree-optimization/78189 (movaps generated for unaligned store in aligned…

re PR tree-optimization/78189 (movaps generated for unaligned store in aligned struct, when struct is referenced via unaligned member.)

2016-11-07  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/78189
	* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Fix
	alignment computation.

	* g++.dg/torture/pr78189.C: New testcase.

From-SVN: r241892
parent e34b855e
2016-11-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/78189
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Fix
alignment computation.
2016-11-06 Kugan Vivekanandarajah <kuganv@linaro.org>
* ipa-cp.c (ipcp_bits_lattice::meet_with): Remove unreachable code.
2016-11-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/78189
* g++.dg/torture/pr78189.C: New testcase.
2016-11-06 David Edelsohn <dje.gcc@gmail.com>
* gcc.dg/Wtrampolines.c: XFAIL AIX.
......
/* { dg-do run } */
/* { dg-additional-options "-ftree-slp-vectorize -fno-vect-cost-model" } */
#include <cstddef>
struct A
{
void * a;
void * b;
};
struct alignas(16) B
{
void * pad;
void * misaligned;
void * pad2;
A a;
void Null();
};
void B::Null()
{
a.a = nullptr;
a.b = nullptr;
}
void __attribute__((noinline,noclone))
NullB(void * misalignedPtr)
{
B* b = reinterpret_cast<B*>(reinterpret_cast<char *>(misalignedPtr) - offsetof(B, misaligned));
b->Null();
}
int main()
{
B b;
NullB(&b.misaligned);
return 0;
}
......@@ -773,10 +773,25 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
base = ref;
while (handled_component_p (base))
base = TREE_OPERAND (base, 0);
unsigned int base_alignment;
unsigned HOST_WIDE_INT base_bitpos;
get_object_alignment_1 (base, &base_alignment, &base_bitpos);
/* As data-ref analysis strips the MEM_REF down to its base operand
to form DR_BASE_ADDRESS and adds the offset to DR_INIT we have to
adjust things to make base_alignment valid as the alignment of
DR_BASE_ADDRESS. */
if (TREE_CODE (base) == MEM_REF)
base = build2 (MEM_REF, TREE_TYPE (base), base_addr,
build_int_cst (TREE_TYPE (TREE_OPERAND (base, 1)), 0));
unsigned int base_alignment = get_object_alignment (base);
{
base_bitpos -= mem_ref_offset (base).to_short_addr () * BITS_PER_UNIT;
base_bitpos &= (base_alignment - 1);
}
if (base_bitpos != 0)
base_alignment = base_bitpos & -base_bitpos;
/* Also look at the alignment of the base address DR analysis
computed. */
unsigned int base_addr_alignment = get_pointer_alignment (base_addr);
if (base_addr_alignment > base_alignment)
base_alignment = base_addr_alignment;
if (base_alignment >= TYPE_ALIGN (TREE_TYPE (vectype)))
DR_VECT_AUX (dr)->base_element_aligned = true;
......
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