Commit 4d3814a5 by Richard Guenther Committed by Richard Biener

value-prof.c (gimple_divmod_fixed_value): Work on SSA form.

2010-10-05  Richard Guenther  <rguenther@suse.de>

	* value-prof.c (gimple_divmod_fixed_value): Work on SSA form.
	(gimple_mod_pow2): Likewise.
	(gimple_mod_subtract): Likewise.
	(gimple_ic): Likewise.
	(gimple_stringop_fixed_value): Likewise.
	* tree-profile.c (tree_init_edge_profiler): Mark profile
	functions nothrow and leaf.
	(add_abnormal_goto_call_edges): Remove.
	(tree_gen_edge_profiler): Work on SSA form.
	(tree_gen_ic_profiler): Likewise.  Simplify.
	(do_tree_profiling): Update SSA form.
	(pass_tree_profile): Remove.
	(do_tree_profiling): Likewise.
	(gate_tree_profile_ipa): New function.
	(pass_ipa_tree_profile): New.
	(tree_profiling): Re-write as IPA pass.  Properly drop const/pure
	state of instrumented functions.
	* passes.c (init_optimization_passes): Remove early non-SSA
	inlining.  Move profiling after early optimizations.
	* ipa-inline.c (cgraph_gate_ipa_early_inlining): Remove.
	(pass_ipa_early_inline): Likewise.
	* tree-pass.h (pass_ipa_early_inline): Remove.
	(pass_tree_profile): Likewise.
	(pass_ipa_tree_profile): Declare.

	* gcc.dg/tree-prof/val-prof-1.c: Adjust.
	* gcc.dg/tree-prof/val-prof-2.c: Likewise.
	* gcc.dg/tree-prof/val-prof-3.c: Likewise.
	* gcc.dg/tree-prof/val-prof-4.c: Likewise.
	* gcc.dg/tree-prof/val-prof-5.c: Likewise.
	* gcc.dg/tree-prof/val-prof-7.c: Likewise.
	* gcc.dg/tree-prof/stringop-1.c: Likewise.
	* gcc.dg/tree-prof/stringop-2.c: Likewise.
	* gcc.dg/tree-prof/ic-misattribution-1.c: Likewise.
	* gcc.dg/tree-prof/indir-call-prof.c: Likewise.
	* gcc.dg/tree-prof/update-loopch.c: Likewise.
	* g++.dg/tree-prof/indir-call-prof.C: Likewise.
	* g++.dg/tree-prof/inline_mismatch_args.C: Likewise.
	* gcc.dg/tree-prof/tracer-1.c: Likewise.
	* gcc.dg/tree-ssa/inline-4.c: Likewise.
	* gcc.dg/tree-ssa/inline-3.c: Likewise.
	* gcc.dg/tree-ssa/20080530.c: Likewise.
	* g++.dg/tree-ssa/inline-3.C: Likewise.
	* g++.dg/tree-ssa/inline-1.C: Likewise.
	* g++.dg/tree-ssa/inline-2.C: Likewise.
	* gcc.dg/profile-dir-1.c: Likewise.
	* gcc.dg/profile-dir-2.c: Likewise.
	* gcc.dg/profile-dir-3.c: Likewise.

From-SVN: r164986
parent 65b1d8ea
2010-10-05 Richard Guenther <rguenther@suse.de>
* value-prof.c (gimple_divmod_fixed_value): Work on SSA form.
(gimple_mod_pow2): Likewise.
(gimple_mod_subtract): Likewise.
(gimple_ic): Likewise.
(gimple_stringop_fixed_value): Likewise.
* tree-profile.c (tree_init_edge_profiler): Mark profile
functions nothrow and leaf.
(add_abnormal_goto_call_edges): Remove.
(tree_gen_edge_profiler): Work on SSA form.
(tree_gen_ic_profiler): Likewise. Simplify.
(do_tree_profiling): Update SSA form.
(pass_tree_profile): Remove.
(do_tree_profiling): Likewise.
(gate_tree_profile_ipa): New function.
(pass_ipa_tree_profile): New.
(tree_profiling): Re-write as IPA pass. Properly drop const/pure
state of instrumented functions.
* passes.c (init_optimization_passes): Remove early non-SSA
inlining. Move profiling after early optimizations.
* ipa-inline.c (cgraph_gate_ipa_early_inlining): Remove.
(pass_ipa_early_inline): Likewise.
* tree-pass.h (pass_ipa_early_inline): Remove.
(pass_tree_profile): Likewise.
(pass_ipa_tree_profile): Declare.
2010-10-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> 2010-10-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
Christian Borntraeger <Christian.Borntraeger@de.ibm.com> Christian Borntraeger <Christian.Borntraeger@de.ibm.com>
...@@ -1841,36 +1841,6 @@ struct gimple_opt_pass pass_early_inline = ...@@ -1841,36 +1841,6 @@ struct gimple_opt_pass pass_early_inline =
} }
}; };
/* When inlining shall be performed. */
static bool
cgraph_gate_ipa_early_inlining (void)
{
return (flag_early_inlining
&& !in_lto_p
&& (flag_branch_probabilities || flag_test_coverage
|| profile_arc_flag));
}
/* IPA pass wrapper for early inlining pass. We need to run early inlining
before tree profiling so we have stand alone IPA pass for doing so. */
struct simple_ipa_opt_pass pass_ipa_early_inline =
{
{
SIMPLE_IPA_PASS,
"einline_ipa", /* name */
cgraph_gate_ipa_early_inlining, /* gate */
NULL, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_INLINE_HEURISTICS, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_cgraph /* todo_flags_finish */
}
};
/* See if statement might disappear after inlining. We are not terribly /* See if statement might disappear after inlining. We are not terribly
sophisficated, basically looking for simple abstraction penalty wrappers. */ sophisficated, basically looking for simple abstraction penalty wrappers. */
......
...@@ -746,18 +746,10 @@ init_optimization_passes (void) ...@@ -746,18 +746,10 @@ init_optimization_passes (void)
p = &all_small_ipa_passes; p = &all_small_ipa_passes;
NEXT_PASS (pass_ipa_free_lang_data); NEXT_PASS (pass_ipa_free_lang_data);
NEXT_PASS (pass_ipa_function_and_variable_visibility); NEXT_PASS (pass_ipa_function_and_variable_visibility);
NEXT_PASS (pass_ipa_early_inline);
{
struct opt_pass **p = &pass_ipa_early_inline.pass.sub;
NEXT_PASS (pass_early_inline);
NEXT_PASS (pass_inline_parameters);
NEXT_PASS (pass_rebuild_cgraph_edges);
}
NEXT_PASS (pass_early_local_passes); NEXT_PASS (pass_early_local_passes);
{ {
struct opt_pass **p = &pass_early_local_passes.pass.sub; struct opt_pass **p = &pass_early_local_passes.pass.sub;
NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_fixup_cfg);
NEXT_PASS (pass_tree_profile);
NEXT_PASS (pass_init_datastructures); NEXT_PASS (pass_init_datastructures);
NEXT_PASS (pass_expand_omp); NEXT_PASS (pass_expand_omp);
...@@ -802,6 +794,7 @@ init_optimization_passes (void) ...@@ -802,6 +794,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_rebuild_cgraph_edges);
NEXT_PASS (pass_inline_parameters); NEXT_PASS (pass_inline_parameters);
} }
NEXT_PASS (pass_ipa_tree_profile);
NEXT_PASS (pass_ipa_increase_alignment); NEXT_PASS (pass_ipa_increase_alignment);
NEXT_PASS (pass_ipa_matrix_reorg); NEXT_PASS (pass_ipa_matrix_reorg);
NEXT_PASS (pass_ipa_lower_emutls); NEXT_PASS (pass_ipa_lower_emutls);
......
2010-10-05 Richard Guenther <rguenther@suse.de> 2010-10-05 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-prof/val-prof-1.c: Adjust.
* gcc.dg/tree-prof/val-prof-2.c: Likewise.
* gcc.dg/tree-prof/val-prof-3.c: Likewise.
* gcc.dg/tree-prof/val-prof-4.c: Likewise.
* gcc.dg/tree-prof/val-prof-5.c: Likewise.
* gcc.dg/tree-prof/val-prof-7.c: Likewise.
* gcc.dg/tree-prof/stringop-1.c: Likewise.
* gcc.dg/tree-prof/stringop-2.c: Likewise.
* gcc.dg/tree-prof/ic-misattribution-1.c: Likewise.
* gcc.dg/tree-prof/indir-call-prof.c: Likewise.
* gcc.dg/tree-prof/update-loopch.c: Likewise.
* g++.dg/tree-prof/indir-call-prof.C: Likewise.
* g++.dg/tree-prof/inline_mismatch_args.C: Likewise.
* gcc.dg/tree-prof/tracer-1.c: Likewise.
* gcc.dg/tree-ssa/inline-4.c: Likewise.
* gcc.dg/tree-ssa/inline-3.c: Likewise.
* gcc.dg/tree-ssa/20080530.c: Likewise.
* g++.dg/tree-ssa/inline-3.C: Likewise.
* g++.dg/tree-ssa/inline-1.C: Likewise.
* g++.dg/tree-ssa/inline-2.C: Likewise.
* gcc.dg/profile-dir-1.c: Likewise.
* gcc.dg/profile-dir-2.c: Likewise.
* gcc.dg/profile-dir-3.c: Likewise.
2010-10-05 Richard Guenther <rguenther@suse.de>
PR middle-end/45877 PR middle-end/45877
* g++.dg/torture/pr45877.C: New testcase. * g++.dg/torture/pr45877.C: New testcase.
......
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
struct A { struct A {
A () {} A () {}
...@@ -15,6 +15,7 @@ struct B : public A { ...@@ -15,6 +15,7 @@ struct B : public A {
{ return 1; } { return 1; }
}; };
void * __attribute__((noinline,noclone)) wrap (void *p) { return p; }
int int
main (void) main (void)
{ {
...@@ -23,17 +24,16 @@ main (void) ...@@ -23,17 +24,16 @@ main (void)
A* p; A* p;
p = &a; p = (A *)wrap ((void *)&a);
p->AA (); p->AA ();
p = &b; p = (B *)wrap ((void *)&b);
p->AA (); p->AA ();
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Indirect call -> direct call.* AA transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* AA transformation on insn" "tree_profile_ipa" } } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-einline2" } */ /* { dg-options "-O2 -fdump-tree-einline" } */
class DocId { class DocId {
public: public:
DocId() { } DocId() { }
...@@ -31,6 +31,6 @@ int main(void) ...@@ -31,6 +31,6 @@ int main(void)
baz.Bar(&baz, gid); baz.Bar(&baz, gid);
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline2"} } */ /* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline" } } */
/* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline2"} } */ /* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline" } } */
/* { dg-final-use { cleanup-tree-dump "einline2" } } */ /* { dg-final-use { cleanup-tree-dump "einline2" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-einline2" } */ /* { dg-options "-O2 -fdump-tree-einline" } */
/* { dg-add-options bind_pic_locally } */ /* { dg-add-options bind_pic_locally } */
namespace std { namespace std {
...@@ -31,6 +31,6 @@ int main(int argc, char **argv) ...@@ -31,6 +31,6 @@ int main(int argc, char **argv)
foreach (argv, argv + argc, inline_me_too); foreach (argv, argv + argc, inline_me_too);
} }
/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
/* { dg-final { cleanup-tree-dump "einline2" } } */ /* { dg-final { cleanup-tree-dump "einline" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-einline2" } */ /* { dg-options "-O2 -fdump-tree-einline" } */
/* { dg-add-options bind_pic_locally } */ /* { dg-add-options bind_pic_locally } */
namespace std { namespace std {
...@@ -31,6 +31,6 @@ int main(int argc, char **argv) ...@@ -31,6 +31,6 @@ int main(int argc, char **argv)
foreach (argv, argv + argc, inline_me_too); foreach (argv, argv + argc, inline_me_too);
} }
/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
/* { dg-final { cleanup-tree-dump "einline2" } } */ /* { dg-final { cleanup-tree-dump "einline" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-einline2" } */ /* { dg-options "-O2 -fdump-tree-einline" } */
/* { dg-add-options bind_pic_locally } */ /* { dg-add-options bind_pic_locally } */
#include <algorithm> #include <algorithm>
...@@ -26,6 +26,6 @@ int main(int argc, char **argv) ...@@ -26,6 +26,6 @@ int main(int argc, char **argv)
std::for_each (argv, argv + argc, inline_me_too); std::for_each (argv, argv + argc, inline_me_too);
} }
/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
/* { dg-final { cleanup-tree-dump "einline2" } } */ /* { dg-final { cleanup-tree-dump "einline" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -fprofile-generate=. -fdump-tree-tree_profile" } */ /* { dg-options "-O -fprofile-generate=. -fdump-ipa-tree_profile_ipa" } */
/* { dg-final { scan-tree-dump " ./profile-dir-1.gcda" "tree_profile" } } */ /* { dg-final { scan-ipa-dump " ./profile-dir-1.gcda" "tree_profile_ipa" } } */
int int
main(void) main(void)
...@@ -8,4 +8,4 @@ main(void) ...@@ -8,4 +8,4 @@ main(void)
return 0; return 0;
} }
/* { dg-final { cleanup-tree-dump "tree_profile" } } */ /* { dg-final { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -fprofile-generate -fdump-tree-tree_profile" } */ /* { dg-options "-O -fprofile-generate -fdump-ipa-tree_profile_ipa" } */
/* { dg-final { scan-tree-dump "/profile-dir-2.gcda" "tree_profile" } } */ /* { dg-final { scan-ipa-dump "/profile-dir-2.gcda" "tree_profile_ipa" } } */
int int
main(void) main(void)
...@@ -8,4 +8,4 @@ main(void) ...@@ -8,4 +8,4 @@ main(void)
return 0; return 0;
} }
/* { dg-final { cleanup-tree-dump "tree_profile" } } */ /* { dg-final { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -fprofile-generate -fprofile-dir=. -fdump-tree-tree_profile" } */ /* { dg-options "-O -fprofile-generate -fprofile-dir=. -fdump-ipa-tree_profile_ipa" } */
/* { dg-final { scan-tree-dump " ./profile-dir-3.gcda" "tree_profile" } } */ /* { dg-final { scan-ipa-dump " ./profile-dir-3.gcda" "tree_profile_ipa" } } */
int int
main(void) main(void)
...@@ -8,4 +8,4 @@ main(void) ...@@ -8,4 +8,4 @@ main(void)
return 0; return 0;
} }
/* { dg-final { cleanup-tree-dump "tree_profile" } } */ /* { dg-final { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa" } */
/* { dg-additional-sources "ic-misattribution-1a.c" } */ /* { dg-additional-sources "ic-misattribution-1a.c" } */
extern void other_caller (void); extern void other_caller (void);
...@@ -15,5 +15,5 @@ caller(void (*func) (void)) ...@@ -15,5 +15,5 @@ caller(void (*func) (void))
func (); func ();
} }
/* { dg-final-use { scan-tree-dump "hist->count 1 hist->all 1" "tree_profile" } } */ /* { dg-final-use { scan-ipa-dump "hist->count 1 hist->all 1" "tree_profile_ipa" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
static int a1 (void) static int a1 (void)
{ {
...@@ -37,9 +37,7 @@ main (void) ...@@ -37,9 +37,7 @@ main (void)
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Indirect call -> direct call.* a1 transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* a1 transformation on insn" "tree_profile_ipa"} } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
int a[1000]; int a[1000];
int b[1000]; int b[1000];
int size=1; int size=1;
...@@ -13,10 +13,10 @@ main() ...@@ -13,10 +13,10 @@ main()
} }
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Single value 4 stringop" "tree_profile_ipa"} } */
/* Really this ought to simplify into assignment, but we are not there yet. */ /* Really this ought to simplify into assignment, but we are not there yet. */
/* a[0] = b[0] is what we fold the resulting memcpy into. */ /* a[0] = b[0] is what we fold the resulting memcpy into. */
/* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */ /* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */
/* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */ /* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
int a[1000]; int a[1000];
int b[1000]; int b[1000];
int size=1; int size=1;
...@@ -13,8 +13,8 @@ main() ...@@ -13,8 +13,8 @@ main()
} }
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Single value 4 stringop" "tree_profile_ipa"} } */
/* The versioned memset of size 4 should be optimized to an assignment. */ /* The versioned memset of size 4 should be optimized to an assignment. */
/* { dg-final-use { scan-tree-dump "a\\\[0\\\] = 168430090" "optimized"} } */ /* { dg-final-use { scan-tree-dump "a\\\[0\\\] = 168430090" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -ftracer -fdump-tree-tracer" } */ /* { dg-options "-O2 -ftracer -fdump-tree-tracer" } */
main () volatile int a, b, c;
int main ()
{ {
int i; int i;
int a, b, c;
for (i = 0; i < 1000; i++) for (i = 0; i < 1000; i++)
{ {
if (i % 17) if (i % 17)
...@@ -14,5 +14,5 @@ main () ...@@ -14,5 +14,5 @@ main ()
return 0; return 0;
} }
/* Superblock formation should produce two copies of the increment of c */ /* Superblock formation should produce two copies of the increment of c */
/* { dg-final-generate { scan-tree-dump-times "goto <bb 6>;" 2 "tracer" } } */ /* { dg-final-generate { scan-tree-dump-times "c =" 2 "tracer" } } */
/* { dg-final-use { cleanup-tree-dump "tracer" } } */ /* { dg-final-use { cleanup-tree-dump "tracer" } } */
/* { dg-options "-O2 -fdump-tree-tree_profile-blocks -fdump-tree-optimized-blocks" } */ /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa-blocks -fdump-tree-optimized-blocks" } */
int max = 33333; int max = 33333;
int a[8]; int a[8];
int int
...@@ -14,8 +14,8 @@ main () ...@@ -14,8 +14,8 @@ main ()
/* Loop header copying will peel away the initial conditional, so the loop body /* Loop header copying will peel away the initial conditional, so the loop body
is once reached directly from entry point of function, rest via loopback is once reached directly from entry point of function, rest via loopback
edge. */ edge. */
/* { dg-final-use { scan-tree-dump "count:33333" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "count:33333" "tree_profile_ipa"} } */
/* { dg-final-use { scan-tree-dump "count:33332" "optimized"} } */ /* { dg-final-use { scan-tree-dump "count:33332" "optimized"} } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
int a[1000]; int a[1000];
int b = 256; int b = 256;
int c = 257; int c = 257;
...@@ -15,8 +15,8 @@ main () ...@@ -15,8 +15,8 @@ main ()
} }
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Div.mod by constant n=257 transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Div.mod by constant n_\[0-9\]*=257 transformation on insn" "tree_profile_ipa"} } */
/* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* != 257\\)" "optimized"} } */ /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* != 257\\)" "optimized"} } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
unsigned int a[1000]; unsigned int a[1000];
unsigned int b = 256; unsigned int b = 256;
unsigned int c = 1024; unsigned int c = 1024;
...@@ -23,10 +23,10 @@ main () ...@@ -23,10 +23,10 @@ main ()
} }
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Mod power of 2 transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Mod power of 2 transformation on insn" "tree_profile_ipa" } } */
/* This is part of code checking that n is power of 2, so we are sure that the transformation /* This is part of code checking that n is power of 2, so we are sure that the transformation
didn't get optimized out. */ didn't get optimized out. */
/* { dg-final-use { scan-tree-dump "n_\[0-9\]* \\+ 0xffff" "optimized"} } */ /* { dg-final-use { scan-tree-dump "n_\[0-9\]* \\+ 0xffff" "optimized"} } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
unsigned int a[1000]; unsigned int a[1000];
unsigned int b = 257; unsigned int b = 257;
unsigned int c = 1023; unsigned int c = 1023;
...@@ -23,10 +23,10 @@ main () ...@@ -23,10 +23,10 @@ main ()
} }
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Mod subtract transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Mod subtract transformation on insn" "tree_profile_ipa" } } */
/* This is part of code checking that n is greater than the divisor so we are sure that it /* This is part of code checking that n is greater than the divisor so we are sure that it
didn't get optimized out. */ didn't get optimized out. */
/* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */ /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
unsigned int a[1000]; unsigned int a[1000];
unsigned int b = 999; unsigned int b = 999;
unsigned int c = 1002; unsigned int c = 1002;
...@@ -23,10 +23,10 @@ main () ...@@ -23,10 +23,10 @@ main ()
} }
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Mod subtract transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Mod subtract transformation on insn" "tree_profile_ipa" } } */
/* This is part of code checking that n is greater than the divisor so we are sure that it /* This is part of code checking that n is greater than the divisor so we are sure that it
didn't get optimized out. */ didn't get optimized out. */
/* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */ /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
int a[1000]; int a[1000];
int b=997; int b=997;
main() main()
...@@ -11,7 +11,7 @@ main() ...@@ -11,7 +11,7 @@ main()
a[i]/=b; a[i]/=b;
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Div.mod by constant b.*=997 transformation on insn" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Div.mod by constant b.*=997 transformation on insn" "tree_profile_ipa" } } */
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
/* { dg-options "-O2 -fdump-tree-tree_profile -mtune=core2" } */ /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa -mtune=core2" } */
/* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */ /* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */
#include <strings.h> #include <strings.h>
...@@ -22,5 +22,5 @@ int main() { ...@@ -22,5 +22,5 @@ int main() {
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Single value 8 stringop transformation on bzero" "tree_profile"} } */ /* { dg-final-use { scan-ipa-dump "Single value 8 stringop transformation on bzero" "tree_profile_ipa" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
...@@ -18,5 +18,5 @@ baz (void) ...@@ -18,5 +18,5 @@ baz (void)
return 6; return 6;
} }
/* { dg-final { scan-tree-dump-times "Inlining foo into baz" 0 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining foo into baz" 0 "einline"} } */
/* { dg-final { cleanup-tree-dump "einline2" } } */ /* { dg-final { cleanup-tree-dump "einline" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-einline2" } */ /* { dg-options "-O2 -fdump-tree-einline" } */
/* { dg-add-options bind_pic_locally } */ /* { dg-add-options bind_pic_locally } */
extern void inlined (); extern void inlined ();
...@@ -27,6 +27,6 @@ inline_me_too (void) ...@@ -27,6 +27,6 @@ inline_me_too (void)
{ {
inlined(); inlined();
} }
/* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline"} } */
/* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline2"} } */ /* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline"} } */
/* { dg-final { cleanup-tree-dump "einline2" } } */ /* { dg-final { cleanup-tree-dump "einline" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-einline2" } */ /* { dg-options "-O2 -fdump-tree-einline" } */
/* { dg-add-options bind_pic_locally } */ /* { dg-add-options bind_pic_locally } */
extern int rand(void); extern int rand(void);
...@@ -23,5 +23,5 @@ int main() ...@@ -23,5 +23,5 @@ int main()
} }
} }
/* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline2" } } */ /* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline" } } */
/* { dg-final { cleanup-tree-dump "einline2" } } */ /* { dg-final { cleanup-tree-dump "einline" } } */
...@@ -353,7 +353,6 @@ extern struct gimple_opt_pass pass_lower_eh; ...@@ -353,7 +353,6 @@ extern struct gimple_opt_pass pass_lower_eh;
extern struct gimple_opt_pass pass_lower_eh_dispatch; extern struct gimple_opt_pass pass_lower_eh_dispatch;
extern struct gimple_opt_pass pass_lower_resx; extern struct gimple_opt_pass pass_lower_resx;
extern struct gimple_opt_pass pass_build_cfg; extern struct gimple_opt_pass pass_build_cfg;
extern struct gimple_opt_pass pass_tree_profile;
extern struct gimple_opt_pass pass_early_tree_profile; extern struct gimple_opt_pass pass_early_tree_profile;
extern struct gimple_opt_pass pass_referenced_vars; extern struct gimple_opt_pass pass_referenced_vars;
extern struct gimple_opt_pass pass_cleanup_eh; extern struct gimple_opt_pass pass_cleanup_eh;
...@@ -447,7 +446,7 @@ extern struct gimple_opt_pass pass_split_functions; ...@@ -447,7 +446,7 @@ extern struct gimple_opt_pass pass_split_functions;
/* IPA Passes */ /* IPA Passes */
extern struct simple_ipa_opt_pass pass_ipa_lower_emutls; extern struct simple_ipa_opt_pass pass_ipa_lower_emutls;
extern struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility; extern struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility;
extern struct simple_ipa_opt_pass pass_ipa_early_inline; extern struct simple_ipa_opt_pass pass_ipa_tree_profile;
extern struct simple_ipa_opt_pass pass_early_local_passes; extern struct simple_ipa_opt_pass pass_early_local_passes;
......
...@@ -558,7 +558,7 @@ gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count, ...@@ -558,7 +558,7 @@ gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count,
gcov_type all) gcov_type all)
{ {
gimple stmt1, stmt2, stmt3; gimple stmt1, stmt2, stmt3;
tree tmp1, tmp2, tmpv; tree tmp0, tmp1, tmp2, tmpv;
gimple bb1end, bb2end, bb3end; gimple bb1end, bb2end, bb3end;
basic_block bb, bb2, bb3, bb4; basic_block bb, bb2, bb3, bb4;
tree optype, op1, op2; tree optype, op1, op2;
...@@ -576,19 +576,22 @@ gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count, ...@@ -576,19 +576,22 @@ gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count,
bb = gimple_bb (stmt); bb = gimple_bb (stmt);
gsi = gsi_for_stmt (stmt); gsi = gsi_for_stmt (stmt);
tmpv = create_tmp_var (optype, "PROF"); tmpv = create_tmp_reg (optype, "PROF");
tmp1 = create_tmp_var (optype, "PROF"); tmp0 = make_ssa_name (tmpv, NULL);
stmt1 = gimple_build_assign (tmpv, fold_convert (optype, value)); tmp1 = make_ssa_name (tmpv, NULL);
stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
SSA_NAME_DEF_STMT (tmp0) = stmt1;
stmt2 = gimple_build_assign (tmp1, op2); stmt2 = gimple_build_assign (tmp1, op2);
stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE); SSA_NAME_DEF_STMT (tmp1) = stmt2;
stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
bb1end = stmt3; bb1end = stmt3;
tmp2 = create_tmp_var (optype, "PROF"); tmp2 = make_rename_temp (optype, "PROF");
stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2, stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
op1, tmpv); op1, tmp0);
gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
bb2end = stmt1; bb2end = stmt1;
...@@ -711,7 +714,7 @@ static tree ...@@ -711,7 +714,7 @@ static tree
gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all) gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
{ {
gimple stmt1, stmt2, stmt3, stmt4; gimple stmt1, stmt2, stmt3, stmt4;
tree tmp2, tmp3; tree tmp2, tmp3, tmpv;
gimple bb1end, bb2end, bb3end; gimple bb1end, bb2end, bb3end;
basic_block bb, bb2, bb3, bb4; basic_block bb, bb2, bb3, bb4;
tree optype, op1, op2; tree optype, op1, op2;
...@@ -729,12 +732,15 @@ gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all) ...@@ -729,12 +732,15 @@ gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
bb = gimple_bb (stmt); bb = gimple_bb (stmt);
gsi = gsi_for_stmt (stmt); gsi = gsi_for_stmt (stmt);
result = create_tmp_var (optype, "PROF"); result = make_rename_temp (optype, "PROF");
tmp2 = create_tmp_var (optype, "PROF"); tmpv = create_tmp_var (optype, "PROF");
tmp3 = create_tmp_var (optype, "PROF"); tmp2 = make_ssa_name (tmpv, NULL);
tmp3 = make_ssa_name (tmpv, NULL);
stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2, stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2,
build_int_cst (optype, -1)); build_int_cst (optype, -1));
SSA_NAME_DEF_STMT (tmp2) = stmt2;
stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2); stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2);
SSA_NAME_DEF_STMT (tmp3) = stmt3;
stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0), stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
...@@ -881,10 +887,11 @@ gimple_mod_subtract (gimple stmt, int prob1, int prob2, int ncounts, ...@@ -881,10 +887,11 @@ gimple_mod_subtract (gimple stmt, int prob1, int prob2, int ncounts,
bb = gimple_bb (stmt); bb = gimple_bb (stmt);
gsi = gsi_for_stmt (stmt); gsi = gsi_for_stmt (stmt);
result = create_tmp_var (optype, "PROF"); result = make_rename_temp (optype, "PROF");
tmp1 = create_tmp_var (optype, "PROF"); tmp1 = make_ssa_name (create_tmp_var (optype, "PROF"), NULL);
stmt1 = gimple_build_assign (result, op1); stmt1 = gimple_build_assign (result, op1);
stmt2 = gimple_build_assign (tmp1, op2); stmt2 = gimple_build_assign (tmp1, op2);
SSA_NAME_DEF_STMT (tmp1) = stmt2;
stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE); stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
...@@ -1092,7 +1099,7 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, ...@@ -1092,7 +1099,7 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
int prob, gcov_type count, gcov_type all) int prob, gcov_type count, gcov_type all)
{ {
gimple dcall_stmt, load_stmt, cond_stmt; gimple dcall_stmt, load_stmt, cond_stmt;
tree tmp1, tmpv, tmp; tree tmp0, tmp1, tmpv, tmp;
basic_block cond_bb, dcall_bb, icall_bb, join_bb; basic_block cond_bb, dcall_bb, icall_bb, join_bb;
tree optype = build_pointer_type (void_type_node); tree optype = build_pointer_type (void_type_node);
edge e_cd, e_ci, e_di, e_dj, e_ij; edge e_cd, e_ci, e_di, e_dj, e_ij;
...@@ -1102,20 +1109,26 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, ...@@ -1102,20 +1109,26 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
cond_bb = gimple_bb (icall_stmt); cond_bb = gimple_bb (icall_stmt);
gsi = gsi_for_stmt (icall_stmt); gsi = gsi_for_stmt (icall_stmt);
tmpv = create_tmp_var (optype, "PROF"); tmpv = create_tmp_reg (optype, "PROF");
tmp1 = create_tmp_var (optype, "PROF"); tmp0 = make_ssa_name (tmpv, NULL);
tmp1 = make_ssa_name (tmpv, NULL);
tmp = unshare_expr (gimple_call_fn (icall_stmt)); tmp = unshare_expr (gimple_call_fn (icall_stmt));
load_stmt = gimple_build_assign (tmpv, tmp); load_stmt = gimple_build_assign (tmp0, tmp);
SSA_NAME_DEF_STMT (tmp0) = load_stmt;
gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
tmp = fold_convert (optype, build_addr (direct_call->decl, tmp = fold_convert (optype, build_addr (direct_call->decl,
current_function_decl)); current_function_decl));
load_stmt = gimple_build_assign (tmp1, tmp); load_stmt = gimple_build_assign (tmp1, tmp);
SSA_NAME_DEF_STMT (tmp1) = load_stmt;
gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE); cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
gimple_set_vdef (icall_stmt, NULL_TREE);
gimple_set_vuse (icall_stmt, NULL_TREE);
update_stmt (icall_stmt);
dcall_stmt = gimple_copy (icall_stmt); dcall_stmt = gimple_copy (icall_stmt);
gimple_call_set_fndecl (dcall_stmt, direct_call->decl); gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
...@@ -1151,6 +1164,21 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, ...@@ -1151,6 +1164,21 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
e_ij->probability = REG_BR_PROB_BASE; e_ij->probability = REG_BR_PROB_BASE;
e_ij->count = all - count; e_ij->count = all - count;
/* Insert PHI node for the call result if necessary. */
if (gimple_call_lhs (icall_stmt)
&& TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME)
{
tree result = gimple_call_lhs (icall_stmt);
gimple phi = create_phi_node (result, join_bb);
SSA_NAME_DEF_STMT (result) = phi;
gimple_call_set_lhs (icall_stmt,
make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
gimple_call_set_lhs (dcall_stmt,
make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
}
/* Fix eh edges */ /* Fix eh edges */
lp_nr = lookup_stmt_eh_lp (icall_stmt); lp_nr = lookup_stmt_eh_lp (icall_stmt);
if (lp_nr != 0) if (lp_nr != 0)
...@@ -1289,7 +1317,7 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob, ...@@ -1289,7 +1317,7 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob,
gcov_type count, gcov_type all) gcov_type count, gcov_type all)
{ {
gimple tmp_stmt, cond_stmt, icall_stmt; gimple tmp_stmt, cond_stmt, icall_stmt;
tree tmp1, tmpv, vcall_size, optype; tree tmp0, tmp1, tmpv, vcall_size, optype;
basic_block cond_bb, icall_bb, vcall_bb, join_bb; basic_block cond_bb, icall_bb, vcall_bb, join_bb;
edge e_ci, e_cv, e_iv, e_ij, e_vj; edge e_ci, e_cv, e_iv, e_ij, e_vj;
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
...@@ -1307,16 +1335,22 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob, ...@@ -1307,16 +1335,22 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob,
optype = TREE_TYPE (vcall_size); optype = TREE_TYPE (vcall_size);
tmpv = create_tmp_var (optype, "PROF"); tmpv = create_tmp_var (optype, "PROF");
tmp1 = create_tmp_var (optype, "PROF"); tmp0 = make_ssa_name (tmpv, NULL);
tmp_stmt = gimple_build_assign (tmpv, fold_convert (optype, icall_size)); tmp1 = make_ssa_name (tmpv, NULL);
tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
SSA_NAME_DEF_STMT (tmp0) = tmp_stmt;
gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
tmp_stmt = gimple_build_assign (tmp1, vcall_size); tmp_stmt = gimple_build_assign (tmp1, vcall_size);
SSA_NAME_DEF_STMT (tmp1) = tmp_stmt;
gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE); cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
gimple_set_vdef (vcall_stmt, NULL);
gimple_set_vuse (vcall_stmt, NULL);
update_stmt (vcall_stmt);
icall_stmt = gimple_copy (vcall_stmt); icall_stmt = gimple_copy (vcall_stmt);
gimple_call_set_arg (icall_stmt, size_arg, icall_size); gimple_call_set_arg (icall_stmt, size_arg, icall_size);
gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
......
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