Commit 13335ae6 by Andrew Pinski Committed by Andrew Pinski

re PR tree-optimization/29964 (function with volatile operators still found to be pure)

2006-11-24  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/29964
        * ipa-pure-const.c (check_tree): If the original tree
        is volatile return early and say the function is not pure
        nor const.  Remove the volatile check for writes.
        (analyze_function): Print out the result of the local
        analysis pass.

2006-11-24  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/29964
        * gcc.dg/pure-1.c: New test.

From-SVN: r119162
parent db2675d3
2006-11-24 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR tree-opt/29964
* ipa-pure-const.c (check_tree): If the original tree
is volatile return early and say the function is not pure
nor const. Remove the volatile check for writes.
(analyze_function): Print out the result of the local
analysis pass.
2006-11-24 Joseph Myers <joseph@codesourcery.com>
* config/rs6000/eabispe.h (TARGET_DEFAULT): Include
......
......@@ -166,6 +166,14 @@ check_tree (funct_state local, tree t, bool checking_write)
if ((TREE_CODE (t) == EXC_PTR_EXPR) || (TREE_CODE (t) == FILTER_EXPR))
return;
/* Any tree which is volatile disqualifies thie function from being
const or pure. */
if (TREE_THIS_VOLATILE (t))
{
local->pure_const_state = IPA_NEITHER;
return;
}
while (TREE_CODE (t) == REALPART_EXPR
|| TREE_CODE (t) == IMAGPART_EXPR
|| handled_component_p (t))
......@@ -183,12 +191,13 @@ check_tree (funct_state local, tree t, bool checking_write)
/* Any indirect reference that occurs on the lhs
disqualifies the function from being pure or const. Any
indirect reference to a volatile disqualifies the
function from being pure or const. Any indirect
reference that occurs on the rhs disqualifies the
indirect reference that occurs on the rhs disqualifies the
function from being const. */
if (checking_write || TREE_THIS_VOLATILE (t))
local->pure_const_state = IPA_NEITHER;
if (checking_write)
{
local->pure_const_state = IPA_NEITHER;
return;
}
else if (local->pure_const_state == IPA_CONST)
local->pure_const_state = IPA_PURE;
}
......@@ -541,7 +550,7 @@ analyze_function (struct cgraph_node *fn)
walk_tree (bsi_stmt_ptr (bsi), scan_function,
fn, visited_nodes);
if (l->pure_const_state == IPA_NEITHER)
return;
goto end;
}
}
......@@ -568,6 +577,14 @@ analyze_function (struct cgraph_node *fn)
pop_cfun ();
}
}
end:
if (dump_file)
{
fprintf (dump_file, "after local analysis of %s with initial value = %d\n ",
cgraph_node_name (fn),
l->pure_const_state);
}
}
......
2006-11-24 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR tree-opt/29964
* gcc.dg/pure-1.c: New test.
2006-11-24 Joseph Myers <joseph@codesourcery.com>
* g++.dg/eh/simd-2.C: Use -O -w in general for PowerPC.
/* Regression test for PR middle-end/23584 */
/* Verify that dereferencing a volatile element in a struct causes
the function not be pure. */
/* { dg-do compile } */
/* { dg-options "-O1 -fdump-ipa-pure-const" } */
struct test_a { volatile int a; };
int func_a(struct test_a *a)
{
return a->a;
}
/* { dg-final { scan-ipa-dump-not "found to be pure: func_a" "pure-const" } } */
/* { dg-final { cleanup-ipa-dump "pure-const" } } */
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