From patchwork Sun May 17 14:27:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Buclaw X-Patchwork-Id: 1292159 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=lo0/M+q8; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49Q4HQ637qz9sT8 for ; Mon, 18 May 2020 00:27:45 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 75345388700D; Sun, 17 May 2020 14:27:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 75345388700D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1589725661; bh=eHHDDIBT4NokkEWRGB+9Y5CBFr26KG56dcT3rSonGIM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=lo0/M+q8AzGtMXiqNzZtbgL8SvCtPDgn55EIM37y99YP16EPmFc2EDKQ3O6RvAJdW 4VlFaMkBfiFVr6thz6jHn1rVOHHfbvBdJYbq9yVjFe/kGKAquhBUpEwFgBlgXUe8lq l9zxXsv4QfLU2YyaSXcPO6DuUg1PZgq8iujr5h58= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout-p-102.mailbox.org (mout-p-102.mailbox.org [80.241.56.152]) by sourceware.org (Postfix) with ESMTPS id 36CA63851C00 for ; Sun, 17 May 2020 14:27:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 36CA63851C00 Received: from smtp2.mailbox.org (smtp2.mailbox.org [IPv6:2001:67c:2050:105:465:1:2:0]) (using TLSv1.2 with cipher ECDHE-RSA-CHACHA20-POLY1305 (256/256 bits)) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 49Q4HF0WRPzKmTC for ; Sun, 17 May 2020 16:27:37 +0200 (CEST) X-Virus-Scanned: amavisd-new at heinlein-support.de Received: from smtp2.mailbox.org ([80.241.60.241]) by spamfilter01.heinlein-hosting.de (spamfilter01.heinlein-hosting.de [80.241.56.115]) (amavisd-new, port 10030) with ESMTP id vVSnvqT34YjR for ; Sun, 17 May 2020 16:27:33 +0200 (CEST) To: gcc-patches@gcc.gnu.org Subject: [committed][GCC10] d: Fix ICE in verify_gimple_stmt, at tree-cfg.c:4959 Date: Sun, 17 May 2020 16:27:32 +0200 Message-Id: <20200517142732.9942-1-ibuclaw@gdcproject.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: D1C28174A X-Rspamd-Score: -2.33 / 15.00 / 15.00 X-Spam-Status: No, score=-18.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_NUMSUBJECT, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_ABUSE_SURBL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Iain Buclaw via Gcc-patches From: Iain Buclaw Reply-To: Iain Buclaw Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Hi, This patch has been backported from mainline r11-154. The ICE is also present on the gcc-9 branch, and this applies cleanly there as well, so will send out another email for that backport. Bootstrapped and regression tested on x86_64-linux-gnu, and committed to the gcc-10 branch. Regards Iain --- gcc/d/ChangeLog: PR d/94970 * d-codegen.cc (force_target_expr): Move create_temporary_var implementation inline here. (create_temporary_var): Remove. (maybe_temporary_var): Remove. (bind_expr): Remove. * d-convert.cc (d_array_convert): Use build_local_temp to generate temporaries, and generate its assignment. * d-tree.h (create_temporary_var): Remove. (maybe_temporary_var): Remove. (d_array_convert): Remove vars argument. * expr.cc (ExprVisitor::visit (CatExp *)): Use build_local_temp to generate temporaries, don't wrap them in a BIND_EXPR. (ExprVisitor::visit (NewExp *)): Likewise. gcc/testsuite/ChangeLog: PR d/94970 * gdc.dg/pr94970.d: New test. --- gcc/d/ChangeLog | 20 ++++++++++ gcc/d/d-codegen.cc | 67 +++------------------------------- gcc/d/d-convert.cc | 14 ++++--- gcc/d/d-tree.h | 4 +- gcc/d/expr.cc | 33 +++++++---------- gcc/testsuite/ChangeLog | 8 ++++ gcc/testsuite/gdc.dg/pr94970.d | 20 ++++++++++ 7 files changed, 77 insertions(+), 89 deletions(-) create mode 100644 gcc/testsuite/gdc.dg/pr94970.d diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog index 1a8bedfef2d..9cf976d97e1 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,3 +1,23 @@ +2020-05-17 Iain Buclaw + + Backport from mainline + 2020-05-06 Iain Buclaw + + PR d/94970 + * d-codegen.cc (force_target_expr): Move create_temporary_var + implementation inline here. + (create_temporary_var): Remove. + (maybe_temporary_var): Remove. + (bind_expr): Remove. + * d-convert.cc (d_array_convert): Use build_local_temp to generate + temporaries, and generate its assignment. + * d-tree.h (create_temporary_var): Remove. + (maybe_temporary_var): Remove. + (d_array_convert): Remove vars argument. + * expr.cc (ExprVisitor::visit (CatExp *)): Use build_local_temp to + generate temporaries, don't wrap them in a BIND_EXPR. + (ExprVisitor::visit (NewExp *)): Likewise. + 2020-05-07 Release Manager * GCC 10.1.0 released. diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc index b4927a2de10..5efd4b9c43c 100644 --- a/gcc/d/d-codegen.cc +++ b/gcc/d/d-codegen.cc @@ -619,7 +619,12 @@ build_target_expr (tree decl, tree exp) tree force_target_expr (tree exp) { - tree decl = create_temporary_var (TREE_TYPE (exp)); + tree decl = build_decl (input_location, VAR_DECL, NULL_TREE, + 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); } @@ -1766,66 +1771,6 @@ array_bounds_check (void) } } -/* Return an undeclared local temporary of type TYPE - for use with BIND_EXPR. */ - -tree -create_temporary_var (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; - layout_decl (decl, 0); - - return decl; -} - -/* Return an undeclared local temporary OUT_VAR initialized - with result of expression EXP. */ - -tree -maybe_temporary_var (tree exp, tree *out_var) -{ - tree t = exp; - - /* Get the base component. */ - while (TREE_CODE (t) == COMPONENT_REF) - t = TREE_OPERAND (t, 0); - - if (!DECL_P (t) && !REFERENCE_CLASS_P (t)) - { - *out_var = create_temporary_var (TREE_TYPE (exp)); - DECL_INITIAL (*out_var) = exp; - return *out_var; - } - else - { - *out_var = NULL_TREE; - return exp; - } -} - -/* Builds a BIND_EXPR around BODY for the variables VAR_CHAIN. */ - -tree -bind_expr (tree var_chain, tree body) -{ - /* Only handles one var. */ - gcc_assert (TREE_CHAIN (var_chain) == NULL_TREE); - - if (DECL_INITIAL (var_chain)) - { - tree ini = build_assign (INIT_EXPR, var_chain, DECL_INITIAL (var_chain)); - DECL_INITIAL (var_chain) = NULL_TREE; - body = compound_expr (ini, body); - } - - return d_save_expr (build3 (BIND_EXPR, TREE_TYPE (body), - var_chain, body, NULL_TREE)); -} - /* Returns the TypeFunction class for Type T. Assumes T is already ->toBasetype(). */ diff --git a/gcc/d/d-convert.cc b/gcc/d/d-convert.cc index e2921ec33f0..f93405ed956 100644 --- a/gcc/d/d-convert.cc +++ b/gcc/d/d-convert.cc @@ -774,21 +774,23 @@ d_array_convert (Expression *exp) /* Convert EXP to a dynamic array, where ETYPE is the element type. Similar to above, except that EXP is allowed to be an element of an array. - Temporary variables that need some kind of BIND_EXPR are pushed to VARS. */ + Temporary variables are created inline if EXP is not an lvalue. */ tree -d_array_convert (Type *etype, Expression *exp, vec **vars) +d_array_convert (Type *etype, Expression *exp) { Type *tb = exp->type->toBasetype (); if ((tb->ty != Tarray && tb->ty != Tsarray) || same_type_p (tb, etype)) { /* Convert single element to an array. */ - tree var = NULL_TREE; - tree expr = maybe_temporary_var (build_expr (exp), &var); + tree expr = build_expr (exp); - if (var != NULL_TREE) - vec_safe_push (*vars, var); + if (!exp->isLvalue ()) + { + tree var = build_local_temp (TREE_TYPE (expr)); + expr = compound_expr (modify_expr (var, expr), var); + } return d_array_value (build_ctype (exp->type->arrayOf ()), size_int (1), build_address (expr)); diff --git a/gcc/d/d-tree.h b/gcc/d/d-tree.h index 48587d96e38..33022055e3e 100644 --- a/gcc/d/d-tree.h +++ b/gcc/d/d-tree.h @@ -561,8 +561,6 @@ extern tree build_array_from_val (Type *, tree); extern tree void_okay_p (tree); extern tree build_bounds_condition (const Loc &, tree, tree, bool); extern bool array_bounds_check (void); -extern tree create_temporary_var (tree); -extern tree maybe_temporary_var (tree, tree *); extern tree bind_expr (tree, tree); extern TypeFunction *get_function_type (Type *); extern bool call_by_alias_p (FuncDeclaration *, FuncDeclaration *); @@ -586,7 +584,7 @@ extern tree convert_for_assignment (tree, Type *, Type *); extern tree convert_for_argument (tree, Parameter *); extern tree convert_for_condition (tree, Type *); extern tree d_array_convert (Expression *); -extern tree d_array_convert (Type *, Expression *, vec **); +extern tree d_array_convert (Type *, Expression *); /* In d-incpath.cc. */ extern void add_import_paths (const char *, const char *, bool); diff --git a/gcc/d/expr.cc b/gcc/d/expr.cc index 0ed50ee2d9e..d1e71f987f7 100644 --- a/gcc/d/expr.cc +++ b/gcc/d/expr.cc @@ -691,7 +691,6 @@ public: else etype = tb2->nextOf (); - vec *elemvars = NULL; tree result; if (e->e1->op == TOKcat) @@ -711,9 +710,7 @@ public: /* Store all concatenation args to a temporary byte[][ndims] array. */ Type *targselem = Type::tint8->arrayOf (); - tree var = create_temporary_var (make_array_type (targselem, ndims)); - tree init = build_constructor (TREE_TYPE (var), NULL); - vec_safe_push (elemvars, var); + tree var = build_local_temp (make_array_type (targselem, ndims)); /* Loop through each concatenation from right to left. */ vec *elms = NULL; @@ -725,7 +722,7 @@ public: ? (oe = ce->e1) : (ce = (CatExp *)ce->e1, oe = ce->e2))) { - tree arg = d_array_convert (etype, oe, &elemvars); + tree arg = d_array_convert (etype, oe); tree index = size_int (dim); CONSTRUCTOR_APPEND_ELT (elms, index, d_save_expr (arg)); @@ -738,8 +735,8 @@ public: /* Check there is no logic bug in constructing byte[][] of arrays. */ gcc_assert (dim == 0); - CONSTRUCTOR_ELTS (init) = elms; - DECL_INITIAL (var) = init; + tree init = build_constructor (TREE_TYPE (var), elms); + var = compound_expr (modify_expr (var, init), var); tree arrs = d_array_value (build_ctype (targselem->arrayOf ()), size_int (ndims), build_address (var)); @@ -752,13 +749,10 @@ public: /* Handle single concatenation (a ~ b). */ result = build_libcall (LIBCALL_ARRAYCATT, e->type, 3, build_typeinfo (e->loc, e->type), - d_array_convert (etype, e->e1, &elemvars), - d_array_convert (etype, e->e2, &elemvars)); + d_array_convert (etype, e->e1), + d_array_convert (etype, e->e2)); } - for (size_t i = 0; i < vec_safe_length (elemvars); ++i) - result = bind_expr ((*elemvars)[i], result); - this->result_ = result; } @@ -2494,12 +2488,13 @@ public: else { /* Multidimensional array allocations. */ - vec *elms = NULL; - Type *telem = e->newtype->toBasetype (); tree tarray = make_array_type (Type::tsize_t, e->arguments->dim); - tree var = create_temporary_var (tarray); - tree init = build_constructor (TREE_TYPE (var), NULL); + tree var = build_local_temp (tarray); + vec *elms = NULL; + /* Get the base element type for the array, generating the + initializer for the dims parameter along the way. */ + Type *telem = e->newtype->toBasetype (); for (size_t i = 0; i < e->arguments->dim; i++) { Expression *arg = (*e->arguments)[i]; @@ -2510,8 +2505,9 @@ public: gcc_assert (telem); } - CONSTRUCTOR_ELTS (init) = elms; - DECL_INITIAL (var) = init; + /* Initialize the temporary. */ + tree init = modify_expr (var, build_constructor (tarray, elms)); + var = compound_expr (init, var); /* Generate: _d_newarraymTX(ti, dims) or: _d_newarraymiTX(ti, dims) */ @@ -2524,7 +2520,6 @@ public: build_address (var)); result = build_libcall (libcall, tb, 2, tinfo, dims); - result = bind_expr (var, result); } if (e->argprefix) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9eea82b0925..e11dc50612f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-05-17 Iain Buclaw + + Backport from mainline + 2020-05-06 Iain Buclaw + + PR d/94970 + * gdc.dg/pr94970.d: New test. + 2020-05-13 Mark Eggleston Backport from master diff --git a/gcc/testsuite/gdc.dg/pr94970.d b/gcc/testsuite/gdc.dg/pr94970.d new file mode 100644 index 00000000000..4c3387e3d4b --- /dev/null +++ b/gcc/testsuite/gdc.dg/pr94970.d @@ -0,0 +1,20 @@ +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94970 +// { dg-do compile } + +struct S94970 +{ + string index() { return null; } + ~this() { } +} + +static m() { return S94970(); } + +auto concat() +{ + return m.index ~ ' '; +} + +auto newarray() +{ + return new int[][](m.index.length, 1); +}