re PR middle-end/83718 (ICE: Floating point exception in profile_count::apply_scale)
authorJan Hubicka <hubicka@ucw.cz>
Thu, 11 Jan 2018 17:46:01 +0000 (18:46 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 11 Jan 2018 17:46:01 +0000 (17:46 +0000)
PR middle-end/83718
* tree-inline.c (copy_cfg_body): Adjust num&den for scaling
after they are computed.
* g++.dg/torture/pr83718.C: New testcase.

From-SVN: r256544

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

index 878d72c22399f01d0b33e07361cec1bf7b168d5a..f8bd20f6aebd6a5f9ca2733d87e5cbbc871c1f7b 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/83718
+       * tree-inline.c (copy_cfg_body): Adjust num&den for scaling
+       after they are computed.
+
 2018-01-11  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/83695
index 4524063d0f365d21a191cb124ac133d63be52631..f1eb59b80b19b5ffdf6ce5fec65af85d06a8e674 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/83718
+       * g++.dg/torture/pr83718.C: New testcase.
+
 2018-01-11  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/83178
diff --git a/gcc/testsuite/g++.dg/torture/pr83718.C b/gcc/testsuite/g++.dg/torture/pr83718.C
new file mode 100644 (file)
index 0000000..2fa2806
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=c++11" } */
+
+class a
+{
+public:
+  int c (const char *);
+};
+class B
+{
+  virtual int *d (a, bool);
+};
+
+bool e, f, g;
+
+class: B
+{
+  int ah;
+  int *
+  d (a, bool)
+  {
+    if (e)
+      return &ah;
+    a bj;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (f)
+      return &ah;
+    bj.c ("");
+    if (g)
+      return &ah;
+    if (f)
+      return &ah;
+      e = a ().c("");
+    return &ah;
+  }
+} b;
+
index 5910745d0962ae0a0434a5d1e1b9ec43d136dc6d..b0d9beb530a0a0304b772b0d2484947e160fb827 100644 (file)
@@ -2683,8 +2683,6 @@ copy_cfg_body (copy_body_data * id,
   profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count;
   profile_count num = entry_block_map->count;
 
-  profile_count::adjust_for_ipa_scaling (&num, &den);
-
   cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
 
   /* Register specific tree functions.  */
@@ -2707,6 +2705,8 @@ copy_cfg_body (copy_body_data * id,
       ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = den;
     }
 
+  profile_count::adjust_for_ipa_scaling (&num, &den);
+
   /* Must have a CFG here at this point.  */
   gcc_assert (ENTRY_BLOCK_PTR_FOR_FN
              (DECL_STRUCT_FUNCTION (callee_fndecl)));