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>
* gimple.c (free_gimple_type_tables): New function.
......@@ -9238,9 +9238,9 @@ fold_builtin_isascii (location_t loc, tree arg)
else
{
/* Transform isascii(c) -> ((c & ~0x7f) == 0). */
arg = build2 (BIT_AND_EXPR, integer_type_node, arg,
build_int_cst (NULL_TREE,
~ (unsigned HOST_WIDE_INT) 0x7f));
arg = fold_build2 (BIT_AND_EXPR, integer_type_node, arg,
build_int_cst (NULL_TREE,
~ (unsigned HOST_WIDE_INT) 0x7f));
return fold_build2_loc (loc, EQ_EXPR, integer_type_node,
arg, integer_zero_node);
}
......@@ -9278,8 +9278,8 @@ fold_builtin_isdigit (location_t loc, tree arg)
return NULL_TREE;
arg = fold_convert_loc (loc, unsigned_type_node, arg);
arg = build2 (MINUS_EXPR, unsigned_type_node, arg,
build_int_cst (unsigned_type_node, target_digit0));
arg = fold_build2 (MINUS_EXPR, unsigned_type_node, arg,
build_int_cst (unsigned_type_node, target_digit0));
return fold_build2_loc (loc, LE_EXPR, integer_type_node, arg,
build_int_cst (unsigned_type_node, 9));
}
......
......@@ -552,8 +552,11 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
case ERT_ALLOWED_EXCEPTIONS:
new_r->u.allowed.type_list = old_r->u.allowed.type_list;
new_r->u.allowed.label
= data->label_map (old_r->u.allowed.label, data->label_map_data);
if (old_r->u.allowed.label)
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;
case ERT_MUST_NOT_THROW:
......
......@@ -942,6 +942,7 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
}
break;
case GIMPLE_NOP:
case GIMPLE_PREDICT:
break;
......
......@@ -1692,6 +1692,7 @@ output_gimple_stmt (struct output_block *ob, gimple stmt)
}
break;
case GIMPLE_NOP:
case GIMPLE_PREDICT:
break;
......
......@@ -323,8 +323,10 @@ lto_symtab_register_decl (tree decl,
&& (TREE_CODE (decl) == VAR_DECL
|| TREE_CODE (decl) == FUNCTION_DECL)
&& DECL_ASSEMBLER_NAME_SET_P (decl));
if (TREE_CODE (decl) == VAR_DECL)
gcc_assert (!(DECL_EXTERNAL (decl) && DECL_INITIAL (decl)));
if (TREE_CODE (decl) == VAR_DECL
&& DECL_INITIAL (decl))
gcc_assert (!DECL_EXTERNAL (decl)
|| (TREE_STATIC (decl) && TREE_READONLY (decl)));
if (TREE_CODE (decl) == FUNCTION_DECL)
gcc_assert (!DECL_ABSTRACT (decl));
......
......@@ -683,7 +683,6 @@ init_optimization_passes (void)
p = &all_lowering_passes;
NEXT_PASS (pass_warn_unused_result);
NEXT_PASS (pass_diagnose_omp_blocks);
NEXT_PASS (pass_remove_useless_stmts);
NEXT_PASS (pass_mudflap_1);
NEXT_PASS (pass_lower_omp);
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>
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-options "-O1 -fdump-tree-useless" } */
/* { dg-options "-O1 -fdump-tree-fre" } */
void
arf ()
......@@ -7,5 +7,5 @@ arf ()
if (""[0] == 0)
blah ();
}
/* { dg-final { scan-tree-dump-times "= 0;" 1 "useless"} } */
/* { dg-final { cleanup-tree-dump "useless" } } */
/* { dg-final { scan-tree-dump-times "= 0;" 1 "fre"} } */
/* { dg-final { cleanup-tree-dump "fre" } } */
/* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-useless" } */
/* { dg-options "-O1 -fdump-tree-gimple" } */
void
foo (void)
......@@ -13,5 +13,5 @@ foo (void)
in the loop exit condition, it would be re-introduced during
GIMPLE lowering, at the cost of an extra statement, label,
and basic block. */
/* { dg-final { scan-tree-dump-times "goto" 3 "useless"} } */
/* { dg-final { cleanup-tree-dump "useless" } } */
/* { dg-final { scan-tree-dump-times "goto" 3 "gimple"} } */
/* { dg-final { cleanup-tree-dump "gimple" } } */
......@@ -1919,21 +1919,27 @@ lower_eh_constructs_2 (struct leh_state *state, gimple_stmt_iterator *gsi)
else
{
x = gimple_seq_first_stmt (gimple_try_cleanup (stmt));
switch (gimple_code (x))
if (!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;
replace = gimple_try_eval (stmt);
lower_eh_constructs_1 (state, replace);
}
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
......
......@@ -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_2;
extern struct gimple_opt_pass pass_remove_useless_stmts;
extern struct gimple_opt_pass pass_lower_cf;
extern struct gimple_opt_pass pass_refactor_eh;
extern struct gimple_opt_pass pass_lower_eh;
......
......@@ -4438,7 +4438,8 @@ free_lang_data_in_decl (tree decl)
&& !TREE_STATIC (expr) && !DECL_EXTERNAL (expr))
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;
}
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