On 8/30/23 15:57, Vineet Gupta wrote:
This was tripping up gcc.c-torture/execute/pr60003.c at -O1 since the pattern semantics can't be expressed by zicond instructions. This involves test code snippet: if (a == 0) return 0; else return x; } which is equivalent to: "x = (a != 0) ? x : a"
Isn't it x = (a == 0) ? 0 : x Which seems like it ought to fit zicond just fine. If we take yours; x = (a != 0) ? x : a And simplify with the known value of a on the false arm we get: x = (a != 0 ) ? x : 0; Which is equivalent to x = (a == 0) ? 0 : x; So ISTM this does fit zicond just fine.
and matches define_insn "*czero.nez.<GPR:mode><X:mode>.opt2" | (insn 41 20 38 3 (set (reg/v:DI 136 [ x ]) | (if_then_else:DI (ne (reg/v:DI 134 [ a ]) | (const_int 0 [0])) | (reg/v:DI 136 [ x ]) | (reg/v:DI 134 [ a ]))) {*czero.nez.didi.opt2} The corresponding asm pattern generates czero.nez x, x, a ; %0, %2, %1 implying "x = (a != 0) ? 0 : a"
I get this from the RTL pattern: x = (a != 0) ? x : a x = (a != 0) ? x : 0 I think you got the arms reversed.
which is not what the pattern semantics are. Essentially "(a != 0) ? x : a" cannot be expressed with CZERO.nez
Agreed, but I think you goof'd earlier :-) Jeff