Another case where one address space may support multiple pointer sizes, so conversions between such must be preserved.
* tree-ssa.c (useless_type_conversion_p): Conversions between different-sized pointers aren't useless. Index: tree-ssa.c =================================================================== --- tree-ssa.c (revision 183139) +++ tree-ssa.c (working copy) @@ -1192,12 +1192,17 @@ bool useless_type_conversion_p (tree outer_type, tree inner_type) { /* Do the following before stripping toplevel qualifiers. */ if (POINTER_TYPE_P (inner_type) && POINTER_TYPE_P (outer_type)) { + /* Do not lose casts between pointers of different precision. */ + if (TYPE_PRECISION (outer_type) + != TYPE_PRECISION (inner_type)) + return false; + /* Do not lose casts between pointers to different address spaces. */ if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type)) != TYPE_ADDR_SPACE (TREE_TYPE (inner_type))) return false; /* If the outer type is (void *), the conversion is not necessary. */