&& vn_get_stmt_kind (ass) == VN_REFERENCE)
{
tree last_vuse = gimple_vuse (ass);
- tree op = build3 (BIT_FIELD_REF, TREE_TYPE (rhs1),
- gimple_assign_rhs1 (ass),
- TREE_OPERAND (rhs1, 1), TREE_OPERAND (rhs1, 2));
- tree result = vn_reference_lookup (op, gimple_vuse (ass),
- default_vn_walk_kind,
- NULL, true, &last_vuse);
- if (result
- && useless_type_conversion_p (type, TREE_TYPE (result)))
- return set_ssa_val_to (lhs, result);
+ tree op = gimple_assign_rhs1 (ass);
+ /* Avoid building invalid and unexpected refs. */
+ if (TREE_CODE (op) != TARGET_MEM_REF
+ && TREE_CODE (op) != BIT_FIELD_REF
+ && TREE_CODE (op) != REALPART_EXPR
+ && TREE_CODE (op) != IMAGPART_EXPR)
+ {
+ tree op = build3 (BIT_FIELD_REF, TREE_TYPE (rhs1),
+ gimple_assign_rhs1 (ass),
+ TREE_OPERAND (rhs1, 1),
+ TREE_OPERAND (rhs1, 2));
+ tree result = vn_reference_lookup (op, gimple_vuse (ass),
+ default_vn_walk_kind,
+ NULL, true, &last_vuse);
+ if (result
+ && useless_type_conversion_p (type, TREE_TYPE (result)))
+ return set_ssa_val_to (lhs, result);
+ }
}
}
break;