https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119474
--- Comment #9 from Andrew Stubbs <ams at gcc dot gnu.org> --- This patch fixes the -O1 failure, for *this* testcase: diff --git a/gcc/tree.cc b/gcc/tree.cc index eccfcc89da40..4bfdb7a938e7 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -7085,11 +7085,8 @@ build_pointer_type_for_mode (tree to_type, machine_mode mode, if (to_type == error_mark_node) return error_mark_node; - if (mode == VOIDmode) - { - addr_space_t as = TYPE_ADDR_SPACE (to_type); - mode = targetm.addr_space.pointer_mode (as); - } + addr_space_t as = TYPE_ADDR_SPACE (to_type); + mode = targetm.addr_space.pointer_mode (as); /* If the pointed-to type has the may_alias attribute set, force a TYPE_REF_CAN_ALIAS_ALL pointer to be generated. */ @@ -7121,6 +7118,7 @@ build_pointer_type_for_mode (tree to_type, machine_mode mode, TYPE_REF_CAN_ALIAS_ALL (t) = can_alias_all; TYPE_NEXT_PTR_TO (t) = TYPE_POINTER_TO (to_type); TYPE_POINTER_TO (to_type) = t; + TYPE_ADDR_SPACE (t) = TYPE_ADDR_SPACE (to_type); /* During LTO we do not set TYPE_CANONICAL of pointers and references. */ if (TYPE_STRUCTURAL_EQUALITY_P (to_type) || in_lto_p) This is clearly wrong though, because the address space that the pointer is *in* doesn't have to be the same as the one it *points to*, so I need a better solution. Any suggestions where to start?