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]

[PATCH 7/7] Plug ipa-prop escape analysis into gimple_call_arg_flags


Hi,

this demonstrates how results of ipa-prop escape analysis from
previous patches can be used at a later stage of compilation by
directly returning them from gimple_call_arg_flags which currently
relies on fnspec annotations.

Bootstrapped and tested on x86_64-linux and also passes LTO bootstrap.
I have only had a brief look at behavior of this in SPEC 2006 and for
example in astar 1.19% of invocations of gimple_call_arg_flags return
noescape where we previously never did and in calculix this increases
from 15.62% (from annotations) to 18.14%.  Noclobber flag is reported
far less often still but for example in gamess that number raises from
5.21% to 7.66%.

Thanks,

Martin


2014-04-30  Martin Jambor  <mjambor@suse.cz>

	* gimple.c: Include cgraph.h.
	(gimple_call_arg_flags): Also query bitmaps in cgraph_node.

Index: src/gcc/gimple.c
===================================================================
--- src.orig/gcc/gimple.c
+++ src/gcc/gimple.c
@@ -47,7 +47,7 @@ along with GCC; see the file COPYING3.
 #include "demangle.h"
 #include "langhooks.h"
 #include "bitmap.h"
-
+#include "cgraph.h"
 
 /* All the tuples have their operand vector (if present) at the very bottom
    of the structure.  Therefore, the offset required to find the
@@ -1349,32 +1349,50 @@ int
 gimple_call_arg_flags (const_gimple stmt, unsigned arg)
 {
   tree attr = gimple_call_fnspec (stmt);
+  int ret;
 
-  if (!attr || 1 + arg >= (unsigned) TREE_STRING_LENGTH (attr))
-    return 0;
-
-  switch (TREE_STRING_POINTER (attr)[1 + arg])
+  if (attr && 1 + arg < (unsigned) TREE_STRING_LENGTH (attr))
     {
-    case 'x':
-    case 'X':
-      return EAF_UNUSED;
-
-    case 'R':
-      return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
-
-    case 'r':
-      return EAF_NOCLOBBER | EAF_NOESCAPE;
-
-    case 'W':
-      return EAF_DIRECT | EAF_NOESCAPE;
-
-    case 'w':
-      return EAF_NOESCAPE;
+      switch (TREE_STRING_POINTER (attr)[1 + arg])
+	{
+	case 'x':
+	case 'X':
+	  ret = EAF_UNUSED;
+	  break;
+	case 'R':
+	  ret = EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
+	  break;
+	case 'r':
+	  ret = EAF_NOCLOBBER | EAF_NOESCAPE;
+	  break;
+	case 'W':
+	  ret = EAF_DIRECT | EAF_NOESCAPE;
+	  break;
+	case 'w':
+	  ret = EAF_NOESCAPE;
+	  break;
+	case '.':
+	default:
+	  ret = 0;
+	}
+    }
+  else
+    ret = 0;
 
-    case '.':
-    default:
-      return 0;
+  tree callee_decl = gimple_call_fndecl (stmt);
+  if (callee_decl)
+    {
+      cgraph_node *callee_node = cgraph_get_node (callee_decl);
+      if (callee_node)
+	{
+	  if (cgraph_param_noescape_p (callee_node, arg))
+	    ret |= EAF_NOESCAPE;
+	  if (cgraph_param_noclobber_p (callee_node, arg))
+	    ret |= EAF_NOCLOBBER;
+	}
     }
+
+  return ret;
 }
 
 /* Detects return flags for the call STMT.  */


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