From c6b0d21d49a2605b2c667cec37b31140133b1fd5 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Fri, 17 Feb 2017 15:36:08 +0100 Subject: [PATCH] Introduce ssa_defined_default_def_p function (PR tree-optimization/79529). 2017-02-17 Martin Liska PR tree-optimization/79529 * tree-ssa-loop-unswitch.c (is_maybe_undefined): Use ssa_defined_default_def_p to handle cases which are implicitly defined. * tree-ssa.c (ssa_defined_default_def_p): New function. (ssa_undefined_value_p): Use ssa_defined_default_def_p to handle cases which are implicitly defined. * tree-ssa.h (ssa_defined_default_def_p): Declare. From-SVN: r245530 --- gcc/ChangeLog | 11 +++++++++++ gcc/tree-ssa-loop-unswitch.c | 4 +--- gcc/tree-ssa.c | 36 ++++++++++++++++++++++++------------ gcc/tree-ssa.h | 2 ++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7c6d59874f..defd5431ef1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2017-02-17 Martin Liska + + PR tree-optimization/79529 + * tree-ssa-loop-unswitch.c (is_maybe_undefined): Use + ssa_defined_default_def_p to handle cases which are implicitly + defined. + * tree-ssa.c (ssa_defined_default_def_p): New function. + (ssa_undefined_value_p): Use ssa_defined_default_def_p to handle cases + which are implicitly defined. + * tree-ssa.h (ssa_defined_default_def_p): Declare. + 2017-02-17 Richard Biener PR middle-end/79576 diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c index afa04e9d110..1845148666d 100644 --- a/gcc/tree-ssa-loop-unswitch.c +++ b/gcc/tree-ssa-loop-unswitch.c @@ -134,9 +134,7 @@ is_maybe_undefined (const tree name, gimple *stmt, struct loop *loop) if (ssa_undefined_value_p (t, true)) return true; - /* A PARM_DECL will not have an SSA_NAME_DEF_STMT. Parameters - get their initial value from function entry. */ - if (SSA_NAME_VAR (t) && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL) + if (ssa_defined_default_def_p (t)) continue; gimple *def = SSA_NAME_DEF_STMT (t); diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 28020b003f8..831fd61e15f 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1251,6 +1251,29 @@ tree_ssa_strip_useless_type_conversions (tree exp) return exp; } +/* Return true if T, as SSA_NAME, has an implicit default defined value. */ + +bool +ssa_defined_default_def_p (tree t) +{ + tree var = SSA_NAME_VAR (t); + + if (!var) + ; + /* Parameters get their initial value from the function entry. */ + else if (TREE_CODE (var) == PARM_DECL) + return true; + /* When returning by reference the return address is actually a hidden + parameter. */ + else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var)) + return true; + /* Hard register variables get their initial value from the ether. */ + else if (VAR_P (var) && DECL_HARD_REGISTER (var)) + return true; + + return false; +} + /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what should be returned if the value is only partially undefined. */ @@ -1259,19 +1282,8 @@ bool ssa_undefined_value_p (tree t, bool partial) { gimple *def_stmt; - tree var = SSA_NAME_VAR (t); - if (!var) - ; - /* Parameters get their initial value from the function entry. */ - else if (TREE_CODE (var) == PARM_DECL) - return false; - /* When returning by reference the return address is actually a hidden - parameter. */ - else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var)) - return false; - /* Hard register variables get their initial value from the ether. */ - else if (VAR_P (var) && DECL_HARD_REGISTER (var)) + if (ssa_defined_default_def_p (t)) return false; /* The value is undefined iff its definition statement is empty. */ diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h index 6d16ba9f6a0..c99b5eaee82 100644 --- a/gcc/tree-ssa.h +++ b/gcc/tree-ssa.h @@ -50,6 +50,8 @@ extern void delete_tree_ssa (function *); extern bool tree_ssa_useless_type_conversion (tree); extern tree tree_ssa_strip_useless_type_conversions (tree); + +extern bool ssa_defined_default_def_p (tree t); extern bool ssa_undefined_value_p (tree, bool = true); extern bool gimple_uses_undefined_value_p (gimple *); extern void execute_update_addresses_taken (void);