re PR target/71281 (ICE on gcc trunk on knl, wsm, ivb and bdw targets (tree-ssa-reassoc))
authorKugan Vivekanandarajah <kuganv@linaro.org>
Mon, 6 Jun 2016 23:41:26 +0000 (23:41 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Mon, 6 Jun 2016 23:41:26 +0000 (23:41 +0000)
gcc/ChangeLog:

2016-06-07  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR middle-end/71281
* tree-ssa-reassoc.c (reassociate_bb): Set uid for negate stmt.

gcc/testsuite/ChangeLog:

2016-06-07  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR middle-end/71281
* g++.dg/torture/pr71281.C: New test.

From-SVN: r237157

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr71281.C [new file with mode: 0644]
gcc/tree-ssa-reassoc.c

index 18f491a6dcbecadb436fd45860ba0ac73ad92413..d586f9b3cf1c32e11ec7c3de4ec71dd43f3fba76 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-07  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR middle-end/71281
+       * tree-ssa-reassoc.c (reassociate_bb): Set uid for negate stmt.
+
 2016-06-07  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.h (enum ix86_enitity): Add X86_DIRFLAG.
index e292f547f39eabf341edc486650ed8b4b4a02206..81d2fd52f1a2dfb2b334edd7bc791b222dfbf834 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-07  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR middle-end/71281
+       * g++.dg/torture/pr71281.C: New test.
+
 2016-06-06  Marek Polacek  <polacek@redhat.com>
 
        PR c/71362
diff --git a/gcc/testsuite/g++.dg/torture/pr71281.C b/gcc/testsuite/g++.dg/torture/pr71281.C
new file mode 100644 (file)
index 0000000..7d429a9
--- /dev/null
@@ -0,0 +1,63 @@
+// PR middle-end/71281
+// { dg-do compile }
+// { dg-additional-options "-std=c++11 -Ofast" }
+
+
+template <typename> struct A;
+template <typename _Tp> struct A<_Tp *> { typedef _Tp reference; };
+
+template <typename _Iterator> class B {
+public:
+  typename A<_Iterator>::reference operator*();
+};
+
+template <typename> class C;
+template <typename> struct D;
+
+template <typename _Tp> struct D<C<_Tp>> {
+    using value_type = _Tp;
+    using const_pointer = _Tp *;
+    template <typename _Up> using rebind_alloc = C<_Up>;
+};
+
+template <typename _Alloc> struct __alloc_traits : D<_Alloc> {
+    typedef D<_Alloc> _Base_type;
+    typedef typename _Base_type::value_type &reference;
+    template <typename _Tp> struct F {
+       typedef typename _Base_type::template rebind_alloc<_Tp> other;
+    };
+};
+
+template <typename _Tp, typename _Alloc> struct G {
+    typedef typename __alloc_traits<_Alloc>::template F<_Tp>::other
+      _Tp_alloc_type;
+};
+
+int a, b;
+long d[1][1][1];
+void fn1() __attribute__((__noreturn__));
+template <typename _Tp, typename _Alloc = C<_Tp>> class H {
+    typedef __alloc_traits<typename G<_Tp, _Alloc>::_Tp_alloc_type> _Alloc_traits;
+    typedef typename _Alloc_traits::reference reference;
+
+public:
+    B<typename _Alloc_traits::const_pointer> m_fn1();
+    long m_fn2();
+    reference operator[](unsigned);
+    reference m_fn3(unsigned){
+       if (m_fn2())
+         fn1();
+    }
+};
+
+H<H<H<unsigned>>> c;
+void fn2() {
+    H<unsigned, C<int>> e;
+    for (int f = 1;;)
+      for (int g = 0;;)
+       for (int h = 0;;)
+         {
+           *d[0][h] =
+             c.m_fn3(f)[0][g] * a + -*(e).m_fn1() * b + (*c[f].m_fn1()).m_fn3(g);
+         }
+}
index 1973077db7cb6682e80908029418c4faccb9ce2a..096b24dc1d37d45cc9925b08f9fe38bff49309ec 100644 (file)
@@ -5387,6 +5387,7 @@ reassociate_bb (basic_block bb)
                  gimple_set_lhs (stmt, tmp);
                  gassign *neg_stmt = gimple_build_assign (lhs, NEGATE_EXPR,
                                                           tmp);
+                 gimple_set_uid (neg_stmt, gimple_uid (stmt));
                  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
                  gsi_insert_after (&gsi, neg_stmt, GSI_NEW_STMT);
                  update_stmt (stmt);