Do not fixup edges for a thunk in LTRANS (PR lto/78049)
authorMartin Liska <mliska@suse.cz>
Thu, 20 Oct 2016 15:30:17 +0000 (17:30 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 20 Oct 2016 15:30:17 +0000 (15:30 +0000)
PR lto/78049
* lto-streamer-in.c (fixup_call_stmt_edges_1): Replace value
comparison with STMT_UID_NOT_IN_RANGE.
(fixup_call_stmt_edges): Do not fixup edges of a thunk in
LTRANS.

From-SVN: r241380

gcc/ChangeLog
gcc/lto-streamer-in.c

index 7b72536b5e31287733fff5877cdec44064d01e98..1d06d98cfcb31be33b4df9b3c46f55735ba9e7a6 100644 (file)
@@ -1,3 +1,11 @@
+2016-10-20  Martin Liska  <mliska@suse.cz>
+
+       PR lto/78049
+       * lto-streamer-in.c (fixup_call_stmt_edges_1): Replace value
+       comparison with STMT_UID_NOT_IN_RANGE.
+       (fixup_call_stmt_edges): Do not fixup edges of a thunk in
+       LTRANS.
+
 2016-10-20  Eric Botcazou  <ebotcazou@adacore.com>
 
        * compare-elim.c (conforming_compare): Accept UNSPECs.
index f852bf942078b3de3b02e1210b07afce3f706383..1f39e6b98767743c4f154a5d2a610e56a9597fe8 100644 (file)
@@ -889,13 +889,16 @@ static void
 fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple **stmts,
                         struct function *fn)
 {
+#define STMT_UID_NOT_IN_RANGE(uid) \
+  (gimple_stmt_max_uid (fn) < uid || uid == 0)
+
   struct cgraph_edge *cedge;
   struct ipa_ref *ref = NULL;
   unsigned int i;
 
   for (cedge = node->callees; cedge; cedge = cedge->next_callee)
     {
-      if (gimple_stmt_max_uid (fn) < cedge->lto_stmt_uid)
+      if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid))
         fatal_error (input_location,
                     "Cgraph edge statement index out of range");
       cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
@@ -905,7 +908,7 @@ fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple **stmts,
     }
   for (cedge = node->indirect_calls; cedge; cedge = cedge->next_callee)
     {
-      if (gimple_stmt_max_uid (fn) < cedge->lto_stmt_uid)
+      if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid))
         fatal_error (input_location,
                     "Cgraph edge statement index out of range");
       cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
@@ -915,7 +918,7 @@ fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple **stmts,
   for (i = 0; node->iterate_reference (i, ref); i++)
     if (ref->lto_stmt_uid)
       {
-       if (gimple_stmt_max_uid (fn) < ref->lto_stmt_uid)
+       if (STMT_UID_NOT_IN_RANGE (ref->lto_stmt_uid))
          fatal_error (input_location,
                       "Reference statement index out of range");
        ref->stmt = stmts[ref->lto_stmt_uid - 1];
@@ -937,7 +940,8 @@ fixup_call_stmt_edges (struct cgraph_node *orig, gimple **stmts)
     orig = orig->clone_of;
   fn = DECL_STRUCT_FUNCTION (orig->decl);
 
-  fixup_call_stmt_edges_1 (orig, stmts, fn);
+  if (!orig->thunk.thunk_p)
+    fixup_call_stmt_edges_1 (orig, stmts, fn);
   if (orig->clones)
     for (node = orig->clones; node != orig;)
       {