From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 4491F3849AC6 for ; Fri, 19 Apr 2024 06:17:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4491F3849AC6 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4491F3849AC6 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713507460; cv=none; b=QgQTjL2F2O/u3QxlyXKDBgvUpNbtYi6z+x0N0JXb8sqaUBk2I4DMZfysWapo8eIpZyAoYpsmSeLVp/qWLpozWb0Cs/hHZFycmGl8yvmO0q+7tJJScgWCeD/vPnK3vftrvZHjeuSmjowNNNlrLeeD9OkeB7aso612VayCUZq9XoU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713507460; c=relaxed/simple; bh=ORZCY4pR1mWofYGUS/EhNo9jdvmIDqt9DBFFHY9xHw0=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=TJ4JAXUxu4WH4hKfFeYI5C0Tq4q7CdkgL6FdKCYa9/AXIag+oaR8k5Dd4uw7coc2ef7j3YhQ9ASayb/R4hTNXy5O7Wi09K+hW8ze2b0MSMmFr0UGP+XR/YZLvORS1E0SekU6F/Ja7iELGn0tMMUTrjElrGNKJVC1WwcO1gig9kk= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1713507456; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=aSkV+hVFgzAvPGGPBBeA0qMWFgMhY+edbk/0QzaH5w4=; b=fre/XyzVE3spMyiqtUogZBd5hNPZU4M2pTmhMaJSoCaGI03NnKbrmKmUTrDPv9abc10Kmx flEUiiISA2gHiHzhrfkMfXDtyij+3eAs6ebzlnX0DypSRDlAC3Gim88Ag/BsVGhHEkXD23 vLAh+KUTYz/weeJyvCEfVQGeo/Kr/bk= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-152-JoC26UQSMl2lKcOox9wMZA-1; Fri, 19 Apr 2024 02:17:33 -0400 X-MC-Unique: JoC26UQSMl2lKcOox9wMZA-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 391D9380350F; Fri, 19 Apr 2024 06:17:33 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.45.224.5]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ED2BBC271AF; Fri, 19 Apr 2024 06:17:32 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 43J6HVlW4097049 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 19 Apr 2024 08:17:31 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 43J6HV9A4097048; Fri, 19 Apr 2024 08:17:31 +0200 Date: Fri, 19 Apr 2024 08:17:30 +0200 From: Jakub Jelinek To: Richard Biener , "Joseph S. Myers" Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] libgcc: Another __divmodbitint4 bug fix [PR114762] Message-ID: Reply-To: Jakub Jelinek MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,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: Hi! The following testcase is miscompiled because the code to decrement vn on negative value with all ones in most significant limb (even partial) and 0 in most significant bit of the second most significant limb doesn't take into account the case where all bits below the most significant limb are zero. This has been a problem both in the version before yesterday's commit where it has been done only if un was one shorter than vn before this decrement, and is now problem even more often when it is done earlier. When we decrement vn in such case and negate it, we end up with all 0s in the v2 value, so have both the problems with UB on __builtin_clz* and the expectations of the algorithm that the divisor has most significant bit set after shifting, plus when the decremented vn is 1 it can SIGFPE on division by zero even when it is not division by zero etc. Other values shouldn't get 0 in the new most significant limb after negation, because the bitint_reduce_prec canonicalization should reduce prec if the second most significant limb is all ones and if that limb is all zeros, if at least one limb below it is non-zero, carry in will make it non-zero. The following patch fixes it by checking if at least one bit below the most significant limb is non-zero, in that case it decrements, otherwise it will do nothing (but e.g. for the un < vn case that also means the divisor is large enough that the result should be q 0 r u). Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-04-19 Jakub Jelinek PR libgcc/114762 * libgcc2.c (__divmodbitint4): Don't decrement vn if all bits below the most significant limb are zero. * gcc.dg/torture/bitint-70.c: New test. --- libgcc/libgcc2.c.jj 2024-04-18 09:48:55.172538667 +0200 +++ libgcc/libgcc2.c 2024-04-18 12:17:28.893616007 +0200 @@ -1715,11 +1715,18 @@ __divmodbitint4 (UBILtype *q, SItype qpr && vn > 1 && (Wtype) v[BITINT_END (1, vn - 2)] >= 0) { - vp = 0; - --vn; + /* Unless all bits below the most significant limb are zero. */ + SItype vn2; + for (vn2 = vn - 2; vn2 >= 0; --vn2) + if (v[BITINT_END (vn - 1 - vn2, vn2)]) + { + vp = 0; + --vn; #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__ - ++v; + ++v; #endif + break; + } } if (__builtin_expect (un < vn, 0)) { --- gcc/testsuite/gcc.dg/torture/bitint-70.c.jj 2024-04-18 12:26:09.406383158 +0200 +++ gcc/testsuite/gcc.dg/torture/bitint-70.c 2024-04-18 12:26:57.253718287 +0200 @@ -0,0 +1,22 @@ +/* PR libgcc/114762 */ +/* { dg-do run { target bitint } } */ +/* { dg-options "-std=c23" } */ +/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ +/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ + +#if __BITINT_MAXWIDTH__ >= 255 +__attribute__((__noipa__)) signed _BitInt(255) +foo (signed _BitInt(255) a, signed _BitInt(65) b) +{ + return a / b; +} +#endif + +int +main () +{ +#if __BITINT_MAXWIDTH__ >= 255 + if (foo (1, -0xffffffffffffffffwb - 1wb)) + __builtin_abort (); +#endif +} Jakub