http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43808
--- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-11-08 15:32:03 UTC --- (In reply to comment #6) > Indeed, for > x: > (mem/s:DI (reg/f:DI 117 [ D.1692 ]) [6 MEM[(struct a[2] *)D.1692_63]+0 S8 > A64]) > mem: > (mem/s/f/c:DI (plus:DI (reg/f:DI 20 frame) > (const_int -384 [0xfffffffffffffe80])) [3 D.1548.i.data+0 S8 A64]) > rtx_refs_may_alias_p (x, mem, 0) > returns 0. > indirect_ref_may_alias_decl_p is called with base1 the MEM_REF and base2 > VAR_DECL D.1548. > > And the problem is that may_be_aliased is false for D.1548. Sure, it doesn't > have address taken. But as expansion decided to share its slot together with > other variables and those are may_be_aliased, this of course breaks. > > I wonder whether expansion shouldn't somehow make sure that if at least one > var > in the partition is may_be_aliased, all of them are. Be it by not merging > vars > that have different may_be_aliased, or by say marking the non-addressable vars > TREE_ADDRESSABLE if anything in the partition is addressable. > > Richard? We do this already, see cfgexpand.c:add_partitioned_vars_to_ptset and update_alias_info_with_stack_vars and alias.c:ao_ref_from_mem: /* If this is a reference based on a partitioned decl replace the base with an INDIRECT_REF of the pointer representative we created during stack slot partitioning. */ if (TREE_CODE (base) == VAR_DECL && ! TREE_STATIC (base) && cfun->gimple_df->decls_to_pointers != NULL) { void *namep; namep = pointer_map_contains (cfun->gimple_df->decls_to_pointers, base); if (namep) ref->base = build_simple_mem_ref (*(tree *)namep); } and we try to handle this particular case in update_alias_info_with_stack_vars: /* Make all points-to sets that contain one member of a partition contain all members of the partition. */ if (decls_to_partitions) { unsigned i; struct pointer_set_t *visited = pointer_set_create (); bitmap temp = BITMAP_ALLOC (NULL); for (i = 1; i < num_ssa_names; i++) { ... So you say that for some reason this doesn't work.