aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/df-scan.cc6
-rw-r--r--gcc/testsuite/gcc.dg/pr104459.c38
2 files changed, 42 insertions, 2 deletions
diff --git a/gcc/df-scan.cc b/gcc/df-scan.cc
index 5df70e9..9b2375d 100644
--- a/gcc/df-scan.cc
+++ b/gcc/df-scan.cc
@@ -1769,13 +1769,15 @@ df_insn_change_bb (rtx_insn *insn, basic_block new_bb)
if (!INSN_P (insn))
return;
- df_set_bb_dirty (new_bb);
+ if (!DEBUG_INSN_P (insn))
+ df_set_bb_dirty (new_bb);
if (old_bb)
{
if (dump_file)
fprintf (dump_file, " from %d to %d\n",
old_bb->index, new_bb->index);
- df_set_bb_dirty (old_bb);
+ if (!DEBUG_INSN_P (insn))
+ df_set_bb_dirty (old_bb);
}
else
if (dump_file)
diff --git a/gcc/testsuite/gcc.dg/pr104459.c b/gcc/testsuite/gcc.dg/pr104459.c
new file mode 100644
index 0000000..de8a643
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr104459.c
@@ -0,0 +1,38 @@
+/* PR rtl-optimization/104459 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -funswitch-loops -fno-tree-dce -fcompare-debug -w" } */
+
+void
+foo (int x, int y)
+{
+ unsigned int a;
+
+ for (;;)
+ {
+ short int *p = (short int *) &x;
+ unsigned int q = 0;
+
+ a /= 2;
+ if (a)
+ {
+ q -= y;
+ while (q)
+ ;
+ }
+
+ if (x)
+ {
+ for (q = 0; q != 1; q += 2)
+ {
+ unsigned int n;
+
+ n = *p ? 0 : q;
+ y += n < 1;
+
+ n = a || *p;
+ if (n % x == 0)
+ y /= x;
+ }
+ }
+ }
+}