From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id C96643858D35 for ; Wed, 27 Dec 2023 06:08:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C96643858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C96643858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703657292; cv=none; b=b875c9IGx4ZRkBDJbHR9cqket0Ui8z+Qy0vxelJ6hpPmCNgwwl6PRh3XSFIbkgX69WzrFyg0nFs7Y8UnDnRSdlwtz71jDdVKmRFwbRuQDA3h4zBaC2iTEmqqYVTOe5lzEsLUY49RWaKoOpAsNTiiQ7iOBc61TuT/Miq5AX3Z72Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703657292; c=relaxed/simple; bh=pH5nIu5V8T8l9E7ZABS2HOhsTIc2b3JR7WnMmXOurjo=; h=Subject:To:From:Message-ID:Date:MIME-Version; b=QDmpcTqfj10Yk4qRvDK3tocWAYn9KScAqBRTQWbe0BYhSFHoJ9VjzHyLO/ofzMdklY4aypKnLuvw5ZB/kWngnuIhLKXGghE+8La4KXn3M937H6MAiuJswBcYwX+SnBmUxOBRg4VLqHU+tJRE2PRKv9nW/PVj3l5RA8d+Zqp9JxM= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.20.4.107]) by gateway (Coremail) with SMTP id _____8CxO+lFv4tlwvAEAA--.23518S3; Wed, 27 Dec 2023 14:08:05 +0800 (CST) Received: from [10.20.4.107] (unknown [10.20.4.107]) by localhost.localdomain (Coremail) with SMTP id AQAAf8CxbORDv4tlNmoMAA--.44398S3; Wed, 27 Dec 2023 14:08:04 +0800 (CST) Subject: Re: [PATCH] LoongArch: Fix infinite secondary reloading of FCCmode [PR113148] To: Xi Ruoyao , gcc-patches@gcc.gnu.org Cc: i@xen0n.name, xuchenghua@loongson.cn, c@jia.je References: <20231226223818.128525-1-xry111@xry111.site> From: chenglulu Message-ID: Date: Wed, 27 Dec 2023 14:08:03 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20231226223818.128525-1-xry111@xry111.site> Content-Type: text/plain; charset=gbk; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8CxbORDv4tlNmoMAA--.44398S3 X-CM-SenderInfo: xfkh0wpoxo3qxorr0wxvrqhubq/ X-Coremail-Antispam: 1Uk129KBj93XoWxJF13XF1DJr1UAr4UWrWrXrc_yoW5ZryUpa sruwnYgF48XFZrGrnrJa13ArnxA34Iga1a9a4xtryxArs7u34Iv3Wrtr9rXFn8J3y8Xr4I gF4Sk3y5ZF42qacCm3ZEXasCq-sJn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUv2b4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r106r15M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVW8Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l57IF6xkI12xvs2x26I8E6xACxx 1l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r106r15McIj6I8E87Iv 67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IY64vIr41lc7I2V7IY0VAS07 AlzVAYIcxG8wCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02 F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw 1lIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7Cj xVAFwI0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r 1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU1Ek sDUUUUU== X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,KAM_SHORT,MIME_CHARSET_FARAWAY,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: ÔÚ 2023/12/27 ÉÏÎç6:37, Xi Ruoyao дµÀ: > The GCC internal doc says: > > X might be a pseudo-register or a 'subreg' of a pseudo-register, > which could either be in a hard register or in memory. Use > 'true_regnum' to find out; it will return -1 if the pseudo is in > memory and the hard register number if it is in a register. > > So "MEM_P (x)" is not enough for checking if we are reloading from/to > the memory. This bug has caused reload pass to stall and finally ICE > complaining with "maximum number of generated reload insns per insn > achieved", since r14-6814. > > Check if "true_regnum (x)" is -1 besides "MEM_P (x)" to fix the issue. > > gcc/ChangeLog: > > PR target/113148 > * config/loongarch/loongarch.cc (loongarch_secondary_reload): > Check if regno == -1 besides MEM_P (x) for reloading FCCmode > from/to FPR to/from memory. > > gcc/testsuite/ChangeLog: > > PR target/113148 > * gcc.target/loongarch/pr113148.c: New test. > --- > > Bootstrapped & regtested on loongarch64-linux-gnu. Ok for trunk? LGTM! Thanks! > > gcc/config/loongarch/loongarch.cc | 3 +- > gcc/testsuite/gcc.target/loongarch/pr113148.c | 44 +++++++++++++++++++ > 2 files changed, 46 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.target/loongarch/pr113148.c > > diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc > index 5ffd06ce9be..c0a0af3dda5 100644 > --- a/gcc/config/loongarch/loongarch.cc > +++ b/gcc/config/loongarch/loongarch.cc > @@ -6951,7 +6951,8 @@ loongarch_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x, > return NO_REGS; > } > > - if (reg_class_subset_p (rclass, FP_REGS) && MEM_P (x)) > + if (reg_class_subset_p (rclass, FP_REGS) > + && (regno == -1 || MEM_P (x))) > return GR_REGS; > > return NO_REGS; > diff --git a/gcc/testsuite/gcc.target/loongarch/pr113148.c b/gcc/testsuite/gcc.target/loongarch/pr113148.c > new file mode 100644 > index 00000000000..cf48e552053 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/loongarch/pr113148.c > @@ -0,0 +1,44 @@ > +/* PR 113148: ICE caused by infinite reloading */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -march=la464 -mfpu=64 -mabi=lp64d" } */ > + > +struct bound > +{ > + double max; > +} drawQuadrant_bound; > +double w4, innerXfromXY_y, computeBound_right_0; > +struct arc_def > +{ > + double w, h; > + double a0, a1; > +}; > +static void drawQuadrant (struct arc_def *); > +static void > +computeBound (struct arc_def *def, struct bound *bound) > +{ > + double ellipsex_1, ellipsex_0; > + bound->max = def->a1 ?: __builtin_sin (w4) * def->h; > + if (def->a0 == 5 && def->w == def->h) > + ; > + else > + ellipsex_0 = def->a0 == 0.0 ?: __builtin_cos (w4); > + if (def->a1 == 5 && def->w == def->h) > + ellipsex_1 = bound->max; > + __builtin_sqrt (ellipsex_1 * innerXfromXY_y * innerXfromXY_y * w4); > + computeBound_right_0 = ellipsex_0; > +} > +void > +drawArc () > +{ > + struct arc_def foo; > + for (;;) > + drawQuadrant (&foo); > +} > +void > +drawQuadrant (struct arc_def *def) > +{ > + int y, miny; > + computeBound (def, &drawQuadrant_bound); > + while (y >= miny) > + ; > +}