Commit e9615971 by Richard Guenther Committed by Richard Biener

gimple-fold.c (maybe_fold_reference): When canonicalizing MEM_REFs, preserve volatileness.

2010-11-22  Richard Guenther  <rguenther@suse.de>

	* gimple-fold.c (maybe_fold_reference): When canonicalizing
	MEM_REFs, preserve volatileness.
	* cgraphbuild.c (mark_address): Properly check for FUNCTION_DECL
	addresses.

From-SVN: r167030
parent 993466f3
2010-11-22 Richard Guenther <rguenther@suse.de> 2010-11-22 Richard Guenther <rguenther@suse.de>
* gimple-fold.c (maybe_fold_reference): When canonicalizing
MEM_REFs, preserve volatileness.
* cgraphbuild.c (mark_address): Properly check for FUNCTION_DECL
addresses.
2010-11-22 Richard Guenther <rguenther@suse.de>
* tree-ssa-ccp.c (get_base_constructor): Remove superfluous breaks. * tree-ssa-ccp.c (get_base_constructor): Remove superfluous breaks.
2010-11-22 Alexander Monakov <amonakov@ispras.ru> 2010-11-22 Alexander Monakov <amonakov@ispras.ru>
...@@ -237,6 +237,7 @@ static bool ...@@ -237,6 +237,7 @@ static bool
mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr, mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr,
void *data ATTRIBUTE_UNUSED) void *data ATTRIBUTE_UNUSED)
{ {
addr = get_base_address (addr);
if (TREE_CODE (addr) == FUNCTION_DECL) if (TREE_CODE (addr) == FUNCTION_DECL)
{ {
struct cgraph_node *node = cgraph_node (addr); struct cgraph_node *node = cgraph_node (addr);
...@@ -245,24 +246,20 @@ mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr, ...@@ -245,24 +246,20 @@ mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr,
node, NULL, node, NULL,
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
} }
else else if (addr && TREE_CODE (addr) == VAR_DECL
&& (TREE_STATIC (addr) || DECL_EXTERNAL (addr)))
{ {
addr = get_base_address (addr); struct varpool_node *vnode = varpool_node (addr);
if (addr && TREE_CODE (addr) == VAR_DECL int walk_subtrees;
&& (TREE_STATIC (addr) || DECL_EXTERNAL (addr)))
{
struct varpool_node *vnode = varpool_node (addr);
int walk_subtrees;
if (lang_hooks.callgraph.analyze_expr) if (lang_hooks.callgraph.analyze_expr)
lang_hooks.callgraph.analyze_expr (&addr, &walk_subtrees); lang_hooks.callgraph.analyze_expr (&addr, &walk_subtrees);
varpool_mark_needed_node (vnode); varpool_mark_needed_node (vnode);
if (vnode->alias && vnode->extra_name) if (vnode->alias && vnode->extra_name)
vnode = vnode->extra_name; vnode = vnode->extra_name;
ipa_record_reference ((struct cgraph_node *)data, NULL, ipa_record_reference ((struct cgraph_node *)data, NULL,
NULL, vnode, NULL, vnode,
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
}
} }
return false; return false;
......
...@@ -600,15 +600,15 @@ maybe_fold_reference (tree expr, bool is_lhs) ...@@ -600,15 +600,15 @@ maybe_fold_reference (tree expr, bool is_lhs)
} }
/* Canonicalize MEM_REFs invariant address operand. */ /* Canonicalize MEM_REFs invariant address operand. */
else if (TREE_CODE (*t) == MEM_REF else if (TREE_CODE (*t) == MEM_REF
&& TREE_CODE (TREE_OPERAND (*t, 0)) == ADDR_EXPR && !is_gimple_mem_ref_addr (TREE_OPERAND (*t, 0)))
&& !DECL_P (TREE_OPERAND (TREE_OPERAND (*t, 0), 0))
&& !CONSTANT_CLASS_P (TREE_OPERAND (TREE_OPERAND (*t, 0), 0)))
{ {
bool volatile_p = TREE_THIS_VOLATILE (*t);
tree tem = fold_binary (MEM_REF, TREE_TYPE (*t), tree tem = fold_binary (MEM_REF, TREE_TYPE (*t),
TREE_OPERAND (*t, 0), TREE_OPERAND (*t, 0),
TREE_OPERAND (*t, 1)); TREE_OPERAND (*t, 1));
if (tem) if (tem)
{ {
TREE_THIS_VOLATILE (tem) = volatile_p;
*t = tem; *t = tem;
tem = maybe_fold_reference (expr, is_lhs); tem = maybe_fold_reference (expr, is_lhs);
if (tem) if (tem)
......
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