diff options
author | Bingfeng Mei <bmei@broadcom.com> | 2009-01-21 11:39:19 +0000 |
---|---|---|
committer | Revital Eres <revitale@gcc.gnu.org> | 2009-01-21 11:39:19 +0000 |
commit | 71a6fe66e7292912deda846c123134d2c43d43e1 (patch) | |
tree | 9f0d4349fb3beba6fbbe170f65b83dc48644a965 /gcc | |
parent | 954a782e53528ecd7cf7dac4f68506ab74d629c2 (diff) | |
download | gcc-71a6fe66e7292912deda846c123134d2c43d43e1.zip gcc-71a6fe66e7292912deda846c123134d2c43d43e1.tar.gz gcc-71a6fe66e7292912deda846c123134d2c43d43e1.tar.bz2 |
check alias sets in add_inter_loop_mem_dep
From-SVN: r143540
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/alias.c | 37 | ||||
-rw-r--r-- | gcc/alias.h | 1 | ||||
-rw-r--r-- | gcc/ddg.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/sms-6.c | 40 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/sms-7.c | 41 |
7 files changed, 139 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aca8760..35de52a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2009-01-21 Bingfeng Mei <bmei@broadcom.com> + + * alias.c (walk_mems_1, walk_mems_2, insn_alias_sets_conflict_p): + Check whether two instructions have memory references that + belong to conflicting alias sets. walk_mems_1 and walk_mems_2 + are helper functions for traversing. + * alias.h (insn_alias_sets_confilict_p): New prototypes. + * ddg.c (add_inter_loop_mem_dep): Call insn_alias_sets_conflict_p + not to draw dependency edge for instructions with non-conflicting + alias sets. + 2009-01-20 Joseph Myers <joseph@codesourcery.com> PR other/38758 diff --git a/gcc/alias.c b/gcc/alias.c index e5133d6..18c7d87 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -344,6 +344,43 @@ alias_sets_conflict_p (alias_set_type set1, alias_set_type set2) return 0; } +static int +walk_mems_2 (rtx *x, rtx mem) +{ + if (MEM_P (*x)) + { + if (alias_sets_conflict_p (MEM_ALIAS_SET(*x), MEM_ALIAS_SET(mem))) + return 1; + + return -1; + } + return 0; +} + +static int +walk_mems_1 (rtx *x, rtx *pat) +{ + if (MEM_P (*x)) + { + /* Visit all MEMs in *PAT and check indepedence. */ + if (for_each_rtx (pat, (rtx_function) walk_mems_2, *x)) + /* Indicate that dependence was determined and stop traversal. */ + return 1; + + return -1; + } + return 0; +} + +/* Return 1 if two specified instructions have mem expr with conflict alias sets*/ +bool +insn_alias_sets_conflict_p (rtx insn1, rtx insn2) +{ + /* For each pair of MEMs in INSN1 and INSN2 check their independence. */ + return for_each_rtx (&PATTERN (insn1), (rtx_function) walk_mems_1, + &PATTERN (insn2)); +} + /* Return 1 if the two specified alias sets will always conflict. */ int diff --git a/gcc/alias.h b/gcc/alias.h index 73811d3..3492d7e 100644 --- a/gcc/alias.h +++ b/gcc/alias.h @@ -41,6 +41,7 @@ extern int alias_sets_conflict_p (alias_set_type, alias_set_type); extern int alias_sets_must_conflict_p (alias_set_type, alias_set_type); extern int objects_must_conflict_p (tree, tree); extern int nonoverlapping_memrefs_p (const_rtx, const_rtx); +extern bool insn_alias_sets_conflict_p (rtx, rtx); /* This alias set can be used to force a memory to conflict with all other memories, creating a barrier across which no memory reference @@ -345,6 +345,10 @@ build_inter_loop_deps (ddg_ptr g) static void add_inter_loop_mem_dep (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to) { + if (!insn_alias_sets_conflict_p (from->insn, to->insn)) + /* Do not create edge if memory references have disjoint alias sets. */ + return; + if (mem_write_insn_p (from->insn)) { if (mem_read_insn_p (to->insn)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8b2d31d..4bf0f2f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-21 Bingfeng Mei <bmei@broadcom.com> + + * gcc.dg/sms-6.c: New test. + * gcc.dg/sms-7.c: Likewise. + 2009-01-20 Paul Thomas <pault@gcc.gnu.org> PR fortran/38907 diff --git a/gcc/testsuite/gcc.dg/sms-6.c b/gcc/testsuite/gcc.dg/sms-6.c new file mode 100644 index 0000000..3fe8ecd --- /dev/null +++ b/gcc/testsuite/gcc.dg/sms-6.c @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fmodulo-sched " } */ + +extern void abort (void); + +void foo (int * __restrict__ a, int * __restrict__ b, int * __restrict__ c) +{ + int i; + for(i = 0; i < 100; i+=4) + { + a[i] = b[i] * c[i]; + a[i+1] = b[i+1] * c[i+1]; + a[i+2] = b[i+2] * c[i+2]; + a[i+3] = b[i+3] * c[i+3]; + } +} + + +int a[100], b[100], c[100]; +int main() +{ + int i, res; + for(i = 0; i < 100; i++) + { + b[i] = c[i] = i; + } + foo(a, b, c); + + res = 0; + for(i = 0; i < 100; i++) + { + res += a[i]; + } + if(res != 328350) + abort(); + + return 0; +} + + diff --git a/gcc/testsuite/gcc.dg/sms-7.c b/gcc/testsuite/gcc.dg/sms-7.c new file mode 100644 index 0000000..35f04a5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sms-7.c @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fmodulo-sched -fstrict-aliasing " } */ + +extern void abort (void); + +void foo (int *a, short * __restrict__ b, short * __restrict__ c) +{ + int i; + for(i = 0; i < 100; i+=4) + { + a[i] = b[i] * c[i]; + a[i+1] = b[i+1] * c[i+1]; + a[i+2] = b[i+2] * c[i+2]; + a[i+3] = b[i+3] * c[i+3]; + } +} + +int a[100]; +short b[100], c[100]; + +int main() +{ + int i, res; + for(i = 0; i < 100; i++) + { + b[i] = c[i] = i; + } + foo(a, b, c); + + res = 0; + for(i = 0; i < 100; i++) + { + res += a[i]; + } + if(res != 328350) + abort(); + + return 0; +} + + |