aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-ssa-sccvn.cc')
-rw-r--r--gcc/tree-ssa-sccvn.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
index e464985..0b2c10dc 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -5747,9 +5747,12 @@ visit_reference_op_load (tree lhs, tree op, gimple *stmt)
{
/* Avoid the type punning in case the result mode has padding where
the op we lookup has not. */
- if (maybe_lt (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (result))),
- GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (op)))))
+ if (TYPE_MODE (TREE_TYPE (result)) != BLKmode
+ && maybe_lt (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (result))),
+ GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (op)))))
result = NULL_TREE;
+ else if (CONSTANT_CLASS_P (result))
+ result = const_unop (VIEW_CONVERT_EXPR, TREE_TYPE (op), result);
else
{
/* We will be setting the value number of lhs to the value number
@@ -7688,7 +7691,11 @@ rpo_elim::eliminate_avail (basic_block bb, tree op)
{
if (SSA_NAME_IS_DEFAULT_DEF (valnum))
return valnum;
- vn_avail *av = VN_INFO (valnum)->avail;
+ vn_ssa_aux_t valnum_info = VN_INFO (valnum);
+ /* See above. */
+ if (!valnum_info->visited)
+ return valnum;
+ vn_avail *av = valnum_info->avail;
if (!av)
return NULL_TREE;
if (av->location == bb->index)