https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111591
--- Comment #24 from Kewen Lin <linkw at gcc dot gnu.org> --- (In reply to Richard Biener from comment #22) > I see the mems properly get their base adjusted: > > (insn 384 383 0 (set (mem/c:V2DI (plus:DI (reg/f:DI 112 virtual-stack-vars) > (const_int 16 [0x10])) [7 MEM[(struct Vec128D.30433 *)_10]+0 > S16 A128]) > (reg:V2DI 616)) -1 > (nil)) > > vs. > > (insn 389 388 390 (set (reg:HI 619) > (mem/c:HI (plus:DI (reg/f:DI 112 virtual-stack-vars) > (const_int 16 [0x10])) [4 MEM[(struct Vec128D.30212 > *)_10].rawD.30221[0]+0 S2 A128])) "test.cc":218:14 -1 > (nil)) > > both are based off a fake _10. But we get alias sets 7 and 4 used here > which might be a problem. > > See update_alias_info_with_stack_vars and uses of decls_to_pointers, > in particular from set_mem_attributes_minus_bitpos where we preserve > TBAA info with the rewrite. I'm not sure why that should be OK ... > (but I'm sure I must have thought of this problem back in time) > > Does the following fix the testcase? > > diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc > index 84b6833225e..81c0a63eddc 100644 > --- a/gcc/emit-rtl.cc > +++ b/gcc/emit-rtl.cc > @@ -2128,7 +2128,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int > objectp, > tree *orig_base = &attrs.expr; > while (handled_component_p (*orig_base)) > orig_base = &TREE_OPERAND (*orig_base, 0); > - tree aptrt = reference_alias_ptr_type (*orig_base); > + tree aptrt = ptr_type_node; > *orig_base = build2 (MEM_REF, TREE_TYPE (*orig_base), *namep, > build_int_cst (aptrt, 0)); > } Sorry, this doesn't help. I noticed that it makes insns 384 and 389 become to: (insn 384 383 0 (set (mem/c:V2DI (plus:DI (reg/f:DI 112 virtual-stack-vars) (const_int 16 [0x10])) [7 MEM <struct Vec128D.30433> [(voidD.48 *)_10]+0 S16 A128]) (reg:V2DI 616)) -1 (nil)) (insn 389 388 390 (set (reg:HI 619) (mem/c:HI (plus:DI (reg/f:DI 112 virtual-stack-vars) (const_int 16 [0x10])) [4 MEM <struct Vec128D.30212> [(voidD.48 *)_10].rawD.30221[0]+0 S2 A128])) "test.cc":218:14 -1 (nil)) alias sets are not changed. Aggressively further hacking with attrs.alias = 0 can make it pass. Can we make an new alias set for each partition? then all involved decls in the same partition is aliased. For a particular involved decl, it's aliased to the previous ones and the new ones in its own partitions.