diff options
Diffstat (limited to 'toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106770.patch')
-rw-r--r-- | toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106770.patch | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106770.patch b/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106770.patch new file mode 100644 index 0000000000..82ae3a1327 --- /dev/null +++ b/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106770.patch @@ -0,0 +1,138 @@ +2011-07-11 Revital Eres <revital.eres@linaro.org> + + Backport from mainline -r175090. + gcc/ + * ddg.c (add_intra_loop_mem_dep): New function. + (build_intra_loop_deps): Call it. + + gcc/testsuite + * gcc.dg/sms-9.c: New file. + +=== modified file 'gcc/ddg.c' +--- old/gcc/ddg.c 2011-05-13 16:03:40 +0000 ++++ new/gcc/ddg.c 2011-07-04 11:00:06 +0000 +@@ -390,6 +390,33 @@ + &PATTERN (insn2)); + } + ++/* Given two nodes, analyze their RTL insns and add intra-loop mem deps ++ to ddg G. */ ++static void ++add_intra_loop_mem_dep (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to) ++{ ++ ++ if ((from->cuid == to->cuid) ++ || !insns_may_alias_p (from->insn, to->insn)) ++ /* Do not create edge if memory references have disjoint alias sets ++ or 'to' and 'from' are the same instruction. */ ++ return; ++ ++ if (mem_write_insn_p (from->insn)) ++ { ++ if (mem_read_insn_p (to->insn)) ++ create_ddg_dep_no_link (g, from, to, ++ DEBUG_INSN_P (to->insn) ++ ? ANTI_DEP : TRUE_DEP, MEM_DEP, 0); ++ else ++ create_ddg_dep_no_link (g, from, to, ++ DEBUG_INSN_P (to->insn) ++ ? ANTI_DEP : OUTPUT_DEP, MEM_DEP, 0); ++ } ++ else if (!mem_read_insn_p (to->insn)) ++ create_ddg_dep_no_link (g, from, to, ANTI_DEP, MEM_DEP, 0); ++} ++ + /* Given two nodes, analyze their RTL insns and add inter-loop mem deps + to ddg G. */ + static void +@@ -477,10 +504,22 @@ + if (DEBUG_INSN_P (j_node->insn)) + continue; + if (mem_access_insn_p (j_node->insn)) +- /* Don't bother calculating inter-loop dep if an intra-loop dep +- already exists. */ ++ { ++ /* Don't bother calculating inter-loop dep if an intra-loop dep ++ already exists. */ + if (! TEST_BIT (dest_node->successors, j)) + add_inter_loop_mem_dep (g, dest_node, j_node); ++ /* If -fmodulo-sched-allow-regmoves ++ is set certain anti-dep edges are not created. ++ It might be that these anti-dep edges are on the ++ path from one memory instruction to another such that ++ removing these edges could cause a violation of the ++ memory dependencies. Thus we add intra edges between ++ every two memory instructions in this case. */ ++ if (flag_modulo_sched_allow_regmoves ++ && !TEST_BIT (dest_node->predecessors, j)) ++ add_intra_loop_mem_dep (g, j_node, dest_node); ++ } + } + } + } + +=== added file 'gcc/testsuite/gcc.dg/sms-9.c' +--- old/gcc/testsuite/gcc.dg/sms-9.c 1970-01-01 00:00:00 +0000 ++++ new/gcc/testsuite/gcc.dg/sms-9.c 2011-07-04 11:00:06 +0000 +@@ -0,0 +1,60 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fmodulo-sched -fno-auto-inc-dec -O2 -fmodulo-sched-allow-regmoves" } */ ++ ++#include <stdlib.h> ++#include <stdarg.h> ++ ++struct df_ref_info ++{ ++ unsigned int *begin; ++ unsigned int *count; ++}; ++ ++extern void *memset (void *s, int c, __SIZE_TYPE__ n); ++ ++ ++__attribute__ ((noinline)) ++ int ++ df_reorganize_refs_by_reg_by_insn (struct df_ref_info *ref_info, ++ int num, unsigned int start) ++{ ++ unsigned int m = num; ++ unsigned int offset = 77; ++ unsigned int r; ++ ++ for (r = start; r < m; r++) ++ { ++ ref_info->begin[r] = offset; ++ offset += ref_info->count[r]; ++ ref_info->count[r] = 0; ++ } ++ ++ return offset; ++} ++ ++int ++main () ++{ ++ struct df_ref_info temp; ++ int num = 100; ++ unsigned int start = 5; ++ int i, offset; ++ ++ temp.begin = malloc (100 * sizeof (unsigned int)); ++ temp.count = malloc (100 * sizeof (unsigned int)); ++ ++ memset (temp.begin, 0, sizeof (unsigned int) * num); ++ memset (temp.count, 0, sizeof (unsigned int) * num); ++ ++ for (i = 0; i < num; i++) ++ temp.count[i] = i + 1; ++ ++ offset = df_reorganize_refs_by_reg_by_insn (&temp, num, start); ++ ++ if (offset != 5112) ++ abort (); ++ ++ free (temp.begin); ++ free (temp.count); ++ return 0; ++} + |