aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-11-22 13:18:48 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-11-22 13:18:48 +0000
commite9615971330ecdb83b191135075c44a6ee01d091 (patch)
tree9955bf63053ef899a56cecced5b989e2239a8063 /gcc
parent993466f3d18992422941c1a57b53cff04acffce6 (diff)
downloadgcc-e9615971330ecdb83b191135075c44a6ee01d091.zip
gcc-e9615971330ecdb83b191135075c44a6ee01d091.tar.gz
gcc-e9615971330ecdb83b191135075c44a6ee01d091.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraphbuild.c29
-rw-r--r--gcc/gimple-fold.c6
3 files changed, 23 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4cdd481..87f56b7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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.
2010-11-22 Alexander Monakov <amonakov@ispras.ru>
diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c
index f9d70db..d8d196f 100644
--- a/gcc/cgraphbuild.c
+++ b/gcc/cgraphbuild.c
@@ -237,6 +237,7 @@ static bool
mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr,
void *data ATTRIBUTE_UNUSED)
{
+ addr = get_base_address (addr);
if (TREE_CODE (addr) == FUNCTION_DECL)
{
struct cgraph_node *node = cgraph_node (addr);
@@ -245,24 +246,20 @@ mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr,
node, NULL,
IPA_REF_ADDR, stmt);
}
- else
+ else if (addr && TREE_CODE (addr) == VAR_DECL
+ && (TREE_STATIC (addr) || DECL_EXTERNAL (addr)))
{
- addr = get_base_address (addr);
- if (addr && TREE_CODE (addr) == VAR_DECL
- && (TREE_STATIC (addr) || DECL_EXTERNAL (addr)))
- {
- struct varpool_node *vnode = varpool_node (addr);
- int walk_subtrees;
+ struct varpool_node *vnode = varpool_node (addr);
+ int walk_subtrees;
- if (lang_hooks.callgraph.analyze_expr)
- lang_hooks.callgraph.analyze_expr (&addr, &walk_subtrees);
- varpool_mark_needed_node (vnode);
- if (vnode->alias && vnode->extra_name)
- vnode = vnode->extra_name;
- ipa_record_reference ((struct cgraph_node *)data, NULL,
- NULL, vnode,
- IPA_REF_ADDR, stmt);
- }
+ if (lang_hooks.callgraph.analyze_expr)
+ lang_hooks.callgraph.analyze_expr (&addr, &walk_subtrees);
+ varpool_mark_needed_node (vnode);
+ if (vnode->alias && vnode->extra_name)
+ vnode = vnode->extra_name;
+ ipa_record_reference ((struct cgraph_node *)data, NULL,
+ NULL, vnode,
+ IPA_REF_ADDR, stmt);
}
return false;
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index e561a63..8d0157b 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -600,15 +600,15 @@ maybe_fold_reference (tree expr, bool is_lhs)
}
/* Canonicalize MEM_REFs invariant address operand. */
else if (TREE_CODE (*t) == MEM_REF
- && TREE_CODE (TREE_OPERAND (*t, 0)) == ADDR_EXPR
- && !DECL_P (TREE_OPERAND (TREE_OPERAND (*t, 0), 0))
- && !CONSTANT_CLASS_P (TREE_OPERAND (TREE_OPERAND (*t, 0), 0)))
+ && !is_gimple_mem_ref_addr (TREE_OPERAND (*t, 0)))
{
+ bool volatile_p = TREE_THIS_VOLATILE (*t);
tree tem = fold_binary (MEM_REF, TREE_TYPE (*t),
TREE_OPERAND (*t, 0),
TREE_OPERAND (*t, 1));
if (tem)
{
+ TREE_THIS_VOLATILE (tem) = volatile_p;
*t = tem;
tem = maybe_fold_reference (expr, is_lhs);
if (tem)