aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cselib.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr49544.c19
4 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9d3823a..14e023b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-06-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/49544
+ * cselib.c (promote_debug_loc): If cselib_preserve_constants
+ and l has two DEBUG_INSN owned locs instead of just one, adjust
+ the second location's setting_insn too.
+
2011-06-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libmudflap/38738
diff --git a/gcc/cselib.c b/gcc/cselib.c
index e575aff..b96c0cd 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -257,7 +257,15 @@ promote_debug_loc (struct elt_loc_list *l)
{
n_debug_values--;
l->setting_insn = cselib_current_insn;
- gcc_assert (!l->next || cselib_preserve_constants);
+ if (cselib_preserve_constants && l->next)
+ {
+ gcc_assert (l->next->setting_insn
+ && DEBUG_INSN_P (l->next->setting_insn)
+ && !l->next->next);
+ l->next->setting_insn = cselib_current_insn;
+ }
+ else
+ gcc_assert (!l->next);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7184340..2d026a0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-06-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/49544
+ * gcc.dg/pr49544.c: New test.
+
2011-06-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49394
diff --git a/gcc/testsuite/gcc.dg/pr49544.c b/gcc/testsuite/gcc.dg/pr49544.c
new file mode 100644
index 0000000..65498f4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr49544.c
@@ -0,0 +1,19 @@
+/* PR debug/49544 */
+/* { dg-do compile } */
+/* { dg-options "-g -O2" } */
+
+int baz (int, int, void *);
+
+static inline __attribute__ ((always_inline)) long
+foo (int x, int y, void *z)
+{
+ if (y < 0)
+ return baz (x, y, z);
+ return 0;
+}
+
+long
+bar (long x, long y, long z)
+{
+ return foo (x, y, (void *) z);
+}