https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119114
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2025-03-08 Ever confirmed|0 |1 --- Comment #13 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Robin Dapp from comment #9) > I suspect the problem lies somewhere here: > > _11 = .VEC_EXTRACT (mask__83.22_110, 0); > _23 = MEM[(short int *)&t + 20B]; > _24 = _23 & _132; > _25 = _24 != 0; > _121 = (<signed-boolean:1>) _25; > _157 = _11 ^ _121; > > For > _121 = (<signed-boolean:1>) _25; > we seem to be negating a 1 to a -1. Once the -1 is xor'ed with 1 the result > is -2 instead of the expected 0. It's not the negation itself but rather > the whole sequence leading to it. No you got it wrong. _121 will either be -1 or 0. _11 should be -1 or 0 too. So the question is what was the VEC_EXTRACT doing the right thing? Is it 0/-1 or 0/1? > _25 = _24 != 0; // 1 > _127 = (<signed-boolean:1>) _25; // 1 > _157 = _127 ^ _278; // 1 > When _24 is 3, _25 is 1, and _127 should be 1 ? Just like cast to 1 bit. No, _127 will be -1. BUT _278 should be 0/-1 and not 0/1. `signed-boolean:1` can only have 0 or -1. Anything else is undefined. So this is why I ask about the _278 above. > 135 │ 102de: 8f35 xor a4,a4,a3 // > a4 = -2, a3 = 1 a3 should have been -1. a3 comes from: 130 │ 102cc: 5c10b0d7 vmerge.vim v1,v1,1,v0 // v1.b = {1} 131 │ 102d0: 421026d7 vmv.x.s a3,v1 // a3 = 1 Which I assume is expanded from the VEC_EXTRACT above? If so there is a missing sign extend going on when we are extracting from a `vector(8) <signed-boolean:1>` to `<signed-boolean:1>`.