From 2d3fc6aafc3730a15e3facad442695ced8b22925 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@gcc.gnu.org>
Date: Mon, 19 Oct 2009 09:39:43 +0200
Subject: [PATCH] cfgexpand.c (expand_debug_expr): Fail if bitpos < 0 for
 non-MEM op0.

	* cfgexpand.c (expand_debug_expr): Fail if bitpos < 0 for non-MEM
	op0.

	* gcc.dg/debug/vta-3.c: New test.

From-SVN: r152972
---
 gcc/ChangeLog                      |  7 ++++++-
 gcc/cfgexpand.c                    |  3 +++
 gcc/testsuite/ChangeLog            |  4 ++++
 gcc/testsuite/gcc.dg/debug/vta-3.c | 17 +++++++++++++++++
 4 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/debug/vta-3.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 706052de6622..a8f7148419aa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,9 @@
-2009-10-17  Andy Hutchinson <hutchinsonandy@gcc.gnu.org>
+2009-10-19  Jakub Jelinek  <jakub@redhat.com>
+
+	* cfgexpand.c (expand_debug_expr): Fail if bitpos < 0 for non-MEM
+	op0.
+
+2009-10-17  Andy Hutchinson  <hutchinsonandy@gcc.gnu.org>
 
 	PR middle-end/41738
 	* optabs.c (expand_binop): Make mode of shift count expression mode
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index acd70c13869f..8c7c881ea6c8 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -2593,6 +2593,9 @@ expand_debug_expr (tree exp)
 	if (bitpos == 0 && mode == GET_MODE (op0))
 	  return op0;
 
+        if (bitpos < 0)
+          return NULL;
+
 	if ((bitpos % BITS_PER_UNIT) == 0
 	    && bitsize == GET_MODE_BITSIZE (mode1))
 	  {
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 168123f813a3..d4d46529f5c4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-10-19  Jakub Jelinek  <jakub@redhat.com>
+
+	* gcc.dg/debug/vta-3.c: New test.
+
 2009-10-17  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* gnat.dg/nested_proc.adb: Rename into...
diff --git a/gcc/testsuite/gcc.dg/debug/vta-3.c b/gcc/testsuite/gcc.dg/debug/vta-3.c
new file mode 100644
index 000000000000..7d014f1bc1e2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/vta-3.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+int
+foo (void)
+{
+  union { char e[8]; int i; } a, b;
+  char *c, *d;
+  unsigned int i;
+  c = a.e;
+  d = &b.e[sizeof (int) - 1];
+  for (i = 0; i < sizeof (int); i++)
+    {
+      *d = *c++;
+      --d;
+    }
+  return b.i;
+}
-- 
GitLab