Commit 0a42aa4e by Jan Hubicka Committed by Jan Hubicka

ipa-pure-const.c (special_builtlin_state): New function.

	* ipa-pure-const.c (special_builtlin_state): New function.
	(check_call): Use it instead of special casign BUILT_IN_RETURN.
	(propagate_pure_const): Use it.

	* gcc.dg/ipa/pure-const-2.c: New testcase.

From-SVN: r160615
parent f6bcb591
2010-06-11 Jan Hubicka <jh@suse.cz> 2010-06-11 Jan Hubicka <jh@suse.cz>
* ipa-pure-const.c (special_builtlin_state): New function.
(check_call): Use it instead of special casign BUILT_IN_RETURN.
(propagate_pure_const): Use it.
2010-06-11 Jan Hubicka <jh@suse.cz>
* df-problems.c (df_live_scratch): Convert to bitmap_head. * df-problems.c (df_live_scratch): Convert to bitmap_head.
(df_live_alloc): Initialize df_live_scratch when initializing (df_live_alloc): Initialize df_live_scratch when initializing
problem_data. problem_data.
......
...@@ -420,6 +420,40 @@ worse_state (enum pure_const_state_e *state, bool *looping, ...@@ -420,6 +420,40 @@ worse_state (enum pure_const_state_e *state, bool *looping,
*looping = MAX (*looping, looping2); *looping = MAX (*looping, looping2);
} }
/* Recognize special cases of builtins that are by themself not pure or const
but function using them is. */
static bool
special_builtlin_state (enum pure_const_state_e *state, bool *looping,
tree callee)
{
if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_RETURN:
case BUILT_IN_UNREACHABLE:
case BUILT_IN_ALLOCA:
case BUILT_IN_STACK_SAVE:
case BUILT_IN_STACK_RESTORE:
case BUILT_IN_EH_POINTER:
case BUILT_IN_EH_FILTER:
case BUILT_IN_UNWIND_RESUME:
case BUILT_IN_CXA_END_CLEANUP:
case BUILT_IN_EH_COPY_VALUES:
case BUILT_IN_FRAME_ADDRESS:
case BUILT_IN_APPLY:
case BUILT_IN_APPLY_ARGS:
case BUILT_IN_ARGS_INFO:
*looping = false;
*state = IPA_CONST;
return true;
case BUILT_IN_PREFETCH:
*looping = true;
*state = IPA_CONST;
return true;
}
return false;
}
/* Check the parameters of a function call to CALL_EXPR to see if /* Check the parameters of a function call to CALL_EXPR to see if
there are any references in the parameters that are not allowed for there are any references in the parameters that are not allowed for
pure or const functions. Also check to see if this is either an pure or const functions. Also check to see if this is either an
...@@ -470,9 +504,15 @@ check_call (funct_state local, gimple call, bool ipa) ...@@ -470,9 +504,15 @@ check_call (funct_state local, gimple call, bool ipa)
graph. */ graph. */
if (callee_t) if (callee_t)
{ {
/* built_in_return is really just an return statemnt. */ enum pure_const_state_e call_state;
if (gimple_call_builtin_p (call, BUILT_IN_RETURN)) bool call_looping;
return;
if (special_builtlin_state (&call_state, &call_looping, callee_t))
{
worse_state (&local->pure_const_state, &local->looping,
call_state, call_looping);
return;
}
/* When bad things happen to bad functions, they cannot be const /* When bad things happen to bad functions, they cannot be const
or pure. */ or pure. */
if (setjmp_call_p (callee_t)) if (setjmp_call_p (callee_t))
...@@ -1153,10 +1193,13 @@ propagate_pure_const (void) ...@@ -1153,10 +1193,13 @@ propagate_pure_const (void)
edge_looping = y_l->looping; edge_looping = y_l->looping;
} }
} }
else if (special_builtlin_state (&edge_state, &edge_looping,
y->decl))
;
else else
state_from_flags (&edge_state, &edge_looping, state_from_flags (&edge_state, &edge_looping,
flags_from_decl_or_type (y->decl), flags_from_decl_or_type (y->decl),
cgraph_edge_cannot_lead_to_return (e)); cgraph_edge_cannot_lead_to_return (e));
/* Merge the results with what we already know. */ /* Merge the results with what we already know. */
better_state (&edge_state, &edge_looping, better_state (&edge_state, &edge_looping,
......
2010-06-11 Jan Hubicka <jh@suse.cz> 2010-06-11 Jan Hubicka <jh@suse.cz>
* testsuite/gcc.dg/noreturn-7.c: Update. * gcc.dg/ipa/pure-const-2.c: New testcase.
* testsuite/gcc.dg/noreturn-4.c: Update.
2010-06-11 Jan Hubicka <jh@suse.cz>
* gcc.dg/noreturn-7.c: Update.
* gcc.dg/noreturn-4.c: Update.
2010-06-10 Dodji Seketeli <dodji@redhat.com> 2010-06-10 Dodji Seketeli <dodji@redhat.com>
......
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-local-pure-const1 -fdump-tree-optimized" } */
static __attribute__ ((noinline, noclone))
int i_am_pure(char *c, int n)
{
char *d=__builtin_alloca (n);
int i;
int sum;
for (i=0;i<n;i++)
d[i] = c[i];
for (i=0;i<n;i++)
d[i] *= c[n-i];
for (i=0;i<n;i++)
sum+=d[i];
if (sum)
__builtin_unreachable ();
return sum;
}
char array[11];
int
main(void)
{
i_am_pure (array,5);
i_am_pure (array,11);
return 0;
}
/* { dg-final { scan-tree-dump "found to be pure: i_am_pure" "local-pure-const1"} } */
/* { dg-final { scan-tree-dump-not "i_am_pure" "optimized"} } */
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