PR debug/59350
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Jan 2014 11:39:41 +0000 (11:39 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Jan 2014 11:39:41 +0000 (11:39 +0000)
PR debug/59510
* var-tracking.c (add_stores): Preserve the value of the source even if
we don't record the store.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206356 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr59510.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr59350-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr59350.c
gcc/var-tracking.c

index 33548a0..a810fa2 100644 (file)
@@ -1,3 +1,10 @@
+2014-01-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR debug/59350
+       PR debug/59510
+       * var-tracking.c (add_stores): Preserve the value of the source even if
+       we don't record the store.
+
 2014-01-06  Terry Guo  <terry.guo@arm.com>
 
        * config.gcc (arm*-*-*): Check --with-arch against arm-arches.def.
index c46c8df..e2b84c5 100644 (file)
@@ -1,3 +1,9 @@
+2014-01-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/pr59350.c: Tweak.
+       * gcc.dg/pr59350-2.c: New test.
+       * g++.dg/pr59510.C: Likewise.
+
 2014-01-06  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/59023
diff --git a/gcc/testsuite/g++.dg/pr59510.C b/gcc/testsuite/g++.dg/pr59510.C
new file mode 100644 (file)
index 0000000..dcdf860
--- /dev/null
@@ -0,0 +1,82 @@
+// PR debug/59510
+// { dg-do compile }
+// { dg-options "-O2 -g --param=large-stack-frame-growth=1" }
+
+template <typename _Iterator>
+struct _Iter_base
+{
+  typedef _Iterator iterator_type;
+};
+template <typename _CharT>
+struct basic_ostream;
+template <typename _CharT>
+struct basic_ostringstream;
+template <typename _CharT>
+struct ostreambuf_iterator;
+typedef basic_ostringstream <char>ostringstream;
+template <typename _Iterator> struct _Miter_base : _Iter_base <_Iterator>
+{
+};
+template <typename _Iterator>
+typename _Miter_base <_Iterator>::iterator_type __miter_base (_Iterator);
+template <typename _CharT>
+ostreambuf_iterator <_CharT>
+__copy_move_a2 (ostreambuf_iterator <_CharT>);
+template <typename _II, typename _OI>
+_OI copy (_II __first, _II __last, _OI __result)
+{
+  __copy_move_a2 <false> (__first, __miter_base (__last), __result);
+}
+struct ios_base {
+  struct _Words {
+    int *_M_pword;
+    long _M_iword;
+  };
+  _Words _M_local_word[8];
+};
+template <typename _CharT>
+struct basic_streambuf
+{
+  typedef _CharT char_type;
+  int sputn (char_type *, int);
+};
+template <typename _CharT>
+struct ostreambuf_iterator
+{
+  typedef basic_streambuf <_CharT> streambuf_type;
+  typedef basic_ostream <_CharT> ostream_type;
+  streambuf_type *_M_sbuf;
+  bool _M_failed;
+  ostreambuf_iterator (ostream_type __s) : _M_sbuf (__s.rdbuf ()), _M_failed () {}
+  void _M_put (_CharT * __ws, int __len)
+  {
+    if (_M_failed && _M_sbuf->sputn (__ws, __len) != __len) _M_failed = true;
+  }
+};
+template <bool, typename _CharT>
+void __copy_move_a2 (_CharT * __first,_CharT * __last,ostreambuf_iterator <_CharT> __result)
+{
+  int __num = __last - __first;
+  __result._M_put (__first, __num);
+}
+template <typename _CharT>
+struct basic_ios : ios_base
+{
+  basic_streambuf <_CharT> *rdbuf ();
+};
+template <typename _CharT>
+struct basic_ostream : public basic_ios <_CharT>
+{
+};
+template <typename _CharT>
+struct basic_ostringstream : public basic_ostream <_CharT>
+{
+};
+void
+test01 () {
+  char data1[] = "foo";
+  char *beg1 = data1;
+  ostringstream oss1;
+  ostreambuf_iterator <char> out1 (oss1);
+  out1 = copy (beg1, beg1, out1);
+}
diff --git a/gcc/testsuite/gcc.dg/pr59350-2.c b/gcc/testsuite/gcc.dg/pr59350-2.c
new file mode 100644 (file)
index 0000000..2fea85f
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR debug/59350 */
+
+/* { dg-do compile } */
+/* { dg-options "-O -g " } */
+
+typedef struct
+{
+  void *v;
+  int len;
+  int sign;
+} ZVALUE;
+
+extern int pred (ZVALUE);
+
+static unsigned long
+small_factor (ZVALUE z)
+{
+  if (z.len > 0)
+    return 0;
+
+  return pred (z) ? -1 : 0;
+}
+
+unsigned long
+zfactor (ZVALUE z)
+{
+  z.sign = 0;
+  return small_factor (z);
+}
index be18687..fa63245 100644 (file)
@@ -1,4 +1,4 @@
-/* PR rtl-optimization/59350 */
+/* PR debug/59350 */
 /* Testcase by Ryan Mansfield <rmansfield@qnx.com> */
 
 /* { dg-do compile } */
index ee16aed..cfa7850 100644 (file)
@@ -5930,6 +5930,13 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
   if (type != MO_VAL_SET)
     goto log_and_return;
 
+  v = find_use_val (oloc, mode, cui);
+
+  if (!v)
+    goto log_and_return;
+
+  resolve = preserve = !cselib_preserved_value_p (v);
+
   /* We cannot track values for multiple-part variables, so we track only
      locations for tracked parameters passed either by invisible reference
      or directly in multiple locations.  */
@@ -5943,14 +5950,15 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
           && XEXP (DECL_INCOMING_RTL (REG_EXPR (loc)), 0) != arg_pointer_rtx)
           || (GET_CODE (DECL_INCOMING_RTL (REG_EXPR (loc))) == PARALLEL
              && XVECLEN (DECL_INCOMING_RTL (REG_EXPR (loc)), 0) > 1)))
-    goto log_and_return;
-
-  v = find_use_val (oloc, mode, cui);
-
-  if (!v)
-    goto log_and_return;
-
-  resolve = preserve = !cselib_preserved_value_p (v);
+    {
+      /* Although we don't use the value here, it could be used later by the
+        mere virtue of its existence as the operand of the reverse operation
+        that gave rise to it (typically extension/truncation).  Make sure it
+        is preserved as required by vt_expand_var_loc_chain.  */
+      if (preserve)
+       preserve_value (v);
+      goto log_and_return;
+    }
 
   if (loc == stack_pointer_rtx
       && hard_frame_pointer_adjustment != -1