]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/55823 (ice in inline_call, at ipa-inline-transform.c:270)
authorJan Hubicka <jh@suse.cz>
Tue, 8 Jan 2013 20:23:05 +0000 (21:23 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 8 Jan 2013 20:23:05 +0000 (20:23 +0000)
PR tree-optimization/55823
* ipa-prop.c (update_indirect_edges_after_inlining): Fix ordering issue.

From-SVN: r195033

gcc/ChangeLog
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/devirt-10.C [new file with mode: 0644]

index 83e02978ecb62d0b971a3486a136992ddc781a9a..05754555fcd3715320e463b61115e37790e4d4b9 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-04  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/55823
+       * ipa-prop.c (update_indirect_edges_after_inlining): Fix ordering issue.
+
 2012-01-08  Jakub Jelinek  <jakub@redhat.com>
            Uros Bizjak  <ubizjak@gmail.com>
 
index d225b85f7d019f4906577a4fbfee171f2b749ff1..2c7e13c3276425ef064f92388f40be1d65949a50 100644 (file)
@@ -2264,40 +2264,15 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
 
       param_index = ici->param_index;
       jfunc = ipa_get_ith_jump_func (top, param_index);
-      if (jfunc->type == IPA_JF_PASS_THROUGH
-         && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
-       {
-         if (ici->agg_contents
-             && !ipa_get_jf_pass_through_agg_preserved (jfunc))
-           ici->param_index = -1;
-         else
-           ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
-       }
-      else if (jfunc->type == IPA_JF_ANCESTOR)
-       {
-         if (ici->agg_contents
-             && !ipa_get_jf_ancestor_agg_preserved (jfunc))
-           ici->param_index = -1;
-         else
-           {
-             ici->param_index = ipa_get_jf_ancestor_formal_id (jfunc);
-             ici->offset += ipa_get_jf_ancestor_offset (jfunc);
-           }
-       }
-      else
-       /* Either we can find a destination for this edge now or never. */
-       ici->param_index = -1;
 
       if (!flag_indirect_inlining)
-       continue;
-
-      if (ici->polymorphic)
+       new_direct_edge = NULL;
+      else if (ici->polymorphic)
        new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,
                                                             new_root_info);
       else
        new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
                                                            new_root_info);
-
       if (new_direct_edge)
        {
          new_direct_edge->indirect_inlining_edge = 1;
@@ -2312,6 +2287,29 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
              res = true;
            }
        }
+      else if (jfunc->type == IPA_JF_PASS_THROUGH
+              && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
+       {
+         if (ici->agg_contents
+             && !ipa_get_jf_pass_through_agg_preserved (jfunc))
+           ici->param_index = -1;
+         else
+           ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
+       }
+      else if (jfunc->type == IPA_JF_ANCESTOR)
+       {
+         if (ici->agg_contents
+             && !ipa_get_jf_ancestor_agg_preserved (jfunc))
+           ici->param_index = -1;
+         else
+           {
+             ici->param_index = ipa_get_jf_ancestor_formal_id (jfunc);
+             ici->offset += ipa_get_jf_ancestor_offset (jfunc);
+           }
+       }
+      else
+       /* Either we can find a destination for this edge now or never. */
+       ici->param_index = -1;
     }
 
   return res;
index d509109c1ebd075389c61e92d211c336622061e9..f22287404f953bb59de668284cff0e731c757b5f 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-04  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/55823
+       * g++.dg/ipa/devirt-10.C: New testcase.
+
 2012-01-08  Uros Bizjak  <ubizjak@gmail.com>
            Vladimir Yakovlev  <vladimir.b.yakovlev@intel.com>
 
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-10.C b/gcc/testsuite/g++.dg/ipa/devirt-10.C
new file mode 100644 (file)
index 0000000..6550ff0
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp"  } */
+class wxPaintEvent {  };
+struct wxDCBase
+{ 
+  wxDCBase ();
+  virtual int GetLayoutDirection() const{}
+  virtual void SetLayoutDirection(int){}
+};
+struct wxWindowDC  : public wxDCBase {};
+struct wxBufferedDC  : public wxDCBase
+{ 
+  void Init(wxDCBase*dc) {
+    InitCommon(dc);
+  }
+  void InitCommon(wxDCBase*dc) {
+    if (dc)
+      SetLayoutDirection(dc->GetLayoutDirection());
+  }
+};
+struct wxBufferedPaintDC  : public wxBufferedDC {
+  wxBufferedPaintDC() {
+    Init(&m_paintdc);
+  }
+ wxWindowDC m_paintdc;
+};
+void  OnPaint(wxPaintEvent & event) {
+  wxBufferedPaintDC dc;
+}
+/* IPA-CP should really discover both cases, but for time being the second is handled by inliner.  */
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "inline"  } } */
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp"  } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */