https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114684
Bug ID: 114684 Summary: `-(int)(unsigned:1)signed:1` could just be `(int)signed:1` Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Take: ``` struct t{ signed s1 : 1; unsigned u1 : 1; } b = {-1}; int f() { struct t tt = b; return tt.s1; } int f1() { struct t tt = b; tt.u1 = tt.s1; int ttt = tt.u1; return -ttt; } ``` These 2 functions should produce the same code. (For aarch64 it almost does, there is an extra sign extend in f). I noticed this while fixing PR 114666. It is also related to PR 101955. Note this only works for 1bit signed values.