Currently if the ssa info (range or aliasing) is different
between the src and dest of a copy, sccopy will reject it.
This fixes the FIXME and handles it in a similar way as copyprop
handles it. This is needed to able to move sccopy earlier (before phiopt1)
and to act like a copyprop pass.
Bootstrapped and tested on x86_64-linux-gnu with no regressions.
gcc/ChangeLog:
* gimple-ssa-sccopy.cc (stmt_may_generate_copy): Remove restriction
on the ssa info being different for the "copy".
(scc_copy_prop::replace_scc_by_value): Call
maybe_duplicate_ssa_info_at_copy
when copyproping a ssa name.
Signed-off-by: Andrew Pinski <[email protected]>
---
gcc/gimple-ssa-sccopy.cc | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/gcc/gimple-ssa-sccopy.cc b/gcc/gimple-ssa-sccopy.cc
index 0badfb11b93..4252e5295df 100644
--- a/gcc/gimple-ssa-sccopy.cc
+++ b/gcc/gimple-ssa-sccopy.cc
@@ -405,22 +405,6 @@ stmt_may_generate_copy (gimple *stmt)
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs))
return false;
- /* It is possible that lhs has more alignment or value range information. By
- propagating we would lose this information. So in the case that alignment
- or value range information differs, we are conservative and do not
- propagate.
-
- FIXME: Propagate alignment and value range info the same way copy-prop
- does. */
- if (POINTER_TYPE_P (TREE_TYPE (lhs))
- && POINTER_TYPE_P (TREE_TYPE (rhs))
- && SSA_NAME_PTR_INFO (lhs) != SSA_NAME_PTR_INFO (rhs))
- return false;
- if (!POINTER_TYPE_P (TREE_TYPE (lhs))
- && !POINTER_TYPE_P (TREE_TYPE (rhs))
- && SSA_NAME_RANGE_INFO (lhs) != SSA_NAME_RANGE_INFO (rhs))
- return false;
-
return true; /* A statement of type _2 = _1;. */
}
@@ -497,6 +481,8 @@ scc_copy_prop::replace_scc_by_value (vec<gimple *> scc,
tree val)
}
replace_uses_by (name, val);
+ if (TREE_CODE (val) == SSA_NAME)
+ maybe_duplicate_ssa_info_at_copy (name, val);
bitmap_set_bit (dead_stmts, SSA_NAME_VERSION (name));
didsomething = true;
}
--
2.43.0