From 3a5a825aaecd124c57d3b08ba349631ac8e89123 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 28 Feb 2012 09:15:49 +0000 Subject: re PR tree-optimization/52402 (IPA-SRA creates aligned loads from unaligned memory) 2012-02-28 Richard Guenther PR tree-optimization/52402 * ipa-prop.c (ipa_modify_call_arguments): Properly use mis-aligned types when creating the accesses at the call site. * gcc.dg/torture/pr52402.c: New testcase. From-SVN: r184619 --- gcc/ipa-prop.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'gcc/ipa-prop.c') diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 6d76adb..3856793 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -2508,9 +2508,27 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt, } } - expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off); - if (adj->by_ref) - expr = build_fold_addr_expr (expr); + if (!adj->by_ref) + { + tree type = adj->type; + unsigned int align; + unsigned HOST_WIDE_INT misalign; + align = get_pointer_alignment_1 (base, &misalign); + misalign += (double_int_sext (tree_to_double_int (off), + TYPE_PRECISION (TREE_TYPE (off))).low + * BITS_PER_UNIT); + misalign = misalign & (align - 1); + if (misalign != 0) + align = (misalign & -misalign); + if (align < TYPE_ALIGN (type)) + type = build_aligned_type (type, align); + expr = fold_build2_loc (loc, MEM_REF, type, base, off); + } + else + { + expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off); + expr = build_fold_addr_expr (expr); + } expr = force_gimple_operand_gsi (&gsi, expr, adj->by_ref -- cgit v1.1