From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 7CA9C3858C78 for ; Sun, 6 Nov 2022 01:46:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7CA9C3858C78 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.20.4.52]) by gateway (Coremail) with SMTP id _____8Dxu9joEWdjs7oEAA--.15739S3; Sun, 06 Nov 2022 09:46:16 +0800 (CST) Received: from [10.20.4.52] (unknown [10.20.4.52]) by localhost.localdomain (Coremail) with SMTP id AQAAf8BxHuLoEWdjwOMNAA--.39043S2; Sun, 06 Nov 2022 09:46:16 +0800 (CST) Subject: Re: [PATCH] LoongArch: fix signed overflow in loongarch_emit_int_compare To: Xi Ruoyao , gcc-patches@gcc.gnu.org Cc: Wang Xuerui , Chenghua Xu References: <20221104063942.1594844-1-xry111@xry111.site> From: Lulu Cheng Message-ID: <9ed0e1ee-00da-a9e8-8c13-552b172fa08c@loongson.cn> Date: Sun, 6 Nov 2022 09:46:16 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20221104063942.1594844-1-xry111@xry111.site> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8BxHuLoEWdjwOMNAA--.39043S2 X-CM-SenderInfo: xfkh0wpoxo3qxorr0wxvrqhubq/ X-Coremail-Antispam: 1Uk129KBjvJXoW7AF18Wry7Gr1UCF48XFyUGFg_yoW8Aw1Upr yrArn5JrW8Jw1fCr1ktas8JFyDAryxKw42qF45KF1rGr1UJry2vr1UWr9I9FyDWw48JrWj qw1fCrsYv3WUJa7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUj1kv1TuYvTs0mT0YCTnIWj qI5I8CrVACY4xI64kE6c02F40Ex7xfYxn0WfASr-VFAUDa7-sFnT9fnUUIcSsGvfJTRUUU bxxYFVCjjxCrM7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4v20xvaj40_Wr0E3s 1l1IIY67AEw4v_Jrv_JF1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xv wVC0I7IYx2IY67AKxVWUJVWUCwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwA2z4 x0Y4vEx4A2jsIE14v26r4j6F4UM28EF7xvwVC2z280aVCY1x0267AKxVW8JVW8Jr1le2I2 62IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44I27wAqx4xG64xvF2IEw4 CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_JrI_JrylYx0Ex4A2jsIE14v26r1j6r4UMcvj eVCFs4IE7xkEbVWUJVW8JwACjcxG0xvEwIxGrwCYjI0SjxkI62AI1cAE67vIY487MxAIw2 8IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4l x2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxGrw CI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwCI 42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z2 80aVCY1x0267AKxVWUJVW8JbIYCTnIWIevJa73UjIFyTuYvjxU70PfDUUUU X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00,BODY_8BITS,GIT_PATCH_0,KAM_DMARC_STATUS,NICE_REPLY_A,SPF_HELO_PASS,SPF_PASS,TXREP 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: 在 2022/11/4 下午2:39, Xi Ruoyao 写道: > Signed overflow is an undefined behavior, so we need to prevent it from > happening, instead of "checking" the result. > > gcc/ChangeLog: > > * config/loongarch/loongarch.cc (loongarch_emit_int_compare): > Avoid signed overflow. > --- > > Bootstrapped and regtested on loongarch64-linux-gnu. OK for trunk? > > gcc/config/loongarch/loongarch.cc | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc > index f54c233f90c..032fb1474c7 100644 > --- a/gcc/config/loongarch/loongarch.cc > +++ b/gcc/config/loongarch/loongarch.cc > @@ -4175,13 +4175,14 @@ loongarch_emit_int_compare (enum rtx_code *code, rtx *op0, rtx *op1) > HOST_WIDE_INT new_rhs; > bool increment = *code == mag_comparisons[i][0]; > bool decrement = *code == mag_comparisons[i][1]; > - if (!increment && !decrement) > + if ((!increment && !decrement) > + || (increment && rhs == HOST_WIDE_INT_MAX) > + || (decrement && rhs == HOST_WIDE_INT_MIN)) > continue; I think it should be here:              if (!increment && !decrement)                 continue; +             if ((increment && rhs == HOST_WIDE_INT_MAX) +                 || (decrement && rhs == HOST_WIDE_INT_MIN)) +               break; + It is not necessary to continue when *code matches one of mag_comparisons[i]. > > new_rhs = rhs + (increment ? 1 : -1); > if (loongarch_integer_cost (new_rhs) > - < loongarch_integer_cost (rhs) > - && (rhs < 0) == (new_rhs < 0)) > + < loongarch_integer_cost (rhs)) > { > *op1 = GEN_INT (new_rhs); > *code = mag_comparisons[i][increment];