Commit 25837a2f by Jan Hubicka Committed by Jan Hubicka

inline-1.c: new testcase.


	* gcc.dg/ipa/inline-1.c: new testcase.
	* gcc.dg/ipa/inline-2.c: new testcase.
	* gcc.dg/ipa/inline-3.c: new testcase.
	* gcc.dg/ipa/inline-4.c: new testcase.

	* ipa-inline-transform.c (inline_call): Add comment.
	* ipa-inline.h (inline_param_summary): New structure and vector.
	(struct inline_edge_summary): Add param field.
	* ipa-inline-analysis.c (CHANGED): New constant.
	(add_clause): Handle CHANGED and NOT_CONSTANT.
	(predicate_probability): New function.
	(dump_condition): Dump CHANGED predicate.
	(evaluate_conditions_for_known_args): Handle ERROR_MARK as marker
	of unknown function wide invariant.
	(evaluate_conditions_for_edge): Handle change probabilities.
	(inline_edge_duplication_hook): Copy param summaries.
	(inline_edge_removal_hook): Free param summaries.
	(dump_inline_edge_summary): Fix dumping of indirect edges and callee sizes;
	dump param summaries.
	(will_be_nonconstant_predicate): Use CHANGED predicate.
	(record_modified_bb_info): New structure.
	(record_modified): New function.
	(param_change_prob): New function.
	(estimate_function_body_sizes): Compute param summaries.
	(estimate_edge_size_and_time): Add probability argument.
	(estimate_node_size_and_time): Add inline_param_summary argument;
	handle predicate probabilities.
	(remap_predicate): Fix formating.
	(remap_edge_change_prob): New function.
	(remap_edge_summaries): Rename from ...; use remap_edge_change_prob.
	(remap_edge_predicates): ... this one.
	(inline_merge_summary): Remap edge summaries; handle predicate probabilities;
	remove param summaries after we are done.
	(do_estimate_edge_time): Update.
	(do_estimate_edge_growth): Update.
	(read_inline_edge_summary): Read param info.
	(inline_read_summary): Fix formating.
	(write_inline_edge_summary): Write param summaries.

From-SVN: r179126
parent 1db4406e
2011-09-23 Jan Hubicka <jh@suse.cz>
* ipa-inline-transform.c (inline_call): Add comment.
* ipa-inline.h (inline_param_summary): New structure and vector.
(struct inline_edge_summary): Add param field.
* ipa-inline-analysis.c (CHANGED): New constant.
(add_clause): Handle CHANGED and NOT_CONSTANT.
(predicate_probability): New function.
(dump_condition): Dump CHANGED predicate.
(evaluate_conditions_for_known_args): Handle ERROR_MARK as marker
of unknown function wide invariant.
(evaluate_conditions_for_edge): Handle change probabilities.
(inline_edge_duplication_hook): Copy param summaries.
(inline_edge_removal_hook): Free param summaries.
(dump_inline_edge_summary): Fix dumping of indirect edges and callee sizes;
dump param summaries.
(will_be_nonconstant_predicate): Use CHANGED predicate.
(record_modified_bb_info): New structure.
(record_modified): New function.
(param_change_prob): New function.
(estimate_function_body_sizes): Compute param summaries.
(estimate_edge_size_and_time): Add probability argument.
(estimate_node_size_and_time): Add inline_param_summary argument;
handle predicate probabilities.
(remap_predicate): Fix formating.
(remap_edge_change_prob): New function.
(remap_edge_summaries): Rename from ...; use remap_edge_change_prob.
(remap_edge_predicates): ... this one.
(inline_merge_summary): Remap edge summaries; handle predicate probabilities;
remove param summaries after we are done.
(do_estimate_edge_time): Update.
(do_estimate_edge_growth): Update.
(read_inline_edge_summary): Read param info.
(inline_read_summary): Fix formating.
(write_inline_edge_summary): Write param summaries.
2011-09-23 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.c (ix86_print_operand): Handle %~.
......@@ -248,6 +248,8 @@ inline_call (struct cgraph_edge *e, bool update_original,
*overall_size += new_size - old_size;
ncalls_inlined++;
/* This must happen after inline_merge_summary that rely on jump
functions of callee to not be updated. */
if (optimize)
return ipa_propagate_indirect_call_infos (curr, new_edges);
else
......
......@@ -104,11 +104,28 @@ struct GTY(()) inline_summary
VEC(size_time_entry,gc) *entry;
};
typedef struct inline_summary inline_summary_t;
DEF_VEC_O(inline_summary_t);
DEF_VEC_ALLOC_O(inline_summary_t,gc);
extern GTY(()) VEC(inline_summary_t,gc) *inline_summary_vec;
/* Information kept about parameter of call site. */
struct inline_param_summary
{
/* REG_BR_PROB_BASE based probability that parameter will change in between
two invocation of the calls.
I.e. loop invariant parameters
REG_BR_PROB_BASE/estimated_iterations and regular
parameters REG_BR_PROB_BASE.
Value 0 is reserved for compile time invariants. */
int change_prob;
};
typedef struct inline_param_summary inline_param_summary_t;
DEF_VEC_O(inline_param_summary_t);
DEF_VEC_ALLOC_O(inline_param_summary_t,heap);
/* Information kept about callgraph edges. */
struct inline_edge_summary
{
......@@ -118,6 +135,10 @@ struct inline_edge_summary
/* Depth of loop nest, 0 means no nesting. */
unsigned short int loop_depth;
struct predicate *predicate;
/* Array indexed by parameters.
0 means that parameter change all the time, REG_BR_PROB_BASE means
that parameter is constant. */
VEC (inline_param_summary_t, heap) *param;
};
typedef struct inline_edge_summary inline_edge_summary_t;
......
2011-09-23 Jan Hubicka <jh@suse.cz>
* gcc.dg/ipa/inline-1.c: new testcase.
* gcc.dg/ipa/inline-2.c: new testcase.
* gcc.dg/ipa/inline-3.c: new testcase.
* gcc.dg/ipa/inline-4.c: new testcase.
2011-09-23 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50258
......
/* Verify that analysis of function parameters works as expected. */
/* { dg-do compile } */
/* { dg-options "-O3 -c -fdump-ipa-inline" } */
struct bah {int a,b,c,d,e;};
static struct bah bah3={2,3,4,5,6};
const static struct bah bah4={2,3,4,5,6};
void test (int, struct bah *, struct bah, struct bah, int, struct bah, struct bah, struct bah);
void foo (int invariant, struct bah invariant2)
{
int i;
struct bah bah2={1,2,3,4,5};
struct bah bah5={1,2,3,4,5};
for (i = 0; i<10; i++)
{
bah5.a=i;
test (i, &bah2, bah2, bah3, invariant, invariant2, bah4, bah5);
}
}
/* op0 change on every invocation. */
/* op1 is function invariant. */
/* { dg-final { scan-ipa-dump-not "op0 is compile time invariant" "inline" } } */
/* { dg-final { scan-ipa-dump-not "op0 change" "inline" } } */
/* { dg-final { scan-ipa-dump "op1 is compile time invariant" "inline" } } */
/* op2 is invariant within loop (we make assumption that function call does not afect it.). */
/* { dg-final { scan-ipa-dump "op2 change 10.000000. of time" "inline" } } */
/* op3 is invariant within loop (we make assumption that function call does not afect it.). */
/* { dg-final { scan-ipa-dump "op3 change 10.000000. of time" "inline" } } */
/* op4 is invariant within loop. */
/* { dg-final { scan-ipa-dump "op4 change 10.000000. of time" "inline" } } */
/* op5 is invariant within loop. */
/* { dg-final { scan-ipa-dump "op5 change 10.000000. of time" "inline" } } */
/* op6 is compile time invariant. */
/* { dg-final { scan-ipa-dump "op6 is compile time invariant" "inline" } } */
/* op7 change. */
/* { dg-final { scan-ipa-dump-not "op7 is compile time invariant" "inline" } } */
/* { dg-final { scan-ipa-dump-not "op7 change" "inline" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
/* Verify that logic combining probabilities works as expected. */
/* { dg-do compile } */
/* { dg-options "-O3 -c -fdump-ipa-inline -fno-early-inlining" } */
struct bah {int a,b,d;};
__attribute__ ((noinline))
void test(int a,int b,int c,int d,int e)
{
test3(a,b,c,d,e);
}
inline
static void bar (int parm1, int parm2)
{
int i;
for (i = 0; i<10; i++)
{
test (0,0,parm1,parm2,i);
}
}
void foo (int invariant)
{
int i;
for (i = 0; i<10; i++)
{
bar (i, invariant);
}
}
/* After inlining bar into foo, op2 is invariant within inner loop. */
/* { dg-final { scan-ipa-dump "op2 change 10.000000. of time" "inline" } } */
/* After inlining bar into foo, op3 is invariant within both loops. */
/* { dg-final { scan-ipa-dump "op3 change 1.000000. of time" "inline" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
/* Verify that do_work is detected as being loop invariant. */
/* { dg-do compile } */
/* { dg-options "-O3 -c -fdump-ipa-inline-details -fno-early-inlining" } */
struct bah {int a,b,d;};
static int do_work (struct bah s)
{
return s.a*s.b/s.d;
}
int foo (int invariant)
{
int i;
struct bah s = {invariant,invariant,invariant};
int sum = 0;
for (i = 0; i<10; i++)
{
sum += do_work (s);
}
return sum;
}
/* { dg-final { scan-ipa-dump "Scaling time by probability:0.100000" "inline" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
/* { dg-do compile } */
/* { dg-options "-Os -c -fdump-ipa-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
void do_something (int shall_i_work)
{
if (shall_i_work)
{
work_hard ();
work_hard ();
work_hard ();
work_hard ();
work_hard ();
work_hard ();
work_hard ();
work_hard ();
}
}
int foo (int invariant)
{
do_something (0);
do_something (1);
}
/* We should inline do_something(0), but not do_something (1). */
/* { dg-final { scan-ipa-dump "Inlined 1 calls, eliminated 0 functions" "inline" } } */
/* Call to work_hard should be detected as optimized out. */
/* { dg-final { scan-ipa-dump-times "predicate: .false." 8 "inline" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
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