summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-structalias.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-10-09 11:43:46 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-10-09 11:43:46 +0000
commitfe8a86e1f445c4f97c06ddc36ce68ca40627a1cc (patch)
tree341348eca31d64f1441d8b0b5f56996fff544090 /gcc/tree-ssa-structalias.c
parentc885142a15687c39f6f46c23d7c40afc817ff7a9 (diff)
re PR middle-end/63155 (memory hog)
2018-10-09 Richard Biener <rguenther@suse.de> PR tree-optimization/63155 * tree-ssa-structalias.c: Include tree-ssa.h. (get_constraint_for_ssa_var): For undefs return nothing_id. (find_func_aliases): Cleanup PHI handling. From-SVN: r264956
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r--gcc/tree-ssa-structalias.c48
1 files changed, 22 insertions, 26 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 22558351138..06ac0016e03 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -42,6 +42,7 @@
#include "varasm.h"
#include "stringpool.h"
#include "attribs.h"
+#include "tree-ssa.h"
/* The idea behind this analyzer is to generate set constraints from the
program, then solve the resulting constraints in order to generate the
@@ -2928,15 +2929,26 @@ get_constraint_for_ssa_var (tree t, vec<ce_s> *results, bool address_p)
/* We allow FUNCTION_DECLs here even though it doesn't make much sense. */
gcc_assert (TREE_CODE (t) == SSA_NAME || DECL_P (t));
- /* For parameters, get at the points-to set for the actual parm
- decl. */
if (TREE_CODE (t) == SSA_NAME
- && SSA_NAME_IS_DEFAULT_DEF (t)
- && (TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
- || TREE_CODE (SSA_NAME_VAR (t)) == RESULT_DECL))
+ && SSA_NAME_IS_DEFAULT_DEF (t))
{
- get_constraint_for_ssa_var (SSA_NAME_VAR (t), results, address_p);
- return;
+ /* For parameters, get at the points-to set for the actual parm
+ decl. */
+ if (TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
+ || TREE_CODE (SSA_NAME_VAR (t)) == RESULT_DECL)
+ {
+ get_constraint_for_ssa_var (SSA_NAME_VAR (t), results, address_p);
+ return;
+ }
+ /* For undefined SSA names return nothing. */
+ else if (!ssa_defined_default_def_p (t))
+ {
+ cexpr.var = nothing_id;
+ cexpr.type = SCALAR;
+ cexpr.offset = 0;
+ results->safe_push (cexpr);
+ return;
+ }
}
/* For global variables resort to the alias target. */
@@ -4833,35 +4845,19 @@ find_func_aliases (struct function *fn, gimple *origt)
gimple *t = origt;
auto_vec<ce_s, 16> lhsc;
auto_vec<ce_s, 16> rhsc;
- struct constraint_expr *c;
varinfo_t fi;
/* Now build constraints expressions. */
if (gimple_code (t) == GIMPLE_PHI)
{
- size_t i;
- unsigned int j;
-
/* For a phi node, assign all the arguments to
the result. */
get_constraint_for (gimple_phi_result (t), &lhsc);
- for (i = 0; i < gimple_phi_num_args (t); i++)
+ for (unsigned i = 0; i < gimple_phi_num_args (t); i++)
{
- tree strippedrhs = PHI_ARG_DEF (t, i);
-
- STRIP_NOPS (strippedrhs);
get_constraint_for_rhs (gimple_phi_arg_def (t, i), &rhsc);
-
- FOR_EACH_VEC_ELT (lhsc, j, c)
- {
- struct constraint_expr *c2;
- while (rhsc.length () > 0)
- {
- c2 = &rhsc.last ();
- process_constraint (new_constraint (*c, *c2));
- rhsc.pop ();
- }
- }
+ process_all_all_constraints (lhsc, rhsc);
+ rhsc.truncate (0);
}
}
/* In IPA mode, we need to generate constraints to pass call