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)