aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-01-15 16:47:36 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-01-15 16:47:36 +0000
commit0e80383ffb72168e9609e2be58649ff641150677 (patch)
tree7eb4f52fdc63295571a2791013191373cd326269 /gcc
parent207b59560f7c136462aec8df61bb36fd0191eaab (diff)
downloadgcc-0e80383ffb72168e9609e2be58649ff641150677.zip
gcc-0e80383ffb72168e9609e2be58649ff641150677.tar.gz
gcc-0e80383ffb72168e9609e2be58649ff641150677.tar.bz2
PR rtl-optimization/pr55153
2013-01-15 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/pr55153 * sched-deps.c (sched_analyze_2): Add pending reads for prefetch. 2013-01-15 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/pr55153 * gcc.dg/pr55153.c: New. From-SVN: r195211
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/sched-deps.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr55153.c11
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15b1503..75efa7a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-15 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/pr55153
+ * sched-deps.c (sched_analyze_2): Add pending reads for prefetch.
+
2013-01-15 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/55920
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index f61e837..3f37aa0 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -2707,6 +2707,20 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, rtx insn)
case PREFETCH:
if (PREFETCH_SCHEDULE_BARRIER_P (x))
reg_pending_barrier = TRUE_BARRIER;
+ /* Prefetch insn contains addresses only. So if the prefetch
+ address has no registers, there will be no dependencies on
+ the prefetch insn. This is wrong with result code
+ correctness point of view as such prefetch can be moved below
+ a jump insn which usually generates MOVE_BARRIER preventing
+ to move insns containing registers or memories through the
+ barrier. It is also wrong with generated code performance
+ point of view as prefetch withouth dependecies will have a
+ tendency to be issued later instead of earlier. It is hard
+ to generate accurate dependencies for prefetch insns as
+ prefetch has only the start address but it is better to have
+ something than nothing. */
+ add_insn_mem_dependence (deps, true, insn,
+ gen_rtx_MEM (Pmode, XEXP (PATTERN (insn), 0)));
break;
case UNSPEC_VOLATILE:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c20ed62..340bbce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-15 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/pr55153
+ * gcc.dg/pr55153.c: New.
+
2013-01-15 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/55920
diff --git a/gcc/testsuite/gcc.dg/pr55153.c b/gcc/testsuite/gcc.dg/pr55153.c
new file mode 100644
index 0000000..86e9970
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr55153.c
@@ -0,0 +1,11 @@
+/* PR tree-optimization/55153 */
+/* { dg-do compile } */
+/* { dg-options "-O -fsched2-use-superblocks -fschedule-insns2" } */
+
+extern int a[];
+
+void
+foo (void)
+{
+ __builtin_prefetch (a, 0, 0);
+}