https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88140
--- Comment #1 from Jan Hubicka <hubicka at gcc dot gnu.org> --- Ok, we die testing: 3199 if (!useless_type_conversion_p (TREE_TYPE (expr), 3200 TREE_TYPE (TREE_OPERAND (expr, 1)))) where expr is: <component_ref 0x7ffff7231a80 type <array_type 0x7ffff72333f0 type <pointer_type 0x7ffff72330a8 type <record_type 0x7ffff720fdc8 a> public unsigned DI size <integer_cst 0x7ffff70e7c90 constant 64> unit-size <integer_cst 0x7ffff70e7ca8 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff7233150> BLK size <integer_cst 0x7ffff70e7d08 constant 0> unit-size <integer_cst 0x7ffff70e7cc0 constant 0> align:64 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality domain <integer_type 0x7ffff72331f8 type <integer_type 0x7ffff7100000 sizetype> DI size <integer_cst 0x7ffff70e7c90 64> unit-size <integer_cst 0x7ffff70e7ca8 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff72331f8 precision:64 min <integer_cst 0x7ffff70e7cc0 0>>> arg:0 <mem_ref 0x7ffff7211898 type <record_type 0x7ffff7233498 c type_0 BLK size <integer_cst 0x7ffff70e7d08 0> unit-size <integer_cst 0x7ffff70e7cc0 0> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff7233000 fields <field_decl 0x7ffff710f428 b> context <translation_unit_decl 0x7ffff70f4c30 ice.i> pointer_to_this <pointer_type 0x7ffff7233690>> arg:0 <ssa_name 0x7ffff70f1cf0 type <pointer_type 0x7ffff7233690> def_stmt _1 = 0B; version:1> arg:1 <integer_cst 0x7ffff7219cc0 constant 0> ice.i:8:20 start: ice.i:8:20 finish: ice.i:8:21> arg:1 <field_decl 0x7ffff710f428 b type <array_type 0x7ffff7233b28 type <pointer_type 0x7ffff7233a80> BLK align:64 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality domain <integer_type 0x7ffff72331f8>> BLK ice.i:5:6 size <integer_cst 0x7ffff70e7d08 0> unit-size <integer_cst 0x7ffff70e7cc0 0> align:64 warn_if_not_align:0 offset_align 128 offset <integer_cst 0x7ffff70e7cc0 0> bit-offset <integer_cst 0x7ffff70e7d08 0> context <record_type 0x7ffff7233000>> ice.i:8:20 start: ice.i:8:12 finish: ice.i:8:22> now component_ref has unsimplified array type while field_decl has simplified type. useless_type_conversion now consider them as incomparable at: 174 && (!TYPE_SIZE (inner_type) 175 || TREE_CODE (TYPE_SIZE (inner_type)) != INTEGER_CST 176 || !tree_int_cst_equal (TYPE_SIZE (outer_type), 177 TYPE_SIZE (inner_type)))) here inner_type is: <array_type 0x7ffff7233b28 type <pointer_type 0x7ffff7233a80 type <record_type 0x7ffff72339d8 a type_0 VOID align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff720fd20 context <translation_unit_decl 0x7ffff70f4c30 ice.i> pointer_to_this <pointer_type 0x7ffff7233a80>> unsigned DI size <integer_cst 0x7ffff70e7c90 constant 64> unit-size <integer_cst 0x7ffff70e7ca8 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff7233150> BLK align:64 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality domain <integer_type 0x7ffff72331f8 type <integer_type 0x7ffff7100000 sizetype public unsigned DI size <integer_cst 0x7ffff70e7c90 64> unit-size <integer_cst 0x7ffff70e7ca8 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff7100000 precision:64 min <integer_cst 0x7ffff70e7cc0 0> max <integer_cst 0x7ffff70e84c0 18446744073709551615>> DI size <integer_cst 0x7ffff70e7c90 64> unit-size <integer_cst 0x7ffff70e7ca8 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff72331f8 precision:64 min <integer_cst 0x7ffff70e7cc0 0>>> while outer_type is: <array_type 0x7ffff72333f0 type <pointer_type 0x7ffff72330a8 type <record_type 0x7ffff720fdc8 a type_0 BLK size <integer_cst 0x7ffff70e7d08 constant 0> unit-size <integer_cst 0x7ffff70e7cc0 constant 0> align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff720fd20 context <translation_unit_decl 0x7ffff70f4c30 ice.i> pointer_to_this <pointer_type 0x7ffff72330a8>> public unsigned DI size <integer_cst 0x7ffff70e7c90 constant 64> unit-size <integer_cst 0x7ffff70e7ca8 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff7233150> BLK size <integer_cst 0x7ffff70e7d08 0> unit-size <integer_cst 0x7ffff70e7cc0 0> align:64 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality domain <integer_type 0x7ffff72331f8 type <integer_type 0x7ffff7100000 sizetype public unsigned DI size <integer_cst 0x7ffff70e7c90 64> unit-size <integer_cst 0x7ffff70e7ca8 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff7100000 precision:64 min <integer_cst 0x7ffff70e7cc0 0> max <integer_cst 0x7ffff70e84c0 18446744073709551615>> DI size <integer_cst 0x7ffff70e7c90 64> unit-size <integer_cst 0x7ffff70e7ca8 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff72331f8 precision:64 min <integer_cst 0x7ffff70e7cc0 0>>> so outer_type is more specified and thus I guess it is correctly not useless conversion though I do not see how operations on those arrays can diverge?