Commit 6728ee79 by Michael Matz Committed by Michael Matz

re PR middle-end/41573 (segfault in trunk related to strings)

	PR middle-end/41573
	* builtins.c (fold_builtin_isascii): Use fold_build2.
	(fold_builtin_isdigit): Ditto.
	* except.c (duplicate_eh_regions_1): Tolerate NULL labels.
	* tree-cfg.c (struct rus_data, remove_useless_stmts_warn_notreached,
	remove_useless_stmts_cond, remove_useless_stmts_tf,
	remove_useless_stmts_tc, remove_useless_stmts_bind,
	remove_useless_stmts_goto, remove_useless_stmts_label,
	remove_useless_stmts_1, remove_useless_stmts,
	pass_remove_useless_stmts): Remove.
	* tree-pass.h (pass_remove_useless_stmts): Don't declare.
	* passes.c (init_optimization_passes): Don't add
	pass_remove_useless_stmts.
	* tree-eh.c (lower_eh_constructs_2): Handle empty cleanups.
	* tree.c (free_lang_data_in_decl): Don't clear DECL_INITIAL of
	static constants.
	* lto-symtab.c (lto_symtab_register_decl): Accepts DECL_INITIAL
	for static constants.
	* lto-streamer-out.c (output_gimple_stmt): Handle GIMPLE_NOP.
	* lto-streamer-in.c (input_gimple_stmt): Handle GIMPLE_NOP.

testsuite/
	* gcc.dg/tree-ssa/foldstring-1.c: Use fre dump.
	* gcc.dg/tree-ssa/useless-1.c: Use gimple dump.
	* gcc.dg/pr41573.c: New test.

From-SVN: r152563
parent 0d0bfe17
2009-10-08 Michael Matz <matz@suse.de>
PR middle-end/41573
* builtins.c (fold_builtin_isascii): Use fold_build2.
(fold_builtin_isdigit): Ditto.
* except.c (duplicate_eh_regions_1): Tolerate NULL labels.
* tree-cfg.c (struct rus_data, remove_useless_stmts_warn_notreached,
remove_useless_stmts_cond, remove_useless_stmts_tf,
remove_useless_stmts_tc, remove_useless_stmts_bind,
remove_useless_stmts_goto, remove_useless_stmts_label,
remove_useless_stmts_1, remove_useless_stmts,
pass_remove_useless_stmts): Remove.
* tree-pass.h (pass_remove_useless_stmts): Don't declare.
* passes.c (init_optimization_passes): Don't add
pass_remove_useless_stmts.
* tree-eh.c (lower_eh_constructs_2): Handle empty cleanups.
* tree.c (free_lang_data_in_decl): Don't clear DECL_INITIAL of
static constants.
* lto-symtab.c (lto_symtab_register_decl): Accepts DECL_INITIAL
for static constants.
* lto-streamer-out.c (output_gimple_stmt): Handle GIMPLE_NOP.
* lto-streamer-in.c (input_gimple_stmt): Handle GIMPLE_NOP.
2009-10-08 Richard Guenther <rguenther@suse.de> 2009-10-08 Richard Guenther <rguenther@suse.de>
* gimple.c (free_gimple_type_tables): New function. * gimple.c (free_gimple_type_tables): New function.
...@@ -9238,9 +9238,9 @@ fold_builtin_isascii (location_t loc, tree arg) ...@@ -9238,9 +9238,9 @@ fold_builtin_isascii (location_t loc, tree arg)
else else
{ {
/* Transform isascii(c) -> ((c & ~0x7f) == 0). */ /* Transform isascii(c) -> ((c & ~0x7f) == 0). */
arg = build2 (BIT_AND_EXPR, integer_type_node, arg, arg = fold_build2 (BIT_AND_EXPR, integer_type_node, arg,
build_int_cst (NULL_TREE, build_int_cst (NULL_TREE,
~ (unsigned HOST_WIDE_INT) 0x7f)); ~ (unsigned HOST_WIDE_INT) 0x7f));
return fold_build2_loc (loc, EQ_EXPR, integer_type_node, return fold_build2_loc (loc, EQ_EXPR, integer_type_node,
arg, integer_zero_node); arg, integer_zero_node);
} }
...@@ -9278,8 +9278,8 @@ fold_builtin_isdigit (location_t loc, tree arg) ...@@ -9278,8 +9278,8 @@ fold_builtin_isdigit (location_t loc, tree arg)
return NULL_TREE; return NULL_TREE;
arg = fold_convert_loc (loc, unsigned_type_node, arg); arg = fold_convert_loc (loc, unsigned_type_node, arg);
arg = build2 (MINUS_EXPR, unsigned_type_node, arg, arg = fold_build2 (MINUS_EXPR, unsigned_type_node, arg,
build_int_cst (unsigned_type_node, target_digit0)); build_int_cst (unsigned_type_node, target_digit0));
return fold_build2_loc (loc, LE_EXPR, integer_type_node, arg, return fold_build2_loc (loc, LE_EXPR, integer_type_node, arg,
build_int_cst (unsigned_type_node, 9)); build_int_cst (unsigned_type_node, 9));
} }
......
...@@ -552,8 +552,11 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data, ...@@ -552,8 +552,11 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
case ERT_ALLOWED_EXCEPTIONS: case ERT_ALLOWED_EXCEPTIONS:
new_r->u.allowed.type_list = old_r->u.allowed.type_list; new_r->u.allowed.type_list = old_r->u.allowed.type_list;
new_r->u.allowed.label if (old_r->u.allowed.label)
= data->label_map (old_r->u.allowed.label, data->label_map_data); new_r->u.allowed.label
= data->label_map (old_r->u.allowed.label, data->label_map_data);
else
new_r->u.allowed.label = NULL_TREE;
break; break;
case ERT_MUST_NOT_THROW: case ERT_MUST_NOT_THROW:
......
...@@ -942,6 +942,7 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in, ...@@ -942,6 +942,7 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
} }
break; break;
case GIMPLE_NOP:
case GIMPLE_PREDICT: case GIMPLE_PREDICT:
break; break;
......
...@@ -1692,6 +1692,7 @@ output_gimple_stmt (struct output_block *ob, gimple stmt) ...@@ -1692,6 +1692,7 @@ output_gimple_stmt (struct output_block *ob, gimple stmt)
} }
break; break;
case GIMPLE_NOP:
case GIMPLE_PREDICT: case GIMPLE_PREDICT:
break; break;
......
...@@ -323,8 +323,10 @@ lto_symtab_register_decl (tree decl, ...@@ -323,8 +323,10 @@ lto_symtab_register_decl (tree decl,
&& (TREE_CODE (decl) == VAR_DECL && (TREE_CODE (decl) == VAR_DECL
|| TREE_CODE (decl) == FUNCTION_DECL) || TREE_CODE (decl) == FUNCTION_DECL)
&& DECL_ASSEMBLER_NAME_SET_P (decl)); && DECL_ASSEMBLER_NAME_SET_P (decl));
if (TREE_CODE (decl) == VAR_DECL) if (TREE_CODE (decl) == VAR_DECL
gcc_assert (!(DECL_EXTERNAL (decl) && DECL_INITIAL (decl))); && DECL_INITIAL (decl))
gcc_assert (!DECL_EXTERNAL (decl)
|| (TREE_STATIC (decl) && TREE_READONLY (decl)));
if (TREE_CODE (decl) == FUNCTION_DECL) if (TREE_CODE (decl) == FUNCTION_DECL)
gcc_assert (!DECL_ABSTRACT (decl)); gcc_assert (!DECL_ABSTRACT (decl));
......
...@@ -683,7 +683,6 @@ init_optimization_passes (void) ...@@ -683,7 +683,6 @@ init_optimization_passes (void)
p = &all_lowering_passes; p = &all_lowering_passes;
NEXT_PASS (pass_warn_unused_result); NEXT_PASS (pass_warn_unused_result);
NEXT_PASS (pass_diagnose_omp_blocks); NEXT_PASS (pass_diagnose_omp_blocks);
NEXT_PASS (pass_remove_useless_stmts);
NEXT_PASS (pass_mudflap_1); NEXT_PASS (pass_mudflap_1);
NEXT_PASS (pass_lower_omp); NEXT_PASS (pass_lower_omp);
NEXT_PASS (pass_lower_cf); NEXT_PASS (pass_lower_cf);
......
2009-10-08 Michael Matz <matz@suse.de>
PR middle-end/41573
* gcc.dg/tree-ssa/foldstring-1.c: Use fre dump.
* gcc.dg/tree-ssa/useless-1.c: Use gimple dump.
* gcc.dg/pr41573.c: New test.
2009-10-07 Joseph Myers <joseph@codesourcery.com> 2009-10-07 Joseph Myers <joseph@codesourcery.com>
PR c/41182 PR c/41182
......
/* { dg-do compile } */
/* { dg-options "-O2" } */
__inline __attribute__ ((__always_inline__)) char *
strcpy (char *__dest, __const char *__src)
{
return __builtin___strcpy_chk (__dest, __src, __builtin_object_size (__dest, 2 > 1));
}
const char* get_attr(unsigned attr)
{
static char tmp[256];
strcpy(tmp, "");
return tmp;
}
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-useless" } */ /* { dg-options "-O1 -fdump-tree-fre" } */
void void
arf () arf ()
...@@ -7,5 +7,5 @@ arf () ...@@ -7,5 +7,5 @@ arf ()
if (""[0] == 0) if (""[0] == 0)
blah (); blah ();
} }
/* { dg-final { scan-tree-dump-times "= 0;" 1 "useless"} } */ /* { dg-final { scan-tree-dump-times "= 0;" 1 "fre"} } */
/* { dg-final { cleanup-tree-dump "useless" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-useless" } */ /* { dg-options "-O1 -fdump-tree-gimple" } */
void void
foo (void) foo (void)
...@@ -13,5 +13,5 @@ foo (void) ...@@ -13,5 +13,5 @@ foo (void)
in the loop exit condition, it would be re-introduced during in the loop exit condition, it would be re-introduced during
GIMPLE lowering, at the cost of an extra statement, label, GIMPLE lowering, at the cost of an extra statement, label,
and basic block. */ and basic block. */
/* { dg-final { scan-tree-dump-times "goto" 3 "useless"} } */ /* { dg-final { scan-tree-dump-times "goto" 3 "gimple"} } */
/* { dg-final { cleanup-tree-dump "useless" } } */ /* { dg-final { cleanup-tree-dump "gimple" } } */
...@@ -1919,21 +1919,27 @@ lower_eh_constructs_2 (struct leh_state *state, gimple_stmt_iterator *gsi) ...@@ -1919,21 +1919,27 @@ lower_eh_constructs_2 (struct leh_state *state, gimple_stmt_iterator *gsi)
else else
{ {
x = gimple_seq_first_stmt (gimple_try_cleanup (stmt)); x = gimple_seq_first_stmt (gimple_try_cleanup (stmt));
switch (gimple_code (x)) if (!x)
{ {
case GIMPLE_CATCH: replace = gimple_try_eval (stmt);
replace = lower_catch (state, stmt); lower_eh_constructs_1 (state, replace);
break;
case GIMPLE_EH_FILTER:
replace = lower_eh_filter (state, stmt);
break;
case GIMPLE_EH_MUST_NOT_THROW:
replace = lower_eh_must_not_throw (state, stmt);
break;
default:
replace = lower_cleanup (state, stmt);
break;
} }
else
switch (gimple_code (x))
{
case GIMPLE_CATCH:
replace = lower_catch (state, stmt);
break;
case GIMPLE_EH_FILTER:
replace = lower_eh_filter (state, stmt);
break;
case GIMPLE_EH_MUST_NOT_THROW:
replace = lower_eh_must_not_throw (state, stmt);
break;
default:
replace = lower_cleanup (state, stmt);
break;
}
} }
/* Remove the old stmt and insert the transformed sequence /* Remove the old stmt and insert the transformed sequence
......
...@@ -333,7 +333,6 @@ extern void tree_lowering_passes (tree decl); ...@@ -333,7 +333,6 @@ extern void tree_lowering_passes (tree decl);
extern struct gimple_opt_pass pass_mudflap_1; extern struct gimple_opt_pass pass_mudflap_1;
extern struct gimple_opt_pass pass_mudflap_2; extern struct gimple_opt_pass pass_mudflap_2;
extern struct gimple_opt_pass pass_remove_useless_stmts;
extern struct gimple_opt_pass pass_lower_cf; extern struct gimple_opt_pass pass_lower_cf;
extern struct gimple_opt_pass pass_refactor_eh; extern struct gimple_opt_pass pass_refactor_eh;
extern struct gimple_opt_pass pass_lower_eh; extern struct gimple_opt_pass pass_lower_eh;
......
...@@ -4438,7 +4438,8 @@ free_lang_data_in_decl (tree decl) ...@@ -4438,7 +4438,8 @@ free_lang_data_in_decl (tree decl)
&& !TREE_STATIC (expr) && !DECL_EXTERNAL (expr)) && !TREE_STATIC (expr) && !DECL_EXTERNAL (expr))
SET_DECL_DEBUG_EXPR (decl, NULL_TREE); SET_DECL_DEBUG_EXPR (decl, NULL_TREE);
if (DECL_EXTERNAL (decl)) if (DECL_EXTERNAL (decl)
&& (!TREE_STATIC (decl) || !TREE_READONLY (decl)))
DECL_INITIAL (decl) = NULL_TREE; DECL_INITIAL (decl) = NULL_TREE;
} }
else if (TREE_CODE (decl) == TYPE_DECL) else if (TREE_CODE (decl) == TYPE_DECL)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment