]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/45572 (various ICEs with -finline-small-functions -findirect...
authorMartin Jambor <mjambor@suse.cz>
Mon, 4 Oct 2010 10:15:10 +0000 (12:15 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 4 Oct 2010 10:15:10 +0000 (12:15 +0200)
2010-10-04  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/45572
* ipa-prop.c (ipa_make_edge_direct_to_target): Call
ipa_check_create_node_params.
* ipa-inline.c (add_new_edges_to_heap): Do not insert inlined edges.

* testsuite/g++.dg/ipa/pr45572-1.C: New test.
* testsuite/g++.dg/ipa/pr45572-2.C: Likewise.

From-SVN: r164930

gcc/ChangeLog
gcc/ipa-inline.c
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr45572-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ipa/pr45572-2.C [new file with mode: 0644]

index 9367b72557ecf132bb16d4cbc252914cc3c83ae4..1a0a3f0275fcc2e8c3b21ad39f1a4c0e957bdd59 100644 (file)
@@ -1,3 +1,10 @@
+2010-10-04  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/45572
+       * ipa-prop.c (ipa_make_edge_direct_to_target): Call
+       ipa_check_create_node_params.
+       * ipa-inline.c (add_new_edges_to_heap): Do not insert inlined edges.
+
 2010-10-04  Yao Qi  <yao@codesourcery.com>
 
        * doc/passes.texi: Clean up.
index 21e0b647973e9d1f8d23f7439c9990b5dca5f09f..ca3823b53b3f96512dcc9ec179d18c66a71b9fae 100644 (file)
@@ -1031,6 +1031,7 @@ add_new_edges_to_heap (fibheap_t heap, VEC (cgraph_edge_p, heap) *new_edges)
 
       gcc_assert (!edge->aux);
       if (edge->callee->local.inlinable
+         && edge->inline_failed
          && cgraph_default_inline_p (edge->callee, &edge->inline_failed))
         edge->aux = fibheap_insert (heap, cgraph_edge_badness (edge, false), edge);
     }
index e1d821e39883727d613ea10ba42b60b7187e5bd2..9ffbb3f90a9b69e3dcfbd47c8d82c9af15a32baf 100644 (file)
@@ -1447,7 +1447,7 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
   callee = cgraph_node (target);
   if (!callee)
     return NULL;
-
+  ipa_check_create_node_params ();
   cgraph_make_edge_direct (ie, callee);
   if (dump_file)
     {
index 00fc30c80e2f92b7b3f1fabad04015db35e1338e..f64f53128bb0ab6b1617255a67d0da71ac345aab 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-04  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/45572
+       * g++.dg/ipa/pr45572-1.C: New test.
+       * g++.dg/ipa/pr45572-2.C: Likewise.
+
 2010-10-03  Ian Lance Taylor  <iant@google.com>
 
        * gcc.dg/anon-struct-11.c: New test.
diff --git a/gcc/testsuite/g++.dg/ipa/pr45572-1.C b/gcc/testsuite/g++.dg/ipa/pr45572-1.C
new file mode 100644 (file)
index 0000000..82f3470
--- /dev/null
@@ -0,0 +1,64 @@
+// { dg-do compile }
+// { dg-options "-finline-small-functions -findirect-inlining -finline-functions -O" }
+
+extern "C" {
+typedef long unsigned int size_t;
+typedef long int __ssize_t;
+typedef struct _IO_FILE FILE;
+typedef struct
+{
+} __mbstate_t;
+extern __inline __attribute__ ((__gnu_inline__)) int
+fgetc_unlocked (FILE *__fp)
+{
+}
+extern __inline __attribute__ ((__gnu_inline__)) int
+putc_unlocked (int __c, FILE *__stream)
+{
+}
+extern __inline __attribute__ ((__gnu_inline__)) __ssize_t
+getline (char **__lineptr, size_t *__n, FILE *__stream)
+{
+}
+extern __inline __attribute__ ((__gnu_inline__)) int
+ferror_unlocked (FILE *__stream) throw ()
+{
+}
+}
+typedef struct
+{} __mpf_struct;
+typedef __mpf_struct mpf_t[1];
+typedef const __mpf_struct *mpf_srcptr;
+typedef __mpf_struct *mpf_ptr;
+extern "C" {
+ void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
+}
+class _knumber
+{
+ public:
+  enum NumType {SpecialType, IntegerType, FractionType, FloatType};
+  virtual NumType type(void) const = 0;
+  virtual _knumber * add(_knumber const & arg2) const = 0;
+  virtual operator long int(void) const = 0;
+};
+class _knumfloat : public _knumber
+{
+  _knumfloat(double num = 1.0)
+  ;
+  virtual NumType type(void) const ;
+  virtual _knumber * add(_knumber const & arg2) const;
+  virtual operator long int (void) const;
+    mpf_t _mpf;
+};
+_knumber *_knumfloat::add(_knumber const & arg2) const
+{
+  if (arg2.type() == SpecialType)
+    return arg2.add(*this);
+{
+    _knumfloat tmp_num(arg2);
+    return tmp_num.add(*this);
+  }
+  _knumfloat * tmp_num = new _knumfloat();
+  __gmpf_add(tmp_num->_mpf, _mpf,
+   dynamic_cast<_knumfloat const &>(arg2)._mpf);
+}
diff --git a/gcc/testsuite/g++.dg/ipa/pr45572-2.C b/gcc/testsuite/g++.dg/ipa/pr45572-2.C
new file mode 100644 (file)
index 0000000..8b583d9
--- /dev/null
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-finline-small-functions -findirect-inlining -finline-function+
+typedef struct
+{} __mpf_struct;
+typedef __mpf_struct mpf_t[1];
+typedef const __mpf_struct *mpf_srcptr;
+typedef __mpf_struct *mpf_ptr;
+extern "C" {
+ void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
+}
+class _knumber
+{
+ public:
+  enum NumType {SpecialType, IntegerType, FractionType, FloatType};
+  virtual NumType type(void) const = 0;
+  virtual _knumber * add(_knumber const & arg2) const = 0;
+  virtual operator long int(void) const = 0;
+};
+class _knumfloat : public _knumber
+{
+  _knumfloat(double num = 1.0)
+  ;
+  virtual NumType type(void) const ;
+  virtual _knumber * add(_knumber const & arg2) const;
+  virtual operator long int (void) const;
+    mpf_t _mpf;
+};
+_knumber *_knumfloat::add(_knumber const & arg2) const
+{
+  if (arg2.type() == SpecialType)
+    return arg2.add(*this);
+{
+    _knumfloat tmp_num(arg2);
+    return tmp_num.add(*this);
+  }
+  _knumfloat * tmp_num = new _knumfloat();
+  __gmpf_add(tmp_num->_mpf, _mpf,
+   dynamic_cast<_knumfloat const &>(arg2)._mpf);
+}