re PR lto/63166 (ICE (LTO): ipa_intraprocedural_devirtualization, at ipa-prop.c:2611)
authorJan Hubicka <hubicka@ucw.cz>
Wed, 10 Sep 2014 06:33:36 +0000 (08:33 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 10 Sep 2014 06:33:36 +0000 (06:33 +0000)
PR ipa/63166
* ipa-prop.c (compute_known_type_jump_func): Fix conditional.

* g++.dg/lto/pr63166_0.ii: New testcase.
* g++.dg/lto/pr63166_1.ii: New testcase.

From-SVN: r215105

gcc/ChangeLog
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr63166_0.ii [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr63166_1.ii [new file with mode: 0644]

index 9357a6f97481069e03c0009d2c8a828fb8f712be..71d0700678a485939f83b6ab29b12a893cdc9bb8 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/63166
+       * ipa-prop.c (compute_known_type_jump_func): Fix conditional.
+
 2014-09-10  Alexander Ivchenko  <alexander.ivchenko@intel.com>
            Maxim Kuznetsov  <maxim.kuznetsov@intel.com>
            Anna Tikhonova  <anna.tikhonova@intel.com>
index 9632ea85b6773149d4dc2ae352878e9d5cdde86c..bbb417dead5629949eeae77fbd55f131e7363254 100644 (file)
@@ -1537,8 +1537,8 @@ compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
                                    call, current_function_decl)
       /* Even if the var seems to be in construction by inline call stack,
         we may work out the actual type by walking memory writes.  */
-      && (!is_global_var (base)
-         && detect_type_change (op, base, expected_type, call, jfunc, offset)))
+      && (is_global_var (base)
+         || detect_type_change (op, base, expected_type, call, jfunc, offset)))
     return;
 
   ipa_set_jf_known_type (jfunc, offset, TREE_TYPE (base),
index 0a2562ab42c47b57db555d9964453b45c40b4209..e18eea341e3cd1aaec800a7b2cf6f0aabe3dd568 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * g++.dg/lto/pr63166_0.ii: New testcase.
+       * g++.dg/lto/pr63166_1.ii: New testcase.
+
 2014-09-09  Manuel López-Ibáñez  <manu@gcc.gnu.org>
 
        * gcc.dg/cpp/warn-normalized-3.c: Delete useless dg-prune-output.
diff --git a/gcc/testsuite/g++.dg/lto/pr63166_0.ii b/gcc/testsuite/g++.dg/lto/pr63166_0.ii
new file mode 100644 (file)
index 0000000..f8ef712
--- /dev/null
@@ -0,0 +1,37 @@
+// { dg-lto-do compile }
+extern "C"
+{
+  extern long unsigned int strlen (__const char *__s);
+}
+class Cstring
+{
+};
+class Foobar_Out
+{
+  virtual void put_to_buf (const char *str, long unsigned int msg_len);
+  void put_to_buf (const char *str)
+  {
+    put_to_buf (str, strlen (str));
+  }
+  Foobar_Out & operator << (const char *str);
+  Foobar_Out & operator << (const Cstring & cstring);
+};
+
+class Foobar_Log:public Foobar_Out
+{
+  Foobar_Log (int channel);
+  virtual void put_to_buf (const char *str, long unsigned int msg_len);
+};
+Foobar_Out & Foobar_Out::operator << (const char *str)
+{
+  put_to_buf (str);
+}
+
+Foobar_Out & Foobar_Out::operator << (const Cstring & cstring)
+{
+  return *this;
+}
+
+Foobar_Log::Foobar_Log (int ch)
+{
+}
diff --git a/gcc/testsuite/g++.dg/lto/pr63166_1.ii b/gcc/testsuite/g++.dg/lto/pr63166_1.ii
new file mode 100644 (file)
index 0000000..29438fe
--- /dev/null
@@ -0,0 +1,108 @@
+class EIdent { };
+class Cstring { };
+template < class KEY, class VALUE, class HASHER > class HashMapIterator
+{
+public:
+  virtual ~ HashMapIterator () { }
+};
+
+class ECell;
+class ECell_ptr
+{
+  ECell *mp_element;
+public:
+    ECell * operator -> () const
+  {
+    return (mp_element);
+  }
+}
+sicat_cmd_status;
+class CellListIterator;
+class ECellList
+{
+public:
+  virtual CellListIterator * createIterator () const = 0;
+  virtual ECell_ptr Find (const EIdent & anIdent) = 0;
+};
+class Foobar_Out
+{
+  virtual int get_channel () { }
+public:
+    Foobar_Out & operator << (const char *str);
+  Foobar_Out & operator << (const Cstring & cstring);
+};
+
+class Foobar_Log:public Foobar_Out { };
+extern Foobar_Log Foobar_LOG;
+template < class KEY > class BagIterator
+{
+public:
+  inline const KEY & operator * () const;
+  inline int atEnd () const;
+};
+
+class EMaskView;
+class ECell
+{
+public:
+  virtual const EMaskView & getMaskView () const = 0;
+};
+class FoobarDatabase
+{
+public:
+  const Cstring & getName (const EIdent & id) const;
+  ECellList *getCellList ();
+};
+inline FoobarDatabase &
+DB () { }
+
+class EMaskView
+{
+public:
+  inline BagIterator < EIdent > getCallerIterator () const;
+};
+struct DBHashFunctions
+{
+};
+class CellListIterator:public HashMapIterator < EIdent, ECell *,
+  DBHashFunctions >
+{
+};
+class IdentSet
+{
+public:
+  unsigned int getSize () const { }
+  int isEmpty () const { }
+};
+class IdentSetIterator
+{
+public:
+  IdentSetIterator (const IdentSet * p_source) { }
+  int atEnd () const { }
+  EIdent operator* () const { }
+};
+void
+validate ()
+{
+  IdentSet complete_cell_ids;
+  IdentSet incomplete_cell_ids;
+  CellListIterator *p_cl_it = DB ().getCellList ()->createIterator ();
+  delete p_cl_it;
+  while (!incomplete_cell_ids.isEmpty ())
+    {
+      if (incomplete_cell_ids.getSize () < complete_cell_ids.getSize ())
+       {
+         IdentSetIterator complete_cell_it (&complete_cell_ids);
+         while (!complete_cell_it.atEnd ())
+           {
+             BagIterator < EIdent > caller_it =
+               DB ().getCellList ()->Find (*complete_cell_it)->
+               getMaskView ().getCallerIterator ();
+             while (!caller_it.atEnd ())
+               {
+                 Foobar_LOG << DB ().getName (*caller_it) << " ";
+               }
+           }
+       }
+    }
+}