https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118012

--- Comment #25 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
Here is a test case for riscv:

#define T unsigned long long

T func (T a, T b, T c)
{
    if (b & 1)
        a ^= c;
    return a;
}

$ riscv32-unknown-linux-gnu-gcc x.c -Os -S -dp -march=rv32e -mabi=ilp32e && cat
x.s

func:
.LFB0:
        .cfi_startproc
        addi    sp,sp,-12       # 46    [c=4 l=4]  *addsi3/1
        .cfi_def_cfa_offset 12
        sw      s0,4(sp)        # 48    [c=4 l=4]  *movsi_internal/3
        sw      s1,0(sp)        # 49    [c=4 l=4]  *movsi_internal/3
        .cfi_offset 8, -8
        .cfi_offset 9, -12
        mv      s0,a0   # 35    [c=4 l=4]  *movsi_internal/0
        mv      s1,a1   # 36    [c=4 l=4]  *movsi_internal/0
        andi    a0,a2,1 # 27    [c=4 l=4]  *andsi3/1
        mv      a3,a5   # 45    [c=4 l=4]  *movsi_internal/0
        mv      a2,a4   # 44    [c=4 l=4]  *movsi_internal/0
        li      a1,0            # 28    [c=4 l=4]  *movsi_internal/1
        sw      ra,8(sp)        # 47    [c=4 l=4]  *movsi_internal/3
        .cfi_offset 1, -4
        call    __muldi3                # 12    [c=28 l=8] 
call_value_internal/1
        lw      ra,8(sp)                # 52    [c=16 l=4]  *movsi_internal/2
        .cfi_restore 1
        xor     a0,a0,s0        # 33    [c=4 l=4]  *xorsi3/0
        lw      s0,4(sp)                # 53    [c=16 l=4]  *movsi_internal/2
        .cfi_restore 8
        xor     a1,a1,s1        # 34    [c=4 l=4]  *xorsi3/0
        lw      s1,0(sp)                # 54    [c=16 l=4]  *movsi_internal/2
        .cfi_restore 9
        addi    sp,sp,12        # 56    [c=4 l=4]  *addsi3/1
        .cfi_def_cfa_offset 0
        jr      ra              # 57    [c=0 l=4]  simple_return_internal

whereas without the transformation:

T func (T a, T b, T c)
{
    if (b & 1)
    {   
        __asm ("");
        a ^= c;
    }
    return a;
}

func:
.LFB0:
        .cfi_startproc
        andi    a2,a2,1 # 8     [c=4 l=4]  *andsi3/1
        beq     a2,zero,.L2     # 12    [c=8 l=4]  *branchsi
        xor     a0,a0,a4        # 41    [c=4 l=4]  *xorsi3/0
        xor     a1,a1,a5        # 42    [c=4 l=4]  *xorsi3/0
.L2:
        ret             # 63    [c=0 l=4]  simple_return

Target: riscv32-unknown-linux-gnu
Configured with: ../../source/gcc-master/configure
--target=riscv32-unknown-linux-gnu --enable-languages=c,c++ --disable-nls
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 17.0.0 20260531 (experimental) (GCC)

Reply via email to