Commit f18a7b25 by Martin Jambor Committed by Martin Jambor

re PR middle-end/51782 (-ftree-sra: Missing address-space information leads to wrong)

2012-02-22  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/51782
	* emit-rtl.c (set_mem_attributes_minus_bitpos): Set address space
	according to the base object.

From-SVN: r184463
parent 8cfa7899
2012-02-22 Martin Jambor <mjambor@suse.cz>
PR middle-end/51782
* emit-rtl.c (set_mem_attributes_minus_bitpos): Set address space
according to the base object.
2012-02-22 Georg-Johann Lay <avr@gjlay.de>
PR rtl-optimization/50063
......
......@@ -1548,6 +1548,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
HOST_WIDE_INT apply_bitpos = 0;
tree type;
struct mem_attrs attrs, *defattrs, *refattrs;
addr_space_t as;
/* It can happen that type_for_mode was given a mode for which there
is no language-level type. In which case it returns NULL, which
......@@ -1681,17 +1682,29 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
MEM_NOTRAP_P (ref) = !tree_could_trap_p (t);
base = get_base_address (t);
if (base && DECL_P (base)
&& TREE_READONLY (base)
&& (TREE_STATIC (base) || DECL_EXTERNAL (base))
&& !TREE_THIS_VOLATILE (base))
MEM_READONLY_P (ref) = 1;
/* Mark static const strings readonly as well. */
if (base && TREE_CODE (base) == STRING_CST
&& TREE_READONLY (base)
&& TREE_STATIC (base))
MEM_READONLY_P (ref) = 1;
if (base)
{
if (DECL_P (base)
&& TREE_READONLY (base)
&& (TREE_STATIC (base) || DECL_EXTERNAL (base))
&& !TREE_THIS_VOLATILE (base))
MEM_READONLY_P (ref) = 1;
/* Mark static const strings readonly as well. */
if (TREE_CODE (base) == STRING_CST
&& TREE_READONLY (base)
&& TREE_STATIC (base))
MEM_READONLY_P (ref) = 1;
if (TREE_CODE (base) == MEM_REF
|| TREE_CODE (base) == TARGET_MEM_REF)
as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (base,
0))));
else
as = TYPE_ADDR_SPACE (TREE_TYPE (base));
}
else
as = TYPE_ADDR_SPACE (type);
/* If this expression uses it's parent's alias set, mark it such
that we won't change it. */
......@@ -1830,6 +1843,8 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
attrs.align = MAX (attrs.align, obj_align);
}
}
else
as = TYPE_ADDR_SPACE (type);
/* If we modified OFFSET based on T, then subtract the outstanding
bit position offset. Similarly, increase the size of the accessed
......@@ -1843,7 +1858,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
}
/* Now set the attributes we computed above. */
attrs.addrspace = TYPE_ADDR_SPACE (type);
attrs.addrspace = as;
set_mem_attrs (ref, &attrs);
}
......
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