diff options
author | Martin Jambor <mjambor@suse.cz> | 2014-03-31 14:28:33 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2014-03-31 14:28:33 +0200 |
commit | c18ff8a4486629c2b6c2ca1b1794e791408d3de5 (patch) | |
tree | eddb4661944401b0b4adcbf590f0e5471b19e160 /gcc/tree-sra.c | |
parent | 9372710709817fe8d9a539475e993312f486b9a0 (diff) | |
download | gcc-c18ff8a4486629c2b6c2ca1b1794e791408d3de5.zip gcc-c18ff8a4486629c2b6c2ca1b1794e791408d3de5.tar.gz gcc-c18ff8a4486629c2b6c2ca1b1794e791408d3de5.tar.bz2 |
re PR middle-end/60647 (ICE in visit_ref_for_mod_analysis, at ipa-prop.c:2112)
2014-03-31 Martin Jambor <mjambor@suse.cz>
PR middle-end/60647
* tree-sra.c (callsite_has_enough_arguments_p): Renamed to
callsite_arguments_match_p. Updated all callers. Also check types of
corresponding formal parameters and actual arguments.
(not_all_callers_have_enough_arguments_p) Renamed to
some_callers_have_mismatched_arguments_p.
testsuite/
* gcc.dg/pr60647-1.c: New test.
* gcc.dg/pr60647-2.c: Likewise.
From-SVN: r208957
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r-- | gcc/tree-sra.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 284d544..ffef13d 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1234,12 +1234,26 @@ asm_visit_addr (gimple, tree op, tree, void *) } /* Return true iff callsite CALL has at least as many actual arguments as there - are formal parameters of the function currently processed by IPA-SRA. */ + are formal parameters of the function currently processed by IPA-SRA and + that their types match. */ static inline bool -callsite_has_enough_arguments_p (gimple call) +callsite_arguments_match_p (gimple call) { - return gimple_call_num_args (call) >= (unsigned) func_param_count; + if (gimple_call_num_args (call) < (unsigned) func_param_count) + return false; + + tree parm; + int i; + for (parm = DECL_ARGUMENTS (current_function_decl), i = 0; + parm; + parm = DECL_CHAIN (parm), i++) + { + tree arg = gimple_call_arg (call, i); + if (!useless_type_conversion_p (TREE_TYPE (parm), TREE_TYPE (arg))) + return false; + } + return true; } /* Scan function and look for interesting expressions and create access @@ -1294,7 +1308,7 @@ scan_function (void) if (recursive_call_p (current_function_decl, dest)) { encountered_recursive_call = true; - if (!callsite_has_enough_arguments_p (stmt)) + if (!callsite_arguments_match_p (stmt)) encountered_unchangable_recursive_call = true; } } @@ -4750,16 +4764,17 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments) } } -/* Return false iff all callers have at least as many actual arguments as there - are formal parameters in the current function. */ +/* Return false if all callers have at least as many actual arguments as there + are formal parameters in the current function and that their types + match. */ static bool -not_all_callers_have_enough_arguments_p (struct cgraph_node *node, - void *data ATTRIBUTE_UNUSED) +some_callers_have_mismatched_arguments_p (struct cgraph_node *node, + void *data ATTRIBUTE_UNUSED) { struct cgraph_edge *cs; for (cs = node->callers; cs; cs = cs->next_caller) - if (!callsite_has_enough_arguments_p (cs->call_stmt)) + if (!callsite_arguments_match_p (cs->call_stmt)) return true; return false; @@ -4970,12 +4985,13 @@ ipa_early_sra (void) goto simple_out; } - if (cgraph_for_node_and_aliases (node, not_all_callers_have_enough_arguments_p, + if (cgraph_for_node_and_aliases (node, + some_callers_have_mismatched_arguments_p, NULL, true)) { if (dump_file) fprintf (dump_file, "There are callers with insufficient number of " - "arguments.\n"); + "arguments or arguments with type mismatches.\n"); goto simple_out; } |