This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Handle GIMPLE NOPs in is_maybe_undefined (PR, tree-optimization/79529).


On 02/16/2017 12:34 PM, Richard Biener wrote:
> Yes, we should handle all of the "hidden initialized" cases at
> 
>       /* 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)
>         continue;
> 
> maybe add a predicate for those, like
> 
>  ssa_defined_default_def_p ()
> 
> right next to ssa_undefined_value_p and use it from there as well.

Hi.

Done in second version of patch.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. Firefox w/ -flto and -O3
works fine.

Ready to be installed?
Martin
>From d98ab8fef6d634b73eeca74d11161e3cb7b59776 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Thu, 16 Feb 2017 17:07:51 +0100
Subject: [PATCH] Introduce ssa_defined_default_def_p function (PR
 tree-optimization/79529).

gcc/ChangeLog:

2017-02-16  Martin Liska  <mliska@suse.cz>

	* 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.
---
 gcc/tree-ssa-loop-unswitch.c |  4 +---
 gcc/tree-ssa.c               | 26 +++++++++++++++++++-------
 gcc/tree-ssa.h               |  2 ++
 3 files changed, 22 insertions(+), 10 deletions(-)

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,27 +1251,39 @@ tree_ssa_strip_useless_type_conversions (tree exp)
   return exp;
 }
 
-
-/* Return true if T, an SSA_NAME, has an undefined value.  PARTIAL is what
-   should be returned if the value is only partially undefined.  */
+/* Return true if T, as SSA_NAME, has an implicit default defined value.  */
 
 bool
-ssa_undefined_value_p (tree t, bool partial)
+ssa_defined_default_def_p (tree t)
 {
-  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;
+    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 false;
+    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.  */
+
+bool
+ssa_undefined_value_p (tree t, bool partial)
+{
+  gimple *def_stmt;
+
+  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);
-- 
2.11.0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]