summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-ssa-address.c21
-rw-r--r--gcc/tree-ssa-loop-im.c23
-rw-r--r--gcc/tree.h1
4 files changed, 21 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 35c062c5979..020892bdf39 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-10-01 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree.h (copy_mem_ref_info): Delete.
+ * tree-ssa-address.c (copy_mem_ref_info): Likewise.
+ (maybe_fold_tmr): Copy flags manually.
+ * tree-ssa-loop-im.c (simple_mem_ref_in_stmt): Rewrite.
+
2012-10-01 Marc Glisse <marc.glisse@inria.fr>
* simplify-rtx.c (simplify_binary_operation_1) <VEC_SELECT>:
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
index caa51be6a5d..c5b8ff1056b 100644
--- a/gcc/tree-ssa-address.c
+++ b/gcc/tree-ssa-address.c
@@ -821,16 +821,6 @@ get_address_description (tree op, struct mem_address *addr)
addr->offset = TMR_OFFSET (op);
}
-/* Copies the additional information attached to target_mem_ref FROM to TO. */
-
-void
-copy_mem_ref_info (tree to, tree from)
-{
- /* And the info about the original reference. */
- TREE_SIDE_EFFECTS (to) = TREE_SIDE_EFFECTS (from);
- TREE_THIS_VOLATILE (to) = TREE_THIS_VOLATILE (from);
-}
-
/* Copies the reference information from OLD_REF to NEW_REF, where
NEW_REF should be either a MEM_REF or a TARGET_MEM_REF. */
@@ -901,7 +891,7 @@ maybe_fold_tmr (tree ref)
{
struct mem_address addr;
bool changed = false;
- tree ret, off;
+ tree new_ref, off;
get_address_description (ref, &addr);
@@ -962,10 +952,11 @@ maybe_fold_tmr (tree ref)
ended up folding it, always create a new TARGET_MEM_REF regardless
if it is valid in this for on the target - the propagation result
wouldn't be anyway. */
- ret = create_mem_ref_raw (TREE_TYPE (ref),
- TREE_TYPE (addr.offset), &addr, false);
- copy_mem_ref_info (ret, ref);
- return ret;
+ new_ref = create_mem_ref_raw (TREE_TYPE (ref),
+ TREE_TYPE (addr.offset), &addr, false);
+ TREE_SIDE_EFFECTS (new_ref) = TREE_SIDE_EFFECTS (ref);
+ TREE_THIS_VOLATILE (new_ref) = TREE_THIS_VOLATILE (ref);
+ return new_ref;
}
/* Dump PARTS to FILE. */
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index e76e64398ea..ac5353905df 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -638,29 +638,22 @@ outermost_indep_loop (struct loop *outer, struct loop *loop, mem_ref_p ref)
static tree *
simple_mem_ref_in_stmt (gimple stmt, bool *is_store)
{
- tree *lhs;
- enum tree_code code;
+ tree *lhs, *rhs;
- /* Recognize MEM = (SSA_NAME | invariant) and SSA_NAME = MEM patterns. */
- if (gimple_code (stmt) != GIMPLE_ASSIGN)
+ /* Recognize SSA_NAME = MEM and MEM = (SSA_NAME | invariant) patterns. */
+ if (!gimple_assign_single_p (stmt))
return NULL;
- code = gimple_assign_rhs_code (stmt);
-
lhs = gimple_assign_lhs_ptr (stmt);
+ rhs = gimple_assign_rhs1_ptr (stmt);
- if (TREE_CODE (*lhs) == SSA_NAME)
+ if (TREE_CODE (*lhs) == SSA_NAME && gimple_vuse (stmt))
{
- if (get_gimple_rhs_class (code) != GIMPLE_SINGLE_RHS
- || !is_gimple_addressable (gimple_assign_rhs1 (stmt)))
- return NULL;
-
*is_store = false;
- return gimple_assign_rhs1_ptr (stmt);
+ return rhs;
}
- else if (code == SSA_NAME
- || (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS
- && is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
+ else if (gimple_vdef (stmt)
+ && (TREE_CODE (*rhs) == SSA_NAME || is_gimple_min_invariant (*rhs)))
{
*is_store = true;
return lhs;
diff --git a/gcc/tree.h b/gcc/tree.h
index 0130ce464ee..1217cc008de 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -6266,7 +6266,6 @@ tree target_for_debug_bind (tree);
/* In tree-ssa-address.c. */
extern tree tree_mem_ref_addr (tree, tree);
-extern void copy_mem_ref_info (tree, tree);
extern void copy_ref_info (tree, tree);
/* In tree-vrp.c */