This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/66142] Loop is not vectorized because not sufficient support for GOMP_SIMD_LANE
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 02 Jun 2015 13:18:24 +0000
- Subject: [Bug tree-optimization/66142] Loop is not vectorized because not sufficient support for GOMP_SIMD_LANE
- Auto-submitted: auto-generated
- References: <bug-66142-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66142
--- Comment #17 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, so even with PR63916 rudimentary fixed we hit the issue that in
_9 = &D.3665[_11].org;
MEM[(struct vec_ *)_9] = 1.0e+0;
MEM[(struct vec_ *)_9 + 4B] = _8;
...
_24 = MEM[(const struct Ray *)&D.3665][_11].org.x;
the store to MEM[(struct vec_ *)_9 + 4B] aliases MEM[(const struct Ray
*)&D.3665][_11].org.x.
And the rudimentary fix for PR63916 doesn't allow for the forwarding to succeed
into MEM[(struct vec_ *)_9 + 4B] either.
Without SRA we get
D.3665[_11].org = p;
D.3665[_11].dir.x = x_12;
D.3665[_11].dir.y = y_13;
D.3664[_11].t = 1.0e+10;
D.3664[_11].h = 0;
_25 = MEM[(const struct Ray *)&D.3665][_11].org.x;
and the look-through-aggregate-copy code bails out at
/* See if the assignment kills REF. */
base2 = ao_ref_base (&lhs_ref);
offset2 = lhs_ref.offset;
size2 = lhs_ref.size;
maxsize2 = lhs_ref.max_size;
if (maxsize2 == -1
|| (base != base2
&& (TREE_CODE (base) != MEM_REF
|| TREE_CODE (base2) != MEM_REF
|| TREE_OPERAND (base, 0) != TREE_OPERAND (base2, 0)
|| !tree_int_cst_equal (TREE_OPERAND (base, 1),
TREE_OPERAND (base2, 1))))
|| offset2 > offset
|| offset2 + size2 < offset + maxsize)
return (void *)-1;
stmt_kills_ref_p fails to compare
MEM[(const struct Ray *)&D.3665][_15].org and D.3665[_15].org
equal via operand_equal_p.