Hi, this patch extends handling of non-SSA arguments to bultin_constant_p and execution predicates.
Bootstrapped/regtested x86_64-linux, will commit it shortly. Honza * ipa-inline-analysis.c (set_cond_stmt_execution_predicate): Allow handled components in parameter of builtin_constant_p. (will_be_nonconstant_predicate): Allow loads of non-SSA parameters. Index: ipa-inline-analysis.c =================================================================== --- ipa-inline-analysis.c (revision 179046) +++ ipa-inline-analysis.c (working copy) @@ -1202,6 +1202,7 @@ set_cond_stmt_execution_predicate (struc gimple set_stmt; tree op2; tree parm; + tree base; last = last_stmt (bb); if (!last @@ -1252,7 +1253,8 @@ set_cond_stmt_execution_predicate (struc || gimple_call_num_args (set_stmt) != 1) return; op2 = gimple_call_arg (set_stmt, 0); - parm = unmodified_parm (set_stmt, op2); + base = get_base_address (op2); + parm = unmodified_parm (set_stmt, base ? base : op2); if (!parm) return; index = ipa_get_param_decl_index (info, parm); @@ -1433,6 +1435,7 @@ will_be_nonconstant_predicate (struct ip ssa_op_iter iter; tree use; struct predicate op_non_const; + bool is_load; /* What statments might be optimized away when their arguments are constant @@ -1443,11 +1446,29 @@ will_be_nonconstant_predicate (struct ip && gimple_code (stmt) != GIMPLE_SWITCH) return p; - /* Stores and loads will stay anyway. - TODO: Constant memory accesses could be handled here, too. */ - if (gimple_vuse (stmt)) + /* Stores will stay anyway. */ + if (gimple_vdef (stmt)) return p; + is_load = gimple_vuse (stmt) != NULL; + + /* Loads can be optimized when the value is known. */ + if (is_load) + { + tree op = gimple_assign_rhs1 (stmt); + tree base = get_base_address (op); + tree parm; + + gcc_assert (gimple_assign_single_p (stmt)); + if (!base) + return p; + parm = unmodified_parm (stmt, base); + if (!parm ) + return p; + if (ipa_get_param_decl_index (info, parm) < 0) + return p; + } + /* See if we understand all operands before we start adding conditionals. */ FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) @@ -1466,6 +1487,15 @@ will_be_nonconstant_predicate (struct ip return p; } op_non_const = false_predicate (); + if (is_load) + { + tree parm = unmodified_parm + (stmt, get_base_address (gimple_assign_rhs1 (stmt))); + p = add_condition (summary, + ipa_get_param_decl_index (info, parm), + IS_NOT_CONSTANT, NULL); + op_non_const = or_predicates (summary->conds, &p, &op_non_const); + } FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) { tree parm = unmodified_parm (stmt, use);