This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Use PTA info in pure-const pass.
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, rguenther at suse dot de
- Date: Thu, 2 Jul 2009 15:15:36 +0200
- Subject: Use PTA info in pure-const pass.
Hi,
this patch makes ipa-pure-const to use alias oracle to figure out if
INDIRECT_REF is known to point only to local datastructures (and thus is valid
for const&pure functions).
Testcase is attached, in practice this seems to match relatively few times
(about 40 times in combine.c but it never actually makes difference as function
contains some nonlocal stuff anyway), but it is easy thing to do and I hope it
can make difference when stuff like iterators gets inlined.
Bootstrapped/regtested i686-linux, OK?
Honza
* gcc.dg/tree-ssa/local-pure-const.c: New testcase.
* ipa-pure-const.c (check_op): Use PTA info to see if indirect_ref is
local.
Index: testsuite/gcc.dg/tree-ssa/local-pure-const.c
===================================================================
*** testsuite/gcc.dg/tree-ssa/local-pure-const.c (revision 0)
--- testsuite/gcc.dg/tree-ssa/local-pure-const.c (revision 0)
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-local-pure-const1" } */
+ t(int a, int b, int c)
+ {
+ int *p;
+ if (a)
+ p = &a;
+ else
+ p = &c;
+ return *p;
+ }
+ /* { dg-final { scan-tree-dump-times "local memory is OK" 1 "local-pure-const1"} } */
+ /* { dg-final { scan-tree-dump-times "found to be const" 1 "local-pure-const1"} } */
+ /* { dg-final { cleanup-tree-dump "local-pure-const1" } } */
Index: ipa-pure-const.c
===================================================================
*** ipa-pure-const.c (revision 149169)
--- ipa-pure-const.c (working copy)
*************** check_decl (funct_state local,
*** 213,225 ****
static inline void
check_op (funct_state local, tree t, bool checking_write)
{
! if (TREE_THIS_VOLATILE (t))
{
local->pure_const_state = IPA_NEITHER;
if (dump_file)
fprintf (dump_file, " Volatile indirect ref is not const/pure\n");
return;
}
else if (checking_write)
{
local->pure_const_state = IPA_NEITHER;
--- 213,234 ----
static inline void
check_op (funct_state local, tree t, bool checking_write)
{
! t = get_base_address (t);
! if (t && TREE_THIS_VOLATILE (t))
{
local->pure_const_state = IPA_NEITHER;
if (dump_file)
fprintf (dump_file, " Volatile indirect ref is not const/pure\n");
return;
}
+ else if (t && TREE_CODE (t) == INDIRECT_REF
+ && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
+ && !ptr_deref_may_alias_global_p (TREE_OPERAND (t, 0)))
+ {
+ if (dump_file)
+ fprintf (dump_file, " Indirect ref to local memory is OK\n");
+ return;
+ }
else if (checking_write)
{
local->pure_const_state = IPA_NEITHER;