diff options
author | Richard Biener <rguenther@suse.de> | 2019-04-15 10:09:08 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-04-15 10:09:08 +0000 |
commit | 869032b176d57ca8c8864a7818394106ca665d06 (patch) | |
tree | 091ea0a9c663a03956c774a6a3a164628d4e9f04 /gcc/tree.c | |
parent | 79a18702006d53bc378affcd5dd6c8df7883b58f (diff) | |
download | gcc-869032b176d57ca8c8864a7818394106ca665d06.zip gcc-869032b176d57ca8c8864a7818394106ca665d06.tar.gz gcc-869032b176d57ca8c8864a7818394106ca665d06.tar.bz2 |
re PR ipa/88936 (-fipa-pta breaks bash (incorrect optimisation of recursive static function))
2019-04-15 Richard Biener <rguenther@suse.de>
PR ipa/88936
* tree.h (auto_var_p): Declare.
* tree.c (auto_var_p): New function, split out from ...
(auto_var_in_fn_p): ... here.
* tree-ssa-structalias.c (struct variable_info): Add shadow_var_uid
member.
(new_var_info): Initialize it.
(set_uids_in_ptset): Also set the shadow variable uid if required.
(ipa_pta_execute): Postprocess points-to solutions assigning
shadow variable uids for locals that may reach their containing
function recursively.
* tree-ssa-ccp.c (fold_builtin_alloca_with_align): Do not
assert but instead check whether the points-to solution is
a singleton.
* gcc.dg/torture/pr88936-1.c: New testcase.
* gcc.dg/torture/pr88936-2.c: Likewise.
* gcc.dg/torture/pr88936-3.c: Likewise.
From-SVN: r270366
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -9268,17 +9268,25 @@ get_type_static_bounds (const_tree type, mpz_t min, mpz_t max) } } +/* Return true if VAR is an automatic variable. */ + +bool +auto_var_p (const_tree var) +{ + return ((((VAR_P (var) && ! DECL_EXTERNAL (var)) + || TREE_CODE (var) == PARM_DECL) + && ! TREE_STATIC (var)) + || TREE_CODE (var) == RESULT_DECL); +} + /* Return true if VAR is an automatic variable defined in function FN. */ bool auto_var_in_fn_p (const_tree var, const_tree fn) { return (DECL_P (var) && DECL_CONTEXT (var) == fn - && ((((VAR_P (var) && ! DECL_EXTERNAL (var)) - || TREE_CODE (var) == PARM_DECL) - && ! TREE_STATIC (var)) - || TREE_CODE (var) == LABEL_DECL - || TREE_CODE (var) == RESULT_DECL)); + && (auto_var_p (var) + || TREE_CODE (var) == LABEL_DECL)); } /* Subprogram of following function. Called by walk_tree. |