diff options
Diffstat (limited to 'gcc/tree-ssa-sccvn.cc')
-rw-r--r-- | gcc/tree-ssa-sccvn.cc | 13 |
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) |