From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by sourceware.org (Postfix) with ESMTPS id 19F4B3858031 for ; Tue, 12 Jan 2021 13:32:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 19F4B3858031 Received: by mail-wm1-x336.google.com with SMTP id e25so2147177wme.0 for ; Tue, 12 Jan 2021 05:32:33 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=T9xTGeMzaS1an11E1N2Galm0bwQoGnKFnaJOifkvoJ8=; b=Q21LZKDVLjxBiFAdh0OC8OZJz1erQIXJmZ5FZns7ZP9LcALQ7VnqX6/pT9WdCbtn+Y TnAWHdgdtFjHQY2VdWt4T16g8VEXrWmAM6SjQ7ZAg0KRjFLQz6HBetf4EqokwD/y4gDS 4N2mtbTdY8wL+7oQT6PttvByx3Upoowb2ZA0sZo4W6co1OaRpqIs2v55XZx6aMD3rHnY Lxt/Ori1jjE8jtW5ac5HSIxRecwKY2ZG0/j6vqgFZya2LQS3qoap9M/IU1WLVn2dwhL5 X6xEUs2m74JGmKjcIG/GRaUZjNxlSAGY2ThUakhgPbJcL2LOoWHTfiZd9qVs4clyRTA7 u4XQ== X-Gm-Message-State: AOAM530zUvc+Z/iEuIuY5lf3/+4ZmkdHxsGMIDToYBffl7Qvxf4oXCn6 StcyWa9Agrkqs5GLw1uLUhXDKszy+0EmH6jX09ezpzvyKeXixMvo X-Google-Smtp-Source: ABdhPJxdBBlMne2KsExuUsWTshbVG+I5zn7HIq8jPohyWej2XMrfBQ2tDETJpLb5TC1oVOaOAC4c3wNOkVtpOZaXvc8= X-Received: by 2002:a1c:e90b:: with SMTP id q11mr3697480wmc.102.1610458351783; Tue, 12 Jan 2021 05:32:31 -0800 (PST) MIME-Version: 1.0 From: =?UTF-8?B?4piCSm9zaCBDaGlhICjorJ3ku7vkuK0p?= Date: Tue, 12 Jan 2021 21:32:20 +0800 Message-ID: Subject: Failure to optimize? To: gcc-help X-Spam-Status: No, score=-2.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, HTML_MESSAGE, 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 Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: gcc-help@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-help mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jan 2021 13:32:34 -0000 I have a code snippet that I'm wondering why GCC didn't optimize the way I think it should: https://godbolt.org/z/1qKvax bar2() is a variant of bar1() that has been manually tweaked to avoid branches. I haven't done any benchmarks but, I would expect the branchless bar2() to perform better than bar1() but GCC does not automatically optimize bar1() to be like bar2(); the generated code for bar1() and bar2() are different and the generated code for bar1() contains a branch. I'm generally trying to get an idea of how smart GCC optimization is and how much hand-holding I should provide, so could someone help me understand why GCC didn't generate the same branchless code for bar1() and bar2()? Or, perhaps avoiding branches here doesn't actually help performance? Josh *SOURCE* char const* foo(); int cursor = 0; char const* bar1() { char const* result = foo(); if (result) ++cursor; return result; } char const* bar2() { char const* result = foo(); cursor += !!result; return result; } *GENERATED CODE* bar1(): sub rsp, 8 call foo() test rax, rax je .L1 add DWORD PTR cursor[rip], 1 .L1: add rsp, 8 ret bar2(): sub rsp, 8 call foo() cmp rax, 1 sbb DWORD PTR cursor[rip], -1 add rsp, 8 ret cursor: .zero 4