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.129.124]) by sourceware.org (Postfix) with ESMTPS id D6BAD3857404 for ; Mon, 21 Mar 2022 15:56:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D6BAD3857404 Received: from mail-yw1-f199.google.com (mail-yw1-f199.google.com [209.85.128.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-299-8g5ci-DRO86V6k6MvBKigw-1; Mon, 21 Mar 2022 11:56:28 -0400 X-MC-Unique: 8g5ci-DRO86V6k6MvBKigw-1 Received: by mail-yw1-f199.google.com with SMTP id 00721157ae682-2e6402f436cso19915757b3.3 for ; Mon, 21 Mar 2022 08:56:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ncNTXT8vaA+lQUJxY5feThAw+u7LCZNC5/B5/zkk28U=; b=Rkt+KSdh/0I3lMuVHZA4T0ody4W5MoJkk69SxkH+fPakh+T5EgKyh/Dd+9xNrsxPlY h4iQ8RK38uX39oXWH4Hq2lcrgl9fRjzu8dTofaTstatr2za63p4l5v4beLHlS7ROrNV1 5zMkZazBsSS2kTLRVPGeujfsCLX9LbWrkz89Nn7lY4XKC4Qx3PgBYP6zKRPSrQz9N31k DeidhmBoBGziA+WoV/I9fw3JtUZvDrKnyPVRCMVVVhjnKUawM9wHx8nl2HQiRY0fTzdJ NBM13s5Yal47TtfU6AzoZoBCqZGSqmrc494CQUkQA3CJ8BYVKIWBZiBNIVG3q2EvyKBe lp4g== X-Gm-Message-State: AOAM533OiSlHDiQmcGoWs66w4qL1Jns3KUQchmHGSO67t/u/CKaskLv2 nzQ2DczSKoNqsOhyZzJLPo+jyMjzNKpLGo1lnVX98cqoYw2YV5Ug27Q47szsraNc/L593MhTn+t d/vPhq7fjpodEKTQRoMmQsxHAin036V2glw== X-Received: by 2002:a25:b9d2:0:b0:628:a85f:953c with SMTP id y18-20020a25b9d2000000b00628a85f953cmr23353024ybj.312.1647878186631; Mon, 21 Mar 2022 08:56:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzHX/2JLtzv3hFs4ivILqTt3D4APSkU6g29wXZ6m3yST9Ov/Ks6nZk2rJgcxvy2RXbxmAQ6y5HTGtqoe0ANqos= X-Received: by 2002:a25:b9d2:0:b0:628:a85f:953c with SMTP id y18-20020a25b9d2000000b00628a85f953cmr23352998ybj.312.1647878186394; Mon, 21 Mar 2022 08:56:26 -0700 (PDT) MIME-Version: 1.0 References: <001c01d837d9$4c8bf060$e5a3d120$@nextmovesoftware.com> <009701d83843$26293a30$727bae90$@nextmovesoftware.com> In-Reply-To: From: Aldy Hernandez Date: Mon, 21 Mar 2022 16:56:15 +0100 Message-ID: Subject: Re: [PATCH] Ignore (possible) signed zeros in operands of FP comparisons. To: Jeff Law Cc: Andrew MacLeod , Roger Sayle , Richard Biener , GCC Patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000ef366505dabc8901" X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Mar 2022 15:56:33 -0000 --000000000000ef366505dabc8901 Content-Type: text/plain; charset="UTF-8" On Fri, Mar 18, 2022 at 7:33 PM Aldy Hernandez wrote: > > >>>>> Consider the following interesting example: > > >>>>> > > >>>>> int foo(int x, double y) { > > >>>>> return (x * 0.0) < y; > > >>>>> } > > >>>>> > > >>>>> Although we know that x (when converted to double) can't be NaN or > > >>>>> Inf, we still worry that for negative values of x that (x * 0.0) may > > >>>>> be -0.0 and so perform the multiplication at run-time. But in this > > >>>>> case, the result of the comparison (-0.0 < y) will be exactly the > > >>>>> same > > >>>>> as (+0.0 < y) for any y, hence the above may be safely constant > > >>>>> folded to "0.0 < > > >>>> y" > > >>>>> avoiding the multiplication at run-time. Ok, once the "frange" infrastructure is in place, it's actually trivial. See attached patch and tests. We can do everything with small range-op entries and evrp / ranger will handle everything else. Roger, I believe this is what you described: +// { dg-do compile } +// { dg-options "-O2 -fno-tree-forwprop -fno-thread-jumps -fdump-tree-evrp -fdump-tree-optimized" } + +extern void link_error (); + +int foo(int x, double y) +{ + return (x * 0.0) < y; +} + +// The multiply should be gone by *vrp time. +// { dg-final { scan-tree-dump-not " \\* " "evrp" } } + +// Ultimately, there sound be no references to "x". +// { dg-final { scan-tree-dump-not "x_" "optimized" } } With the attached patch (and pending patches), we keep track that a cast from int to float is guaranteed to not be NaN, which allows us to fold x*0.0 into 0.0, and DCE to remove x altogether. Also, as the other tests show, we are able to resolve __builtin_isnan's for the operations implemented. It should be straightforward for someone with floating point foo to extend this to all operations. Aldy --000000000000ef366505dabc8901 Content-Type: text/x-patch; charset="US-ASCII"; name="0011-frange-Implement-NAN-aware-stubs-for-FLOAT_EXPR-UNOR.patch" Content-Disposition: attachment; filename="0011-frange-Implement-NAN-aware-stubs-for-FLOAT_EXPR-UNOR.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l10vrq3y0 RnJvbSAyYTYyMThlOTc3ODJmNjNkZmU5ODM2ZTYwMjRmYmIyOGM4Y2JiODAzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogTW9uLCAyMSBNYXIgMjAyMiAxNjoyNjo0MCArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFtmcmFu Z2VdIEltcGxlbWVudCBOQU4gYXdhcmUgc3R1YnMgZm9yIEZMT0FUX0VYUFIsCiBVTk9SREVSRURf RVhQUiwgYW5kIE1VTFRfRVhQUi4KCi0tLQogZ2NjL3JhbmdlLW9wLWZsb2F0LmNjICAgICAgICAg ICAgICAgICAgICAgICAgfCA5MCArKysrKysrKysrKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LTAxLmMgfCAxNCArKysKIGdjYy90ZXN0c3VpdGUvZ2Nj LmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0wMi5jIHwgMTQgKysrCiBnY2MvdGVzdHN1aXRlL2djYy5k Zy90cmVlLXNzYS92cnAtZmxvYXQtMDMuYyB8IDE1ICsrKysKIDQgZmlsZXMgY2hhbmdlZCwgMTMz IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90 cmVlLXNzYS92cnAtZmxvYXQtMDEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUv Z2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0wMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LTAzLmMKCmRpZmYgLS1naXQgYS9nY2Mv cmFuZ2Utb3AtZmxvYXQuY2MgYi9nY2MvcmFuZ2Utb3AtZmxvYXQuY2MKaW5kZXggOTg4YTM5Mzg5 NTkuLjUyYWFhMDFhYjBmIDEwMDY0NAotLS0gYS9nY2MvcmFuZ2Utb3AtZmxvYXQuY2MKKysrIGIv Z2NjL3JhbmdlLW9wLWZsb2F0LmNjCkBAIC05MjIsNiArOTIyLDkzIEBAIGZvcGVyYXRvcl9jc3Q6 OmZvbGRfcmFuZ2UgKGZyYW5nZSAmciwgdHJlZSB0eXBlIEFUVFJJQlVURV9VTlVTRUQsCiAgIHJl dHVybiB0cnVlOwogfQogCitjbGFzcyBmb3BlcmF0b3JfY2FzdCA6IHB1YmxpYyByYW5nZV9vcGVy YXRvcgoreworICB1c2luZyByYW5nZV9vcGVyYXRvcjo6Zm9sZF9yYW5nZTsKK3B1YmxpYzoKKyAg dmlydHVhbCBib29sIGZvbGRfcmFuZ2UgKGZyYW5nZSAmciwgdHJlZSB0eXBlLAorCQkJICAgY29u c3QgaXJhbmdlICZpbm5lciwKKwkJCSAgIGNvbnN0IGZyYW5nZSAmb3V0ZXIsCisJCQkgICByZWxh dGlvbl9raW5kIHJlbCA9IFZSRUxfTk9ORSkgY29uc3Qgb3ZlcnJpZGU7Cit9IGZvcF9jb252ZXJ0 OworCitib29sCitmb3BlcmF0b3JfY2FzdDo6Zm9sZF9yYW5nZSAoZnJhbmdlICZyLCB0cmVlIHR5 cGUsCisJCQkgICAgY29uc3QgaXJhbmdlICZpbm5lciwKKwkJCSAgICBjb25zdCBmcmFuZ2UgJm91 dGVyLAorCQkJICAgIHJlbGF0aW9uX2tpbmQpIGNvbnN0Cit7CisgIGlmIChlbXB0eV9yYW5nZV92 YXJ5aW5nIChyLCB0eXBlLCBpbm5lciwgb3V0ZXIpKQorICAgIHJldHVybiB0cnVlOworCisgIHIu c2V0X3ZhcnlpbmcgKHR5cGUpOworCisgIC8vIFNvbWUgZmxhZ3MgY2FuIGJlIGNsZWFyZWQgd2hl biBjb252ZXJ0aW5nIGZyb20gaW50cy4KKyAgci5jbGVhcl9wcm9wIChGUkFOR0VfUFJPUF9OQU4p OworCisgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBmb3BlcmF0b3JfdW5vcmRlcmVkIDogcHVi bGljIHJhbmdlX29wZXJhdG9yCit7CisgIHVzaW5nIHJhbmdlX29wZXJhdG9yOjpmb2xkX3Jhbmdl OworcHVibGljOgorICB2aXJ0dWFsIGJvb2wgZm9sZF9yYW5nZSAoaXJhbmdlICZyLCB0cmVlIHR5 cGUsCisJCQkgICBjb25zdCBmcmFuZ2UgJmxoLAorCQkJICAgY29uc3QgZnJhbmdlICZyaCwKKwkJ CSAgIHJlbGF0aW9uX2tpbmQgcmVsID0gVlJFTF9OT05FKSBjb25zdCBvdmVycmlkZTsKK30gZm9w X3Vub3JkZXJlZDsKKworYm9vbAorZm9wZXJhdG9yX3Vub3JkZXJlZDo6Zm9sZF9yYW5nZSAoaXJh bmdlICZyLCB0cmVlIHR5cGUsCisJCQkJIGNvbnN0IGZyYW5nZSAmbGgsCisJCQkJIGNvbnN0IGZy YW5nZSAmcmgsCisJCQkJIHJlbGF0aW9uX2tpbmQpIGNvbnN0Cit7CisgIGlmIChlbXB0eV9yYW5n ZV92YXJ5aW5nIChyLCB0eXBlLCBsaCwgcmgpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFJl dHVybiBGQUxTRSBpZiBib3RoIG9wZXJhbmRzIGFyZSAhTmFOLgorICBpZiAoIWxoLmdldF9wcm9w IChGUkFOR0VfUFJPUF9OQU4pICYmICFyaC5nZXRfcHJvcCAoRlJBTkdFX1BST1BfTkFOKSkKKyAg ICB7CisgICAgICByID0gcmFuZ2VfZmFsc2UgKHR5cGUpOworICAgICAgcmV0dXJuIHRydWU7Cisg ICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgZm9wZXJhdG9yX211bHQgOiBwdWJs aWMgcmFuZ2Vfb3BlcmF0b3IKK3sKKyAgdXNpbmcgcmFuZ2Vfb3BlcmF0b3I6OmZvbGRfcmFuZ2U7 CitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBmb2xkX3JhbmdlIChmcmFuZ2UgJnIsIHRyZWUgdHlw ZSwKKwkJCSAgIGNvbnN0IGZyYW5nZSAmbGgsCisJCQkgICBjb25zdCBmcmFuZ2UgJnJoLAorCQkJ ICAgcmVsYXRpb25fa2luZCByZWwgPSBWUkVMX05PTkUpIGNvbnN0IG92ZXJyaWRlOworfSBmb3Bf bXVsdDsKKworYm9vbAorZm9wZXJhdG9yX211bHQ6OmZvbGRfcmFuZ2UgKGZyYW5nZSAmciwgdHJl ZSB0eXBlLAorCQkJICAgIGNvbnN0IGZyYW5nZSAmbGgsCisJCQkgICAgY29uc3QgZnJhbmdlICZy aCwKKwkJCSAgICByZWxhdGlvbl9raW5kKSBjb25zdAoreworICBpZiAoZW1wdHlfcmFuZ2VfdmFy eWluZyAociwgdHlwZSwgbGgsIHJoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBXaGVuIHgg aXMgIU5hbiwgeCAqIDAuMCA9IDAuMAorICBpZiAocmguemVyb19wICgpCisgICAgICAmJiAhcmgu Z2V0X3Byb3AgKEZSQU5HRV9QUk9QX05BTikKKyAgICAgICYmICFsaC5nZXRfcHJvcCAoRlJBTkdF X1BST1BfTkFOKSkKKyAgICB7CisgICAgICByLnNldF96ZXJvICh0eXBlKTsKKyAgICAgIHJldHVy biB0cnVlOworICAgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKIGNsYXNzIGZsb2F0aW5nX3Rh YmxlIDogcHVibGljIHJhbmdlX29wX3RhYmxlCiB7CiBwdWJsaWM6CkBAIC05NDQsNiArMTAzMSw5 IEBAIGZsb2F0aW5nX3RhYmxlOjpmbG9hdGluZ190YWJsZSAoKQogICBzZXQgKFBBUkVOX0VYUFIs IGZvcF9pZGVudGl0eSk7CiAgIHNldCAoT0JKX1RZUEVfUkVGLCBmb3BfaWRlbnRpdHkpOwogICBz ZXQgKFJFQUxfQ1NULCBmb3BfcmVhbF9jc3QpOworICBzZXQgKEZMT0FUX0VYUFIsIGZvcF9jb252 ZXJ0KTsKKyAgc2V0IChVTk9SREVSRURfRVhQUiwgZm9wX3Vub3JkZXJlZCk7CisgIHNldCAoTVVM VF9FWFBSLCBmb3BfbXVsdCk7CiB9CiAKICNpZiBDSEVDS0lOR19QCmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS92cnAtZmxvYXQtMDEuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi45MmFmODcwOTFhOAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0wMS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8vIHsg ZGctZG8gY29tcGlsZSB9CisvLyB7IGRnLW9wdGlvbnMgIi1PMiAtZm5vLXRyZWUtZm9yd3Byb3Ag LWZuby10cmVlLWNjcCAtZm5vLXRyZWUtZnJlIC1mZHVtcC10cmVlLWV2cnAiIH0KKworZXh0ZXJu IHZvaWQgbGlua19lcnJvciAoKTsKKwordm9pZAorZm9vICgpCit7CisgIGZsb2F0IHogPSAwLjA7 CisgIGlmIChfX2J1aWx0aW5faXNuYW4gKHopKQorICAgIGxpbmtfZXJyb3IgKCk7Cit9CisKKy8v IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgImxpbmtfZXJyb3IiICJldnJwIiB9IH0K ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0wMi5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LTAyLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmQzOGVhNTIzYmVhCi0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LTAyLmMKQEAgLTAs MCArMSwxNCBAQAorLy8geyBkZy1kbyBjb21waWxlIH0KKy8vIHsgZGctb3B0aW9ucyAiLU8yIC1m bm8tdHJlZS1mb3J3cHJvcCAtZm5vLXRocmVhZC1qdW1wcyAtZmR1bXAtdHJlZS1ldnJwIiB9CisK K2V4dGVybiB2b2lkIGxpbmtfZXJyb3IgKCk7CisKK3ZvaWQKK2ZvbyAoaW50IGkpCit7CisgIGZs b2F0IHogPSBpOworICBpZiAoX19idWlsdGluX2lzbmFuICh6KSkKKyAgICBsaW5rX2Vycm9yICgp OworfQorCisvLyB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICJsaW5rX2Vycm9yIiAi ZXZycCIgfSB9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS92cnAt ZmxvYXQtMDMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0wMy5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42YzI2YTI5NWY5NAotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC0w My5jCkBAIC0wLDAgKzEsMTUgQEAKKy8vIHsgZGctZG8gY29tcGlsZSB9CisvLyB7IGRnLW9wdGlv bnMgIi1PMiAtZm5vLXRyZWUtZm9yd3Byb3AgLWZuby10aHJlYWQtanVtcHMgLWZkdW1wLXRyZWUt ZXZycCAtZmR1bXAtdHJlZS1vcHRpbWl6ZWQiIH0KKworZXh0ZXJuIHZvaWQgbGlua19lcnJvciAo KTsKKworaW50IGZvbyhpbnQgeCwgZG91YmxlIHkpIAoreworICAgICAgcmV0dXJuICh4ICogMC4w KSA8IHk7Cit9CisKKy8vIFRoZSBtdWx0aXBseSBzaG91bGQgYmUgZ29uZSBieSAqdnJwIHRpbWUu CisvLyB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICIgXFwqICIgImV2cnAiIH0gfQor CisvLyBVbHRpbWF0ZWx5LCB0aGVyZSBzb3VuZCBiZSBubyByZWZlcmVuY2VzIHRvICJ4Ii4KKy8v IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgInhfIiAib3B0aW1pemVkIiB9IH0KLS0g CjIuMzUuMQoK --000000000000ef366505dabc8901--