Commit dbad82f5 by Richard Guenther Committed by Richard Biener

re PR rtl-optimization/45678 (crash on vector code with -m32 -msse)

2010-09-17  Richard Guenther  <rguenther@suse.de>

	PR middle-end/45678
	* builtins.c (fold_builtin_memory_op): Always properly adjust
	alignment of memory accesses.

From-SVN: r164356
parent 52b3b3c7
2010-09-17 Richard Guenther <rguenther@suse.de>
PR middle-end/45678
* builtins.c (fold_builtin_memory_op): Always properly adjust
alignment of memory accesses.
2010-09-16 Jan Hubicka <jh@suse.cz> 2010-09-16 Jan Hubicka <jh@suse.cz>
* lto-cgraph.c (input_overwrite_node): Do not set DECL_EXTERNAL when * lto-cgraph.c (input_overwrite_node): Do not set DECL_EXTERNAL when
......
...@@ -8555,12 +8555,21 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src, ...@@ -8555,12 +8555,21 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
STRIP_NOPS (srcvar); STRIP_NOPS (srcvar);
if (TREE_CODE (srcvar) == ADDR_EXPR if (TREE_CODE (srcvar) == ADDR_EXPR
&& var_decl_component_p (TREE_OPERAND (srcvar, 0)) && var_decl_component_p (TREE_OPERAND (srcvar, 0))
&& tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len) && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
&& (!STRICT_ALIGNMENT {
|| !destvar if (!destvar
|| src_align >= TYPE_ALIGN (desttype))) || src_align >= TYPE_ALIGN (desttype))
srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype, srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
srcvar, off0); srcvar, off0);
else if (!STRICT_ALIGNMENT)
{
srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
src_align);
srcvar = fold_build2 (MEM_REF, srctype, srcvar, off0);
}
else
srcvar = NULL_TREE;
}
else else
srcvar = NULL_TREE; srcvar = NULL_TREE;
...@@ -8569,19 +8578,31 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src, ...@@ -8569,19 +8578,31 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
if (srcvar == NULL_TREE) if (srcvar == NULL_TREE)
{ {
if (STRICT_ALIGNMENT
&& src_align < TYPE_ALIGN (desttype))
return NULL_TREE;
STRIP_NOPS (src); STRIP_NOPS (src);
srcvar = fold_build2 (MEM_REF, desttype, src, off0); if (src_align >= TYPE_ALIGN (desttype))
srcvar = fold_build2 (MEM_REF, desttype, src, off0);
else
{
if (STRICT_ALIGNMENT)
return NULL_TREE;
srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
src_align);
srcvar = fold_build2 (MEM_REF, srctype, src, off0);
}
} }
else if (destvar == NULL_TREE) else if (destvar == NULL_TREE)
{ {
if (STRICT_ALIGNMENT
&& dest_align < TYPE_ALIGN (srctype))
return NULL_TREE;
STRIP_NOPS (dest); STRIP_NOPS (dest);
destvar = fold_build2 (MEM_REF, srctype, dest, off0); if (dest_align >= TYPE_ALIGN (srctype))
destvar = fold_build2 (MEM_REF, srctype, dest, off0);
else
{
if (STRICT_ALIGNMENT)
return NULL_TREE;
desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
dest_align);
destvar = fold_build2 (MEM_REF, desttype, dest, off0);
}
} }
expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar); expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar);
......
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