Commit 18d5e416 by Jan Hubicka Committed by Jan Hubicka

re PR tree-optimization/1046 (gcc less efficient than jdk for recursion with -finline-functions)

	PR tree-optimization/1046
	* tree-tailcall.c (suitable_for_tail_call_opt_p): Use TREE_ADDRESSABLE
	when alias info is not ready.
	(pass_tail_recursion): Do not require aliasing.
	* tree-ssa-copyrename.c (pass_rename_ssa_cop): Likewise.
	* tree-ssa-ccp.c (pass_ccp, pass_fold_builtins): Likewise.
	* tree-ssa-copy.c (pass_copy_prop): Likewise.
	* tree-ssa-forwprop.c (pass_forwprop): Likewise.
	* tree-ssa-dce.c (pass_dce, pass_dce_loop, pass_cd_dce): Likewise.
	* passes.c (init_optimization_passes): Execute rename_ssa_copies,
	ccp, forwprop, copy_prop, merge_phi, copy_prop, dce and tail recursion
	before inlining.
	* tree-ssa-operands.c (add_virtual_operand, get_indirect_ref_operand):
	When aliasing is not build, mark statement as volatile.

From-SVN: r120680
parent 78392049
2007-01-11 Jan Hubicka <jh@suse.cz>
* gcc.dg/tree-ssa/tailrecursion-4.c: Update dump file.
* gcc.dg/tree-ssa/tailrecursion-1.c: Update dump file.
* gcc.dg/tree-ssa/tailrecursion-2.c: Update dump file.
* gcc.dg/tree-ssa/tailrecursion-3.c: Update dump file.
* gcc.dg/tree-ssa/pr21658.c: Likewise.
* gcc.dg/tree-ssa/pr15349.c: Likewise.
* gcc.dg/tree-ssa/pr25501.c: Likewise.
* gcc.dg/tree-ssa/vrp11.c: Make more complex so it still test
transformation in question.
* gcc.dg/tree-ssa/vrp05.c: Likewise.
* gcc.dg/tree-ssa/pr20701.c: Likewise.
* gcc.dg/always_inline3.c: Likewise.
2007-01-10 Mark Mitchell <mark@codesourcery.com> 2007-01-10 Mark Mitchell <mark@codesourcery.com>
PR c++/28999 PR c++/28999
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Winline -O2" } */ /* { dg-options "-Winline -O2" } */
void do_something_evil (void);
inline __attribute__ ((always_inline)) void inline __attribute__ ((always_inline)) void
q2(void) q2(void)
{ /* { dg-error "recursive" "" } */ { /* { dg-error "recursive" "" } */
do_something_evil ();
q2(); /* { dg-error "called from here" "" } */ q2(); /* { dg-error "called from here" "" } */
q2(); /* { dg-error "called from here" "" } */ q2(); /* { dg-error "called from here" "" } */
} }
...@@ -22,5 +22,5 @@ foo (int a, int b) ...@@ -22,5 +22,5 @@ foo (int a, int b)
return t; return t;
} }
/* { dg-final { scan-tree-dump-times "PHI" 1 "mergephi"} } */ /* { dg-final { scan-tree-dump-times "PHI" 1 "mergephi2"} } */
/* { dg-final { cleanup-tree-dump "mergephi" } } */ /* { dg-final { cleanup-tree-dump "mergephi2" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp1" } */ /* { dg-options "-O2 -fdump-tree-vrp2 -fno-early-inlining" } */
typedef struct { typedef struct {
int code; int code;
} *rtx; } *rtx;
static inline void *zero ()
{
return 0;
}
static inline int three ()
{
return 3;
}
int int
can_combine_p (rtx insn, rtx elt) can_combine_p (rtx insn, rtx elt)
{ {
rtx set; rtx set;
set = 0; set = zero ();
if (insn->code == 3) if (insn->code == three ())
set = insn; set = insn;
else else
{ {
set = elt; set = elt;
if (set == 0) if (set == zero ())
return 0; return 0;
} }
if (set == 0) if (set == zero ())
return 1; return 1;
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate.*to 0" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate.*to 0" 1 "vrp2" } } */
/* { dg-final { cleanup-tree-dump "vrp1" } } */ /* { dg-final { cleanup-tree-dump "vrp2" } } */
...@@ -17,5 +17,5 @@ f (void) ...@@ -17,5 +17,5 @@ f (void)
link_error (); link_error ();
} }
/* { dg-final { scan-tree-dump-times "Folded statement: if " 1 "ccp"} } */ /* { dg-final { scan-tree-dump-times "Folded statement: if " 1 "ccp1"} } */
/* { dg-final { cleanup-tree-dump "ccp" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */
...@@ -32,5 +32,5 @@ foo (int a) ...@@ -32,5 +32,5 @@ foo (int a)
return 13; return 13;
} }
/* { dg-final { scan-tree-dump-times "Removing basic block" 0 "mergephi"} } */ /* { dg-final { scan-tree-dump-times "Removing basic block" 0 "mergephi1"} } */
/* { dg-final { cleanup-tree-dump "mergephi" } } */ /* { dg-final { cleanup-tree-dump "mergephi" } } */
...@@ -8,5 +8,5 @@ t(int a) ...@@ -8,5 +8,5 @@ t(int a)
else else
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 1 "tailr"} } */ /* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 1 "tailr1"} } */
/* { dg-final { cleanup-tree-dump "tailr" } } */ /* { dg-final { cleanup-tree-dump "tailr1" } } */
...@@ -9,5 +9,5 @@ t(char *a) ...@@ -9,5 +9,5 @@ t(char *a)
else else
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 1 "tailr"} } */ /* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 1 "tailr1"} } */
/* { dg-final { cleanup-tree-dump "tailr" } } */ /* { dg-final { cleanup-tree-dump "tailr1" } } */
...@@ -12,5 +12,5 @@ t(int a) ...@@ -12,5 +12,5 @@ t(int a)
r=r; r=r;
return r; return r;
} }
/* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 1 "tailr"} } */ /* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 1 "tailr1"} } */
/* { dg-final { cleanup-tree-dump "tailr" } } */ /* { dg-final { cleanup-tree-dump "tailr1" } } */
...@@ -14,5 +14,5 @@ t(int a) ...@@ -14,5 +14,5 @@ t(int a)
r=r; r=r;
return r; return r;
} }
/* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 2 "tailr"} } */ /* { dg-final { scan-tree-dump-times "Eliminated tail recursion" 2 "tailr1"} } */
/* { dg-final { cleanup-tree-dump "tailr" } } */ /* { dg-final { cleanup-tree-dump "tailr1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp1" } */ /* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining" } */
inline int ten()
{
return 10;
}
inline int zero()
{
return 0;
}
foo (int k, int j) foo (int k, int j)
{ {
if (k >= 10) if (k >= ten())
{ {
if (j > k) if (j > k)
{ {
/* We should fold this to if (1). */ /* We should fold this to if (1). */
if (j > 0) if (j > zero())
return j; return j;
} }
} }
return j; return j+1;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp1" } } */
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp1" } */ /* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining" } */
int
bounce (int arg)
{
return arg;
}
foo (int k, int j, int z) foo (int k, int j, int z)
{ {
...@@ -8,13 +14,13 @@ foo (int k, int j, int z) ...@@ -8,13 +14,13 @@ foo (int k, int j, int z)
if (j > k) if (j > k)
{ {
/* We should fold this to if (1). */ /* We should fold this to if (1). */
if (j > z) if (j > bounce (z))
return j; return j;
} }
} }
return j; return j+1;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp2" } } */
/* { dg-final { cleanup-tree-dump "vrp1" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
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