Submitted by Bingfeng Mei on Sept. 22, 2011, 12:20 p.m.

Message ID | 7FB04A5C213E9943A72EE127DB74F0ADD15FD2F4A6@SJEXCHCCR02.corp.ad.broadcom.com |
---|---|

State | New |

Headers | show |

Index: alias.c =================================================================== --- alias.c (revision 178972) +++ alias.c (working copy) @@ -155,6 +155,7 @@ static int base_alias_check (rtx, rtx, e enum machine_mode); static rtx find_base_value (rtx); static int mems_in_disjoint_alias_sets_p (const_rtx, const_rtx); +static int mems_in_disjoint_address_spaces_p (const_rtx, const_rtx); static int insert_subset_children (splay_tree_node, void*); static alias_set_entry get_alias_set_entry (alias_set_type); static const_rtx fixed_scalar_and_varying_struct_p (const_rtx, const_rtx, rtx, rtx, @@ -400,6 +401,17 @@ mems_in_disjoint_alias_sets_p (const_rtx return ! alias_sets_conflict_p (MEM_ALIAS_SET (mem1), MEM_ALIAS_SET (mem2)); } +/* Return nonzero if the address spaces for MEM1 and MEM2 are disjoint */ +static inline int +mems_in_disjoint_address_spaces_p (const_rtx mem1, const_rtx mem2) +{ + + return (!targetm.addr_space.subset_p (MEM_ADDR_SPACE (mem1), + MEM_ADDR_SPACE (mem2)) + && !targetm.addr_space.subset_p (MEM_ADDR_SPACE (mem2), + MEM_ADDR_SPACE (mem1))); +} + /* Insert the NODE into the splay tree given by DATA. Used by record_alias_subset via splay_tree_foreach. */ @@ -2306,11 +2318,11 @@ nonoverlapping_memrefs_p (const_rtx x, c return 1; /* If we have MEMs refering to different address spaces (which can - potentially overlap), we cannot easily tell from the addresses - whether the references overlap. */ + potentially overlap), they are not aliased if neither is subset + of the other one. */ if (MEM_P (rtlx) && MEM_P (rtly) && MEM_ADDR_SPACE (rtlx) != MEM_ADDR_SPACE (rtly)) - return 0; + return mems_in_disjoint_address_spaces_p (rtlx, rtly); /* Get the base and offsets of both decls. If either is a register, we know both are and are the same, so use that as the base. The only @@ -2417,10 +2429,10 @@ true_dependence_1 (const_rtx mem, enum m return 0; /* If we have MEMs refering to different address spaces (which can - potentially overlap), we cannot easily tell from the addresses - whether the references overlap. */ + potentially overlap), they are not aliased if neither is subset + of the other one. */ if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) - return 1; + return (!mems_in_disjoint_address_spaces_p (mem, x)); if (! mem_addr) { @@ -2542,10 +2554,10 @@ write_dependence_p (const_rtx mem, const return 0; /* If we have MEMs refering to different address spaces (which can - potentially overlap), we cannot easily tell from the addresses - whether the references overlap. */ + potentially overlap), they are not aliased if neither is subset + of the other one. */ if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) - return 1; + return (!mems_in_disjoint_address_spaces_p (mem, x)); x_addr = XEXP (x, 0); mem_addr = XEXP (mem, 0); @@ -2637,10 +2649,10 @@ may_alias_p (const_rtx mem, const_rtx x) return 0; /* If we have MEMs refering to different address spaces (which can - potentially overlap), we cannot easily tell from the addresses - whether the references overlap. */ + potentially overlap), they are not aliased if neither is subset + of the other one. */ if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) - return 1; + return (!mems_in_disjoint_address_spaces_p (mem, x)); x_addr = XEXP (x, 0); mem_addr = XEXP (mem, 0);