re PR debug/48967 (ICE during use_narrower_mode)
authorJakub Jelinek <jakub@gcc.gnu.org>
Thu, 12 May 2011 11:54:33 +0000 (13:54 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 12 May 2011 11:54:33 +0000 (13:54 +0200)
PR debug/48967
* var-tracking.c (use_narrower_mode_test) <case REG>: Return 1
if validate_subreg fails.

* g++.dg/opt/pr48967.C: New test.

From-SVN: r173701

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

index 4bb674995f7a47aa56b3745609b4a2f5c58bcfe8..6f994adaedbe6fcb18ca2ffdc616170a5fc61be7 100644 (file)
@@ -1,4 +1,10 @@
-2011-05-12  Hariharan Sandanagobalane <hariharan@picochip.com>
+2011-05-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/48967
+       * var-tracking.c (use_narrower_mode_test) <case REG>: Return 1
+       if validate_subreg fails.
+
+2011-05-12  Hariharan Sandanagobalane  <hariharan@picochip.com>
 
        * ira.c (clarify_prohibited_class_mode_regs): Prevent the function from
        accessing beyond the end of REGNO_REG_CLASS array by stopping the loop
index d6f1b4cde9348e49769e4b7d1b57e5b0083d0b23..b0b337445adabf051da666b9806e38fa7348c841 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/48967
+       * g++.dg/opt/pr48967.C: New test.
+
 2011-05-11  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/constexpr-friend.C: New.
diff --git a/gcc/testsuite/g++.dg/opt/pr48967.C b/gcc/testsuite/g++.dg/opt/pr48967.C
new file mode 100644 (file)
index 0000000..db2ea54
--- /dev/null
@@ -0,0 +1,98 @@
+// PR debug/48967
+// { dg-do compile }
+// { dg-options "-g -O2" }
+
+template <typename> struct A;
+template <typename T> struct A <T *>
+{
+  typedef T ref;
+};
+template <typename T, typename> struct B
+{
+  typedef A <T> t;
+  typedef typename t::ref ref;
+  ref operator * () { return ref (); }
+};
+template <typename T> struct I
+{
+  typedef T *cp;
+  template <typename T1> struct J
+  {
+    typedef I <T1> other;
+  };
+};
+template <typename T> struct S : public I <T>
+{
+};
+template <typename T, typename _A> struct E
+{
+  typedef typename _A::template J <T>::other at;
+};
+template <typename T, typename _A = S <T> > struct D
+{
+  typedef E <T, _A> _Base;
+  typedef typename _Base::at at;
+  typedef typename at::cp cp;
+  typedef B <cp, D> H;
+};
+template <class T> struct F
+{
+  T *operator -> () { return __null; }
+};
+template <typename T> long
+lfloor (T x)
+{
+  return static_cast <long>(x) - (x && x != static_cast <long>(x));
+}
+template <typename T> long
+lround (T x)
+{
+  return lfloor (x - 0.5) + 1;
+}
+class M;
+template <typename> class P;
+typedef P <M> Q;
+template <typename> struct P
+{
+  float x ();
+};
+struct CV
+{
+  Q c;
+};
+struct C
+{
+  void foo (const CV &) const;
+  class O;
+  typedef D <F <O> > R;
+  R n;
+};
+struct S3
+{
+  S3 (int, int);
+};
+struct S2
+{
+  S3 sx, sy;
+  S2 (int x = 0, int y = 0, int s = 0, int t = 0) : sx (x, y), sy (s, t) {}
+};
+template <typename> struct N
+{
+  int bar ();
+};
+struct C::O
+{
+  N <float> o;
+  void foo (CV r, int)
+  {
+    Q c = r.c;
+    float t = 0.5 * (o.bar ());
+    S2 (lround (c.x ()), t);
+  }
+};
+void
+C::foo (const CV &w) const
+{
+  R::H m;
+  (*m)->foo (w, 8);
+}
index 90411123a69ea612dca0a6d3ac9170d8439024ae..278f546a86080a90b913db9b57330ead4b7b51d0 100644 (file)
@@ -745,6 +745,10 @@ use_narrower_mode_test (rtx *loc, void *data)
     case REG:
       if (cselib_lookup (*loc, GET_MODE (SUBREG_REG (subreg)), 0, VOIDmode))
        return 1;
+      if (!validate_subreg (GET_MODE (subreg), GET_MODE (*loc),
+                           *loc, subreg_lowpart_offset (GET_MODE (subreg),
+                                                        GET_MODE (*loc))))
+       return 1;
       return -1;
     case PLUS:
     case MINUS: