https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109907
--- Comment #23 from Georg-Johann Lay <gjl at gcc dot gnu.org> --- Thank you so much for looking into this. For the test case from comment #21 though, the problem is somewhere in tree optimizations. > unsigned char lfsr32_mpp_ge0 (unsigned long number) > { > unsigned char b = 0; > if (number >= 0) b--; > if (number & (1UL << 29)) b++; > if (number & (1UL << 13)) b++; > > return b; > } The -fdump-tree-optimized dump reads: ;; Function lfsr32_mpp_ge0 (lfsr32_mpp_ge0, funcdef_no=0, decl_uid=1880, cgraph_uid=1, symbol_order=0) unsigned char lfsr32_mpp_ge0 (long unsigned int number) { unsigned char b; long unsigned int _1; long unsigned int _2; _Bool _3; unsigned char _8; _Bool _9; unsigned char _10; unsigned char _11; <bb 2> [local count: 1073741824]: _1 = number_5(D) & 536870912; _2 = number_5(D) & 8192; if (_2 != 0) goto <bb 4>; [50.00%] else goto <bb 3>; [50.00%] <bb 3> [local count: 536870912]: _9 = _1 == 0; _10 = (unsigned char) _9; _11 = -_10; goto <bb 5>; [100.00%] <bb 4> [local count: 536870913]: _3 = _1 != 0; _8 = (unsigned char) _3; <bb 5> [local count: 1073741824]: # b_4 = PHI <_11(3), _8(4)> return b_4; } The ANDs are expanded by expand_binop() and later passes have to deal with the 32-bit arithmnetic. combine finds one combination of andsi3 into "*sbrx_and_branch<mode>_split" with mode=si, but apart from that the mess still lives in asm.