From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id DA7CA384783B; Fri, 21 May 2021 18:45:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org DA7CA384783B Received: by mail-wr1-x42d.google.com with SMTP id z17so21972505wrq.7; Fri, 21 May 2021 11:45:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:reply-to :from:date:message-id:subject:to:cc; bh=+VkAwvq3Q/i+hAFeh8jqfue+0R1EH/gv1y1KaBFHBo0=; b=JFxze2yvHFRx9tcst5NUgVG36hrES3K8NUhOzoYtamMFol3n7SS8jZQ7QfOSOYs9KC Y8h8zUjMfnvX/+TnoOYoPelF4BtTcWY0Begbc0aUamr2RpLkTVfCscoqyMRSx0pNt7a9 Hors5sME7TWTCduSHdh7wUqyjccFwBhkT3KPQ0ZOrczr8cz7bClORivEBKR5XbQLMwQW G1qzvMN5COtM4Ic9XC0FR5um4YMdME3qbXEojIBKs1axMT/EsARRTNCDreCCJZM2rc9C Nhbf0ckiNWHo/0KUNoeB8TsPmen81uL9n0JLuZqPT9sirNesKJZwKH/zoGFt1XNkBKPW Ugiw== X-Gm-Message-State: AOAM533LA3oOWKyV/to5VmGw4cOIwPMhksG2JdJUvt+gmIOTJYPEF2SB NS3kHoYWkitMtI16FPaYdA7apcYsObYN4hsXWv0= X-Google-Smtp-Source: ABdhPJwFfIdDRXHcErtwVay3dcyMouzM39KVIN5hcuLpShfnFT/Th2aa+3uh1tJ8P/zPHOT3XR+mB8UWO5kDB54oN3I= X-Received: by 2002:adf:ed47:: with SMTP id u7mr11069909wro.254.1621622704020; Fri, 21 May 2021 11:45:04 -0700 (PDT) MIME-Version: 1.0 References: <34C4F25A-6333-4C08-BBFF-8E86A5A9B764@dell.com> In-Reply-To: <34C4F25A-6333-4C08-BBFF-8E86A5A9B764@dell.com> Reply-To: cassio.neri@gmail.com From: Cassio Neri Date: Fri, 21 May 2021 19:44:52 +0100 Message-ID: Subject: Re: [PATCH] libstdc++: More efficient std::chrono::year::leap. To: "Koning, Paul" Cc: Cassio Neri via Gcc-patches , "libstdc++@gcc.gnu.org" Content-Type: multipart/mixed; boundary="0000000000003bc2d205c2db75e0" X-Spam-Status: No, score=-10.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 May 2021 18:45:06 -0000 --0000000000003bc2d205c2db75e0 Content-Type: text/plain; charset="UTF-8" I've checked the generated code and the compiler doesn't figure out the logic. I added a comment to explain. (Revised patch below and attached.) Best wishes, Cassio. --- Simple change to std::chrono::year::is_leap. If a year is multiple of 100, then it's divisible by 400 if and only if it's divisible by 16. The latter allows for better code generation. Tested on x86_64-pc-linux-gnu. libstdc++-v3/ChangeLog: libstdc++-v3/ChangeLog: * include/std/chrono: diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono index 4631a727d73..85aa0379432 100644 --- a/libstdc++-v3/include/std/chrono +++ b/libstdc++-v3/include/std/chrono @@ -1612,7 +1612,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr uint32_t __offset = __max_dividend / 2 / 100 * 100; const bool __is_multiple_of_100 = __multiplier * (_M_y + __offset) < __bound; - return (!__is_multiple_of_100 || _M_y % 400 == 0) && _M_y % 4 == 0; + // Usually we test _M_y % 400 == 0 but, when it's already known that + // _M_y%100 == 0, then _M_y % 400==0 is equivalent to _M_y % 16 == 0. + return (!__is_multiple_of_100 || _M_y % 16 == 0) && _M_y % 4 == 0; } explicit constexpr On Fri, May 21, 2021 at 7:05 PM Koning, Paul wrote: > > > > > On May 21, 2021, at 1:46 PM, Cassio Neri via Gcc-patches wrote: > > > > Simple change to std::chrono::year::is_leap. If a year is multiple of 100, > > then it's divisible by 400 if and only if it's divisible by 16. The latter > > allows for better code generation. > > I wonder if the optimizer could be taught to do that. > > The change seems correct but it is very confusing; at the very least the reasoning you gave should be stated in a comment on that check. > > paul > > --0000000000003bc2d205c2db75e0 Content-Type: text/x-patch; charset="US-ASCII"; name="leap.patch" Content-Disposition: attachment; filename="leap.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_koyo8mxf0 U2ltcGxlIGNoYW5nZSB0byBzdGQ6OmNocm9ubzo6eWVhcjo6aXNfbGVhcC4gSWYgYSB5ZWFyIGlz IG11bHRpcGxlIG9mIDEwMCwKdGhlbiBpdCdzIGRpdmlzaWJsZSBieSA0MDAgaWYgYW5kIG9ubHkg aWYgaXQncyBkaXZpc2libGUgYnkgMTYuIFRoZSBsYXR0ZXIKYWxsb3dzIGZvciBiZXR0ZXIgY29k ZSBnZW5lcmF0aW9uLgoKVGVzdGVkIG9uIHg4Nl82NC1wYy1saW51eC1nbnUuCgpsaWJzdGRjKyst djMvQ2hhbmdlTG9nOgpsaWJzdGRjKystdjMvQ2hhbmdlTG9nOgoKCSogaW5jbHVkZS9zdGQvY2hy b25vOgoKZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL3N0ZC9jaHJvbm8gYi9saWJz dGRjKystdjMvaW5jbHVkZS9zdGQvY2hyb25vCmluZGV4IDQ2MzFhNzI3ZDczLi44NWFhMDM3OTQz MiAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvc3RkL2Nocm9ubworKysgYi9saWJz dGRjKystdjMvaW5jbHVkZS9zdGQvY2hyb25vCkBAIC0xNjEyLDcgKzE2MTIsOSBAQCBfR0xJQkNY WF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCWNvbnN0ZXhwciB1aW50MzJfdCBfX29mZnNldCAg ICAgICA9IF9fbWF4X2RpdmlkZW5kIC8gMiAvIDEwMCAqIDEwMDsKIAljb25zdCBib29sIF9faXNf bXVsdGlwbGVfb2ZfMTAwCiAJICA9IF9fbXVsdGlwbGllciAqIChfTV95ICsgX19vZmZzZXQpIDwg X19ib3VuZDsKLQlyZXR1cm4gKCFfX2lzX211bHRpcGxlX29mXzEwMCB8fCBfTV95ICUgNDAwID09 IDApICYmIF9NX3kgJSA0ID09IDA7CisJLy8gVXN1YWxseSB3ZSB0ZXN0IF9NX3kgJSA0MDAgPT0g MCBidXQsIHdoZW4gaXQncyBhbHJlYWR5IGtub3duIHRoYXQKKwkvLyBfTV95JTEwMCA9PSAwLCB0 aGVuIF9NX3kgJSA0MDA9PTAgaXMgZXF1aXZhbGVudCB0byBfTV95ICUgMTYgPT0gMC4KKwlyZXR1 cm4gKCFfX2lzX211bHRpcGxlX29mXzEwMCB8fCBfTV95ICUgMTYgPT0gMCkgJiYgX01feSAlIDQg PT0gMDsKICAgICAgIH0KCiAgICAgICBleHBsaWNpdCBjb25zdGV4cHIK --0000000000003bc2d205c2db75e0--