This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Google] Fix AFDO early inline ICEs due to DFE
- From: Teresa Johnson <tejohnson at google dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Dehao Chen <dehao at google dot com>, Rong Xu <xur at google dot com>, David Li <davidxl at google dot com>
- Date: Thu, 12 Jun 2014 11:23:35 -0700
- Subject: [Google] Fix AFDO early inline ICEs due to DFE
- Authentication-results: sourceware.org; auth=none
These two patches fix multiple ICE that occurred due to DFE being
recently enabled after AutoFDO LIPO linking.
Passes regression and internal testing. Ok for Google/4_8?
Teresa
2014-06-12 Teresa Johnson <tejohnson@google.com>
Dehao Chen <dehao@google.com>
Google ref b/15521327.
* cgraphclones.c (cgraph_clone_edge): Use resolved node.
* l-ipo.c (resolve_cgraph_node): Resolve to non-removable node.
Index: cgraphclones.c
===================================================================
--- cgraphclones.c (revision 211386)
+++ cgraphclones.c (working copy)
@@ -94,6 +94,7 @@ along with GCC; see the file COPYING3. If not see
#include "ipa-utils.h"
#include "lto-streamer.h"
#include "except.h"
+#include "l-ipo.h"
/* Create clone of E in the node N represented by CALL_EXPR the callgraph. */
struct cgraph_edge *
@@ -118,7 +119,11 @@ cgraph_clone_edge (struct cgraph_edge *e, struct c
if (call_stmt && (decl = gimple_call_fndecl (call_stmt)))
{
- struct cgraph_node *callee = cgraph_get_node (decl);
+ struct cgraph_node *callee;
+ if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done)
+ callee = cgraph_lipo_get_resolved_node (decl);
+ else
+ callee = cgraph_get_node (decl);
gcc_checking_assert (callee);
new_edge = cgraph_create_edge (n, callee, call_stmt, count, freq);
}
Index: l-ipo.c
===================================================================
--- l-ipo.c (revision 211386)
+++ l-ipo.c (working copy)
@@ -1542,6 +1542,18 @@ resolve_cgraph_node (struct cgraph_sym **slot, str
gcc_assert (decl1_defined);
add_define_module (*slot, decl2);
+ /* Pick the node that cannot be removed, to avoid a situation
+ where we remove the resolved node and later try to access
+ it for the remaining non-removable copy. E.g. one may be
+ extern and the other weak, only the extern copy can be removed. */
+ if (cgraph_can_remove_if_no_direct_calls_and_refs_p ((*slot)->rep_node)
+ && !cgraph_can_remove_if_no_direct_calls_and_refs_p (node))
+ {
+ (*slot)->rep_node = node;
+ (*slot)->rep_decl = decl2;
+ return;
+ }
+
has_prof1 = has_profile_info (decl1);
bool is_aux1 = cgraph_is_auxiliary (decl1);
bool is_aux2 = cgraph_is_auxiliary (decl2);
--
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413