From ad4c44d20ece1fbfb9aced1fbcdab8928d702c73 Mon Sep 17 00:00:00 2001
From: Iain Buclaw <ibuclaw@gdcproject.org>
Date: Tue, 28 Jun 2022 18:49:27 +0200
Subject: [PATCH] d: Use create_tmp_var_raw and get_callee_fndecl

A couple of small patterns that repeat are generating a temporary, and
getting a function out of a CALL_EXPR.  There are convenience functions
for these in the common parts of gcc, use them instead.

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 8a8bf12e7fc1..2d90899b37f9 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 5032ae02d6b7..3caa465dd1ed 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 0f96284473fc..0dd5543fdd1a 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.  */
-- 
GitLab