+2015-10-11 Jan Hubicka <hubicka@ucw.cz>
+
+ PR middle-end/67966
+ * tree.c (verify_type): Verify that TYPE_MODE match
+ between TYPE_CANONICAL and type.
+ * expr.c (store_expr_with_bounds): Revert my previous change.
+ * expmed.c (store_bit_field_1): Revert prevoius change.
+ * gimple-expr.c (useless_type_conversion_p): Require TYPE_MODE
+ to match for all types.
+
2015-10-21 Nathan Sidwell <nathan@codesourcery.com>
* omp-low.c (check_omp_nesting_restrictions): Check OpenACC loop
}
}
- /* We allow move between structures of same size but different mode.
- If source is in memory and the mode differs, simply change the memory. */
- if (GET_MODE (value) == BLKmode && GET_MODE (op0) != BLKmode)
- {
- gcc_assert (MEM_P (value));
- value = adjust_address_nv (value, GET_MODE (op0), 0);
- }
-
/* Storing an lsb-aligned field in a register
can be done with a movstrict instruction. */
temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
- /* We allow move between structures of same size but different mode.
- If source is in memory and the mode differs, simply change the memory. */
- if (GET_MODE (temp) == BLKmode && GET_MODE (target) != BLKmode)
- {
- gcc_assert (MEM_P (temp));
- temp = adjust_address_nv (temp, GET_MODE (target), 0);
- }
-
/* If value was not generated in the target, store it there.
Convert the value to TARGET's type first if necessary and emit the
pending incrementations that have been queued when expanding EXP.
if (inner_type == outer_type)
return true;
- /* Changes in machine mode are never useless conversions unless we
- deal with aggregate types in which case we defer to later checks. */
- if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type)
- && !AGGREGATE_TYPE_P (inner_type))
+ /* Changes in machine mode are never useless conversions unless. */
+ if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type))
return false;
/* If both the inner and outer types are integral types, then the
use the types in move operations. */
else if (AGGREGATE_TYPE_P (inner_type)
&& TREE_CODE (inner_type) == TREE_CODE (outer_type))
- return (!TYPE_SIZE (outer_type)
- || (TYPE_SIZE (inner_type)
- && operand_equal_p (TYPE_SIZE (inner_type),
- TYPE_SIZE (outer_type), 0)));
+ return (TYPE_MODE (outer_type) != BLKmode
+ || operand_equal_p (TYPE_SIZE (inner_type),
+ TYPE_SIZE (outer_type), 0));
else if (TREE_CODE (inner_type) == OFFSET_TYPE
&& TREE_CODE (outer_type) == OFFSET_TYPE)
error_found = true;
}
+ if (COMPLETE_TYPE_P (t) && TYPE_CANONICAL (t)
+ && TYPE_MODE (t) != TYPE_MODE (TYPE_CANONICAL (t)))
+ {
+ error ("TYPE_MODE of TYPE_CANONICAL is not compatible");
+ debug_tree (ct);
+ error_found = true;
+ }
+
/* Check various uses of TYPE_MINVAL. */
if (RECORD_OR_UNION_TYPE_P (t))