From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1873) id BE6AF3858D1E; Wed, 30 Nov 2022 21:05:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BE6AF3858D1E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1669842352; bh=8F3Taj1lPmaSxFvl0ooM6et+toeK+UZBZJEH2opXvW0=; h=From:To:Subject:Date:From; b=sdD+B0RMeD2oM0ExwJWiNQBHMqyKmn5KpKMh8r7LtxFPN1pmVCzz0tQCSnyUZIDC8 XTGrEbWotPCM2o8lQD4vng+KCqAOlJOzi0v+EJG9d5XRXE1VljAk2q8qkw2gkpbWQt l/fn8Emlw3cepBqybkXhrXJ0V6HcoZJLvNq9lw3A= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Iain Buclaw To: gcc-cvs@gcc.gnu.org Subject: [gcc r10-11103] d: Fix ICE on named continue label in an unrolled loop [PR107592] X-Act-Checkin: gcc X-Git-Author: Iain Buclaw X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 2391ea007f291b12c6602b7fd71bb92b7c945752 X-Git-Newrev: f3cfcde3d69e2e8d305c4d4d662a26cd25e8398c Message-Id: <20221130210552.BE6AF3858D1E@sourceware.org> Date: Wed, 30 Nov 2022 21:05:52 +0000 (GMT) List-Id: https://gcc.gnu.org/g:f3cfcde3d69e2e8d305c4d4d662a26cd25e8398c commit r10-11103-gf3cfcde3d69e2e8d305c4d4d662a26cd25e8398c Author: Iain Buclaw Date: Sat Nov 12 00:54:47 2022 +0100 d: Fix ICE on named continue label in an unrolled loop [PR107592] Continue labels in an unrolled loop require a unique label per iteration. Previously this used the Statement body node for each unrolled iteration to generate a new entry in the label hash table. This does not work when the continue label has an identifier, as said named label is pointing to the outer UnrolledLoopStatement node. What would happen is that during the lowering of `continue label', an automatic label associated with the unrolled loop would be generated, and a jump to that label inserted, but because it was never pushed by the visitor for the loop itself, it subsequently never gets emitted. To fix, correctly use the UnrolledLoopStatement as the key to look up and store the break/continue label pair, but remove the continue label from the value entry after every loop to force a new label to be generated by the next call to `push_continue_label' PR d/107592 gcc/d/ChangeLog: * toir.cc (IRVisitor::push_unrolled_continue_label): New method. (IRVisitor::pop_unrolled_continue_label): New method. (IRVisitor::visit (UnrolledLoopStatement *)): Use them instead of push_continue_label and pop_continue_label. gcc/testsuite/ChangeLog: * gdc.dg/pr107592.d: New test. (cherry picked from commit 031d3f095520f0e1ee03e29b7ad5067c2a3f96e0) Diff: --- gcc/d/toir.cc | 26 ++++++++++++++++++++++++-- gcc/testsuite/gdc.dg/pr107592.d | 13 +++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/gcc/d/toir.cc b/gcc/d/toir.cc index 074cde0e0da..559f79da6c2 100644 --- a/gcc/d/toir.cc +++ b/gcc/d/toir.cc @@ -540,6 +540,28 @@ public: this->do_label (label); } + /* Generate and set a new continue label for the current unrolled loop. */ + + void push_unrolled_continue_label (UnrolledLoopStatement *s) + { + this->push_continue_label (s); + } + + /* Finish with the continue label for the unrolled loop. */ + + void pop_unrolled_continue_label (UnrolledLoopStatement *s) + { + Statement *stmt = s->getRelatedLabeled (); + d_label_entry *ent = d_function_chain->labels->get (stmt); + gcc_assert (ent != NULL && ent->bc_label == true); + + this->pop_continue_label (TREE_VEC_ELT (ent->label, bc_continue)); + + /* Remove the continue label from the label htab, as a new one must be + inserted at the end of every unrolled loop. */ + ent->label = TREE_VEC_ELT (ent->label, bc_break); + } + /* Visitor interfaces. */ @@ -1076,9 +1098,9 @@ public: if (statement != NULL) { - tree lcontinue = this->push_continue_label (statement); + this->push_unrolled_continue_label (s); this->build_stmt (statement); - this->pop_continue_label (lcontinue); + this->pop_unrolled_continue_label (s); } } diff --git a/gcc/testsuite/gdc.dg/pr107592.d b/gcc/testsuite/gdc.dg/pr107592.d new file mode 100644 index 00000000000..59f34477356 --- /dev/null +++ b/gcc/testsuite/gdc.dg/pr107592.d @@ -0,0 +1,13 @@ +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107592 +// { dg-do compile } + +void test107592(Things...)(Things things) +{ + label: + foreach (thing; things) + { + continue label; + } +} + +alias a107592 = test107592!(string);