[Bug target/122018] x86 doesn't use BTS bitmanip instruction to both set and test bit

uis9936 at gmail dot com via Gcc-bugs <[email protected]> Wed, 05 Aug 2026 01:12:17 +0000
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122018

--- Comment #15 from uis <uis9936 at gmail dot com> ---
There are still some missed cases. Consider this:

int j(int);
int f4p(int a, int b) {
    bool t = false;
    t = (a >> b) & 1;
    int c = a | (1 << b);
    if(!t)
        return j(c);
    return a;
}

It produces following:

        .globl  f4p
        .type   f4p, @function
f4p:
.LFB4:
        .cfi_startproc
        btl     %esi, %edi
        jnc     .L38
        movl    %edi, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L38:
        btsl    %esi, %edi
        jmp     j

It would make sense for btsl here to replace btl, since if the branch will not
be taken(if flag was already set), there will be no observable change to the
value of register.

On the other hand, if I remove negation of variable t, output will be same, but
jnc will be replaced with jc, but btsl will stay, regardless of it setting flag
that was just confirmed to be set. Probably unrelated.