summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0109-PR-rtl-optimization-48549.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0109-PR-rtl-optimization-48549.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0109-PR-rtl-optimization-48549.patch128
1 files changed, 128 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0109-PR-rtl-optimization-48549.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0109-PR-rtl-optimization-48549.patch
new file mode 100644
index 000000000..9a30fdbe3
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0109-PR-rtl-optimization-48549.patch
@@ -0,0 +1,128 @@
+From 5b05a527f1368e4ca9f71a8ec8124a2c64661007 Mon Sep 17 00:00:00 2001
+From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 12 Apr 2011 13:44:33 +0000
+Subject: [PATCH 109/200] PR rtl-optimization/48549
+ * combine.c (propagate_for_debug): Also stop after BB_END of
+ this_basic_block. Process LAST and just stop processing after it.
+ (combine_instructions): If last_combined_insn has been deleted,
+ set last_combined_insn to its PREV_INSN.
+
+ * g++.dg/opt/pr48549.C: New test.
+
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172319 138bc75d-0d04-0410-961f-82ee72b054a4
+
+index 5f179c6..d563999 100644
+--- a/gcc/combine.c
++++ b/gcc/combine.c
+@@ -1178,8 +1178,13 @@ combine_instructions (rtx f, unsigned int nregs)
+ next = 0;
+ if (NONDEBUG_INSN_P (insn))
+ {
++ while (last_combined_insn
++ && INSN_DELETED_P (last_combined_insn))
++ last_combined_insn = PREV_INSN (last_combined_insn);
+ if (last_combined_insn == NULL_RTX
+- || DF_INSN_LUID (last_combined_insn) < DF_INSN_LUID (insn))
++ || BARRIER_P (last_combined_insn)
++ || BLOCK_FOR_INSN (last_combined_insn) != this_basic_block
++ || DF_INSN_LUID (last_combined_insn) <= DF_INSN_LUID (insn))
+ last_combined_insn = insn;
+
+ /* See if we know about function return values before this
+@@ -2435,19 +2440,21 @@ propagate_for_debug_subst (rtx from, const_rtx old_rtx, void *data)
+ }
+
+ /* Replace all the occurrences of DEST with SRC in DEBUG_INSNs between INSN
+- and LAST. */
++ and LAST, not including INSN, but including LAST. Also stop at the end
++ of THIS_BASIC_BLOCK. */
+
+ static void
+ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src)
+ {
+- rtx next, loc;
++ rtx next, loc, end = NEXT_INSN (BB_END (this_basic_block));
+
+ struct rtx_subst_pair p;
+ p.to = src;
+ p.adjusted = false;
+
+ next = NEXT_INSN (insn);
+- while (next != last)
++ last = NEXT_INSN (last);
++ while (next != last && next != end)
+ {
+ insn = next;
+ next = NEXT_INSN (insn);
+new file mode 100644
+index 0000000..30799ee
+--- /dev/null
++++ b/gcc/testsuite/g++.dg/opt/pr48549.C
+@@ -0,0 +1,63 @@
++// PR rtl-optimization/48549
++// { dg-do compile }
++// { dg-options "-fcompare-debug -O2" }
++
++void
++foo (void *from, void *to)
++{
++ long offset = reinterpret_cast <long>(to) - reinterpret_cast <long>(from);
++ if (offset != static_cast <int>(offset))
++ *(int *) 0xC0DE = 0;
++ reinterpret_cast <int *>(from)[1] = offset;
++}
++struct A
++{
++ A () : a () {}
++ A (void *x) : a (x) {}
++ void *bar () { return a; }
++ void *a;
++};
++struct C;
++struct D;
++struct E : public A
++{
++ C m1 (int);
++ D m2 ();
++ E () {}
++ E (A x) : A (x) {}
++};
++struct C : public E
++{
++ C () {}
++ C (void *x) : E (x) {}
++};
++struct D : public E
++{
++ D (void *x) : E (x) {}
++};
++C
++E::m1 (int x)
++{
++ return (reinterpret_cast <char *>(bar ()) + x);
++}
++D
++E::m2 ()
++{
++ return reinterpret_cast <char *>(bar ());
++}
++struct B
++{
++ E a;
++ unsigned b : 16;
++ unsigned c : 1;
++};
++void
++baz (B *x)
++{
++ for (unsigned i = 0; i < 64; i++)
++ {
++ D d = x[i].a.m2 ();
++ C c = x[i].a.m1 (x[i].c);
++ foo (d.bar (), c.bar ());
++ }
++}
+--
+1.7.0.4
+