--- gcc/tree-sra.c.jj 2013-08-13 12:20:43.000000000 +0200 +++ gcc/tree-sra.c 2013-08-14 00:53:15.766501279 +0200 @@ -1466,9 +1466,11 @@ build_ref_for_offset (location_t loc, tr { tree prev_base = base; tree off; + tree mem_ref; HOST_WIDE_INT base_offset; unsigned HOST_WIDE_INT misalign; unsigned int align; + bool is_volatile = TREE_THIS_VOLATILE (TREE_TYPE (base)); gcc_checking_assert (offset % BITS_PER_UNIT == 0); get_object_alignment_1 (base, &align, &misalign); @@ -1515,8 +1517,14 @@ build_ref_for_offset (location_t loc, tr align = (misalign & -misalign); if (align < TYPE_ALIGN (exp_type)) exp_type = build_aligned_type (exp_type, align); - - return fold_build2_loc (loc, MEM_REF, exp_type, base, off); + if (is_volatile && !TREE_THIS_VOLATILE (exp_type)) + exp_type = build_qualified_type (exp_type, TYPE_QUALS (exp_type) + | TYPE_QUAL_VOLATILE); + + mem_ref = fold_build2_loc (loc, MEM_REF, exp_type, base, off); + if (TREE_THIS_VOLATILE (exp_type)) + TREE_THIS_VOLATILE (mem_ref) = 1; + return mem_ref; } /* Construct a memory reference to a part of an aggregate BASE at the given