Hi,

A couple of small patterns that repeat are generating a temporary, and
getting a function out of a CALL_EXPR (there are other changes that are
in the works where I ended up adding more repeats of these patterns).
There are convenience functions for these in the common parts of gcc,
use them instead.

Regstrapped on x86_64-linux-gnu, and committed to mainline.

Regards,
Iain.

---
gcc/d/ChangeLog:

        * d-codegen.cc: Include gimple-expr.h.
        (force_target_expr): Use create_tmp_var_raw.
        * decl.cc: Inlucde gimple-expr.h.
        (build_local_temp): Use create_tmp_var_raw.
        * intrinsics.cc (expand_intrinsic_rotate): Use get_callee_fndecl.
        (maybe_expand_intrinsic): Likewise.
---
 gcc/d/d-codegen.cc  |  6 ++----
 gcc/d/decl.cc       |  7 ++-----
 gcc/d/intrinsics.cc | 13 +++----------
 3 files changed, 7 insertions(+), 19 deletions(-)

diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc
index 8a8bf12e7fc..2d90899b37f 100644
--- a/gcc/d/d-codegen.cc
+++ b/gcc/d/d-codegen.cc
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "stor-layout.h"
 #include "attribs.h"
 #include "function.h"
+#include "gimple-expr.h"
 
 #include "d-tree.h"
 
@@ -623,11 +624,8 @@ build_target_expr (tree decl, tree exp)
 tree
 force_target_expr (tree exp)
 {
-  tree decl = build_decl (input_location, VAR_DECL, NULL_TREE,
-                         TREE_TYPE (exp));
+  tree decl = create_tmp_var_raw (TREE_TYPE (exp));
   DECL_CONTEXT (decl) = current_function_decl;
-  DECL_ARTIFICIAL (decl) = 1;
-  DECL_IGNORED_P (decl) = 1;
   layout_decl (decl, 0);
 
   return build_target_expr (decl, exp);
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index 5032ae02d6b..3caa465dd1e 100644
--- a/gcc/d/decl.cc
+++ b/gcc/d/decl.cc
@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "symtab-thunks.h"
+#include "gimple-expr.h"
 
 #include "d-tree.h"
 #include "d-target.h"
@@ -1465,11 +1466,7 @@ declare_local_var (VarDeclaration *var)
 tree
 build_local_temp (tree type)
 {
-  tree decl = build_decl (input_location, VAR_DECL, NULL_TREE, type);
-
-  DECL_CONTEXT (decl) = current_function_decl;
-  DECL_ARTIFICIAL (decl) = 1;
-  DECL_IGNORED_P (decl) = 1;
+  tree decl = create_tmp_var_raw (type);
   d_pushdecl (decl);
 
   return decl;
diff --git a/gcc/d/intrinsics.cc b/gcc/d/intrinsics.cc
index 0f96284473f..0dd5543fdd1 100644
--- a/gcc/d/intrinsics.cc
+++ b/gcc/d/intrinsics.cc
@@ -421,12 +421,8 @@ expand_intrinsic_rotate (intrinsic_code intrinsic, tree 
callexp)
     count = CALL_EXPR_ARG (callexp, 1);
   else
     {
-      tree callee = CALL_EXPR_FN (callexp);
-
-      if (TREE_CODE (callee) == ADDR_EXPR)
-       callee = TREE_OPERAND (callee, 0);
-
       /* Retrieve from the encoded template instantation.  */
+      tree callee = get_callee_fndecl (callexp);
       TemplateInstance *ti = DECL_LANG_FRONTEND (callee)->isInstantiated ();
       gcc_assert (ti && ti->tiargs && ti->tiargs->length == 2);
 
@@ -761,12 +757,9 @@ expand_volatile_store (tree callexp)
 tree
 maybe_expand_intrinsic (tree callexp)
 {
-  tree callee = CALL_EXPR_FN (callexp);
-
-  if (TREE_CODE (callee) == ADDR_EXPR)
-    callee = TREE_OPERAND (callee, 0);
+  tree callee = get_callee_fndecl (callexp);
 
-  if (TREE_CODE (callee) != FUNCTION_DECL)
+  if (callee == NULL_TREE || TREE_CODE (callee) != FUNCTION_DECL)
     return callexp;
 
   /* Don't expand CTFE-only intrinsics outside of semantic processing.  */
-- 
2.34.1

Reply via email to