re PR target/93187 (ICE in extract_insn, at recog.c:2294)
authorJakub Jelinek <jakub@redhat.com>
Wed, 8 Jan 2020 15:59:20 +0000 (16:59 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 8 Jan 2020 15:59:20 +0000 (16:59 +0100)
PR target/93187
* config/i386/i386.md (*stack_protect_set_2_<mode> peephole2,
*stack_protect_set_3 peephole2): Also check that the second
insns source is general_operand.

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

From-SVN: r280012

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr93187.C [new file with mode: 0644]

index cb1f7cb6dc31037197a9e13ba4399404b2c41c40..ce7713f611093a49f72e3e960f8032fa2335ed89 100644 (file)
@@ -1,5 +1,10 @@
 2020-01-08  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/93187
+       * config/i386/i386.md (*stack_protect_set_2_<mode> peephole2,
+       *stack_protect_set_3 peephole2): Also check that the second
+       insns source is general_operand.
+
        PR target/93174
        * config/i386/i386.md (addcarry<mode>_0): Use nonimmediate_operand
        predicate for output operand instead of register_operand.
index 3daf7205d91ad81642cc6dcb19ec8ebb8231d386..1fead5cd8bb9bd1da413474991b97f9163cc1612 100644 (file)
   (set (match_operand:SI 3 "general_reg_operand")
        (match_operand:SI 4))]
  "REGNO (operands[2]) == REGNO (operands[3])
+  && general_operand (operands[4], SImode)
   && (general_reg_operand (operands[4], SImode)
       || memory_operand (operands[4], SImode)
       || immediate_operand (operands[4], SImode))
             (clobber (reg:CC FLAGS_REG))])
   (set (match_dup 2) (match_operand:DI 3))]
  "TARGET_64BIT
+  && general_operand (operands[3], DImode)
   && (general_reg_operand (operands[3], DImode)
       || memory_operand (operands[3], DImode)
       || x86_64_zext_immediate_operand (operands[3], DImode)
index 88708582afb2f166a590631456506b97c0a6c3c1..e0296d2e2aee070bce6d51bd974a04a5153f617a 100644 (file)
@@ -1,5 +1,8 @@
 2020-01-08  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/93187
+       * g++.dg/opt/pr93187.C: New test.
+
        PR target/93174
        * gcc.c-torture/compile/pr93174.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/opt/pr93187.C b/gcc/testsuite/g++.dg/opt/pr93187.C
new file mode 100644 (file)
index 0000000..19db5c9
--- /dev/null
@@ -0,0 +1,77 @@
+// PR target/93187
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2" }
+// { dg-additional-options "-fstack-protector-strong" { target fstack_protector } }
+// { dg-additional-options "-fpie" { target pie } }
+
+struct A;
+struct B;
+struct C { int operator () (B, const B &); };
+struct D { typedef int *d; };
+struct E { C g; };
+struct F { F (D::d); friend bool operator==(F &, const int &); };
+template <typename T, typename> struct H {
+  typedef D *I;
+  E l;
+  I foo ();
+  T t;
+  F bar (I, const T &);
+  F baz (const T &);
+};
+template <typename T, typename U>
+F
+H<T, U>::bar (I n, const T &o)
+{
+  while (n)
+    if (l.g (t, o))
+      n = 0;
+  return 0;
+}
+template <typename T, typename U>
+F
+H<T, U>::baz (const T &n)
+{
+  D *r = foo ();
+  F p = bar (r, n);
+  return p == 0 ? 0 : p;
+}
+template <typename, typename U> struct J {
+  H<B, U> h;
+  B &q;
+  void baz () { h.baz (q); }
+};
+enum K { L };
+template <typename, K = L> struct M;
+template <int> struct G {
+  using N = J<int, A>;
+  N *operator->();
+};
+template <typename, K T> struct M : public G<T> {
+  using N = J<int, A>;
+  N *foo () { return n; }
+  N *n;
+  int o;
+};
+template <int N>
+inline typename G<N>::N *
+G<N>::operator-> ()
+{
+  N *n = static_cast<M<J<int, A>> *>(this)->foo ();
+  return n;
+}
+struct B { bool qux (); };
+struct O {
+  struct P { M<int> p; };
+  static thread_local P o;
+  int baz () const;
+};
+thread_local O::P O::o;
+B be;
+int
+O::baz () const
+{
+  do
+    o.p->baz ();
+  while (be.qux ());
+  __builtin_unreachable ();
+}