https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70335
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |arm* --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- But I see { int b; int a; unsigned int _4; signed char _6; int _7; unsigned char _9; int _10; <bb 2>: _4 = (unsigned int) x_3(D); if (_4 <= 66) goto <bb 8> (<L13>); else goto <bb 7> (<L12>); <L12>: a_11 = 0; b_15 = 18; goto <bb 6> (<L14>); <L13>: _6 = CSWTCH.2[_4]; _7 = (int) _6; a_5 = _7; _9 = CSWTCH.3[_4]; _10 = (int) _9; b_8 = _10; # a_1 = PHI <a_5(8), a_11(7)> # b_2 = PHI <b_8(8), b_15(7)> <L14>: <L11>: va = a_1; vb = b_2; return; thus it is zero-extended on GIMPLE and also in asm: cmp r0, #66 movhi r2, #18 movhi r0, #0 ldrls r3, .L5 ldrsbls r0, [r3, r0]! ldr r1, .L5+4 ldrbls r2, [r3, #68] @ zero_extendqisi2 ldr r3, .L5+8 str r0, [r1] str r2, [r3] there is CSWTCH.3: .byte -128 .byte -118 ... but that shouldn't really matter [the constructor elts probably have bogus types?!] Note the above is what I observe on trunk.