From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31350 invoked by alias); 30 May 2002 23:12:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 31306 invoked by uid 61); 30 May 2002 23:12:00 -0000 Date: Thu, 30 May 2002 16:16:00 -0000 Message-ID: <20020530231200.31305.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, vmakarov@gcc.gnu.org, vmakarov@redhat.com From: vmakarov@gcc.gnu.org Reply-To: vmakarov@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, vmakarov@gcc.gnu.org, vmakarov@redhat.com, gcc-gnats@gcc.gnu.org Subject: Re: c/6875: IA64 compiler crash when -O3 X-SW-Source: 2002-05/txt/msg01003.txt.bz2 List-Id: Synopsis: IA64 compiler crash when -O3 State-Changed-From-To: analyzed->feedback State-Changed-By: vmakarov State-Changed-When: Thu May 30 16:12:00 2002 State-Changed-Why: I don't know well the font-end. But I see the two ways of the problem solution: o making another copy of tree of the call. o clearing RTL code for tree label declarations in the call. I prefer the 2nd solution as less expensive one. Here the patch is. I've tried regression tests and bootstrap on ia64/x86 for the patch (everithin looks ok). Vlad 2002-05-30 Vladimir Makarov * langhooks-def.h (lhd_tree_inlining_walk_tree): New function prototype. (LANG_HOOKS_TREE_INLINING_INITIALIZER): Add LANG_HOOKS_TREE_INLINING_WALK_TREE. * langhooks.h (lang_hooks_for_tree_inlining): New member `walk_tree'. * langhooks.c (lhd_tree_inlining_walk_tree): New function. * c-tree.h (c_walk_tree): New function prototype. * c-objc-common.c (c_walk_tree): New function. * c-lang.c (LANG_HOOKS_TREE_INLINING_WALK_TREE): Redefine it. * cp/cp-tree.h (cp_walk_tree): New function prototype. * cp/tree.c (cp_walk_tree): New function. * calls.c (clear_label_decls): New function. (expand_call): Clear labels for the second pass. Index: c-lang.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/c-lang.c,v retrieving revision 1.74.6.2 diff -d -c -p -r1.74.6.2 c-lang.c *** c-lang.c 23 May 2002 17:57:26 -0000 1.74.6.2 --- c-lang.c 30 May 2002 19:40:58 -0000 *************** static void c_init_options PARAMS ((void *** 55,60 **** --- 55,62 ---- #undef LANG_HOOKS_SET_YYDEBUG #define LANG_HOOKS_SET_YYDEBUG c_set_yydebug + #undef LANG_HOOKS_TREE_INLINING_WALK_TREE + #define LANG_HOOKS_TREE_INLINING_WALK_TREE c_walk_tree #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ c_cannot_inline_tree_fn Index: c-objc-common.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/c-objc-common.c,v retrieving revision 1.3.2.2 diff -d -c -p -r1.3.2.2 c-objc-common.c *** c-objc-common.c 28 Mar 2002 18:49:58 -0000 1.3.2.2 --- c-objc-common.c 30 May 2002 19:40:58 -0000 *************** c_missing_noreturn_ok_p (decl) *** 51,56 **** --- 51,68 ---- return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)); } + + /* The function just calls walk_tree. */ + tree + c_walk_tree (tp, func, data, htab) + tree *tp; + walk_tree_fn func; + void *data; + void *htab; + { + return walk_tree (tp, func, data, htab); + } + /* We want to inline `extern inline' functions even if this would violate inlining limits. Some glibc and linux constructs depend on such functions always being inlined when optimizing. */ Index: c-tree.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/c-tree.h,v retrieving revision 1.81.2.2 diff -d -c -p -r1.81.2.2 c-tree.h *** c-tree.h 28 Mar 2002 18:49:58 -0000 1.81.2.2 --- c-tree.h 30 May 2002 19:40:58 -0000 *************** extern void c_expand_decl_stmt *** 221,226 **** --- 221,228 ---- /* in c-objc-common.c */ + extern tree c_walk_tree PARAMS ((tree *, walk_tree_fn, + void *, void *)); extern int c_disregard_inline_limits PARAMS ((tree)); extern int c_cannot_inline_tree_fn PARAMS ((tree *)); extern const char *c_objc_common_init PARAMS ((const char *)); Index: calls.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/calls.c,v retrieving revision 1.221.2.2 diff -d -c -p -r1.221.2.2 calls.c *** calls.c 4 Apr 2002 23:28:47 -0000 1.221.2.2 --- calls.c 30 May 2002 19:40:59 -0000 *************** Software Foundation, 59 Temple Place - S *** 27,32 **** --- 27,33 ---- #include "expr.h" #include "libfuncs.h" #include "function.h" + #include "langhooks.h" #include "regs.h" #include "toplev.h" #include "output.h" *************** static int flags_from_decl_or_type PAR *** 219,226 **** static rtx try_to_integrate PARAMS ((tree, tree, rtx, int, tree, rtx)); static int check_sibcall_argument_overlap_1 PARAMS ((rtx)); ! static int check_sibcall_argument_overlap PARAMS ((rtx, struct arg_data *)); ! static int combine_pending_stack_adjustment_and_call PARAMS ((int, struct args_size *, int)); --- 220,229 ---- static rtx try_to_integrate PARAMS ((tree, tree, rtx, int, tree, rtx)); static int check_sibcall_argument_overlap_1 PARAMS ((rtx)); ! static int check_sibcall_argument_overlap PARAMS ((rtx, ! struct arg_data *)); ! static tree clear_label_decls PARAMS ((tree *, int *, ! void *)); static int combine_pending_stack_adjustment_and_call PARAMS ((int, struct args_size *, int)); *************** check_sibcall_argument_overlap (insn, ar *** 2062,2067 **** --- 2065,2090 ---- return insn != NULL_RTX; } + /* The following function is called by tree inline hook walk_tree to + clear rtl code for the labels. */ + + static tree + clear_label_decls (tp, walk_subtrees, data) + tree *tp; + int *walk_subtrees; + void *data ATTRIBUTE_UNUSED; + { + *walk_subtrees = 1; + if (TREE_CODE (*tp) == LABEL_DECL) + { + SET_DECL_RTL (*tp, NULL); + *walk_subtrees = 0; + } + + /* Keep iterating. */ + return NULL_TREE; + } + /* Generate all the code for a function call and return an rtx for its value. Store the value in TARGET (specified as an rtx) if convenient. *************** expand_call (exp, target, ignore) *** 2659,2664 **** --- 2682,2694 ---- able to get rid of them. */ expand_start_target_temps (); } + + if (pass != 0) + /* EXP may contain label declaration whose LABEL_CODE will be + not defined in the normal call code (2nd pass) unless we + clear its RTL code generated for the sibling call. */ + (*lang_hooks.tree_inlining.walk_tree) (&exp, clear_label_decls, + NULL, NULL); /* Don't let pending stack adjusts add up to too much. Also, do all pending adjustments now if there is any chance Index: langhooks-def.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/langhooks-def.h,v retrieving revision 1.8.10.2 diff -d -c -p -r1.8.10.2 langhooks-def.h *** langhooks-def.h 23 May 2002 17:57:27 -0000 1.8.10.2 --- langhooks-def.h 30 May 2002 19:40:59 -0000 *************** extern void lhd_print_tree_nothing PARAM *** 50,55 **** --- 50,57 ---- extern void lhd_set_yydebug PARAMS ((int)); /* Declarations of default tree inlining hooks. */ + tree lhd_tree_inlining_walk_tree PARAMS ((tree *, walk_tree_fn, + void *, void *)); tree lhd_tree_inlining_walk_subtrees PARAMS ((tree *, int *, walk_tree_fn, void *, void *)); *************** tree lhd_tree_inlining_convert_parm_for_ *** 87,92 **** --- 89,95 ---- #define LANG_HOOKS_SET_YYDEBUG lhd_set_yydebug /* Tree inlining hooks. */ + #define LANG_HOOKS_TREE_INLINING_WALK_TREE lhd_tree_inlining_walk_tree #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES lhd_tree_inlining_walk_subtrees #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ lhd_tree_inlining_cannot_inline_tree_fn *************** tree lhd_tree_inlining_convert_parm_for_ *** 110,115 **** --- 113,119 ---- lhd_tree_inlining_convert_parm_for_inlining #define LANG_HOOKS_TREE_INLINING_INITIALIZER { \ + LANG_HOOKS_TREE_INLINING_WALK_TREE, \ LANG_HOOKS_TREE_INLINING_WALK_SUBTREES, \ LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN, \ LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS, \ Index: langhooks.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/langhooks.c,v retrieving revision 1.16.2.2 diff -d -c -p -r1.16.2.2 langhooks.c *** langhooks.c 21 Mar 2002 23:12:21 -0000 1.16.2.2 --- langhooks.c 30 May 2002 19:40:59 -0000 *************** hook_get_alias_set_0 (t) *** 126,131 **** --- 126,143 ---- return 0; } + /* This is the default function for lang_hooks.tree_inlining.walk_tree. */ + + tree + lhd_tree_inlining_walk_tree (tp, func, data, htab) + tree *tp ATTRIBUTE_UNUSED; + walk_tree_fn func ATTRIBUTE_UNUSED; + void *data ATTRIBUTE_UNUSED; + void *htab ATTRIBUTE_UNUSED; + { + return NULL_TREE; + } + /* lang_hooks.tree_inlining.walk_subtrees is called by walk_tree() after handling common cases, but before walking code-specific sub-trees. If this hook is overridden for a language, it should Index: langhooks.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/langhooks.h,v retrieving revision 1.15.8.2 diff -d -c -p -r1.15.8.2 langhooks.h *** langhooks.h 23 May 2002 17:57:28 -0000 1.15.8.2 --- langhooks.h 30 May 2002 19:40:59 -0000 *************** typedef void (*lang_print_tree_hook) PAR *** 29,34 **** --- 29,39 ---- struct lang_hooks_for_tree_inlining { + union tree_node *(*walk_tree) PARAMS ((union tree_node **, + union tree_node *(*) + (union tree_node **, + int *, void *), + void *, void *)); union tree_node *(*walk_subtrees) PARAMS ((union tree_node **, int *, union tree_node *(*) (union tree_node **, Index: cp/cp-tree.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/cp/cp-tree.h,v retrieving revision 1.681.2.12 diff -d -c -p -r1.681.2.12 cp-tree.h *** cp/cp-tree.h 23 May 2002 17:57:42 -0000 1.681.2.12 --- cp/cp-tree.h 30 May 2002 19:40:59 -0000 *************** extern int char_type_p *** 4280,4285 **** --- 4280,4287 ---- extern void verify_stmt_tree PARAMS ((tree)); extern tree find_tree PARAMS ((tree, tree)); extern linkage_kind decl_linkage PARAMS ((tree)); + extern tree cp_walk_tree PARAMS ((tree *, walk_tree_fn, + void *, void *)); extern tree cp_walk_subtrees PARAMS ((tree*, int*, walk_tree_fn, void*, void*)); extern int cp_cannot_inline_tree_fn PARAMS ((tree*)); Index: cp/tree.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/cp/tree.c,v retrieving revision 1.268.2.4 diff -d -c -p -r1.268.2.4 tree.c *** cp/tree.c 16 May 2002 02:09:15 -0000 1.268.2.4 --- cp/tree.c 30 May 2002 19:41:00 -0000 *************** make_ptrmem_cst (type, member) *** 2077,2082 **** --- 2077,2094 ---- return ptrmem_cst; } + /* The function just calls walk_tree. */ + + tree + cp_walk_tree (tp, func, data, htab) + tree *tp; + walk_tree_fn func; + void *data; + void *htab; + { + return walk_tree (tp, func, data, htab); + } + /* Apply FUNC to all language-specific sub-trees of TP in a pre-order traversal. Called from walk_tree(). */ http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6875