https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120278
Bug ID: 120278 Summary: [9/10/11/12/13/14/15 Regression] Switch expansion generates extra compares with -fno-jump-tables Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: selectstriker2 at protonmail dot com Target Milestone: --- Created attachment 61423 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61423&action=edit Simple source file Starting with GCC9, switch expansion to decision tree changed and has extra comparison instructions that will only ever evaluate to false because the true case has already been eliminated above. This was noted when switching to the arm-none-eabi C compiler based on GCC9, and exists in the x86_64 C compiler as well. Godbolt example : https://godbolt.org/z/f1fzMhbEx gcc main.c -fno-jump-tables Correct in GCC8 .L10: cmpl $2, -4(%rbp) je .L2 cmpl $2, -4(%rbp) jg .L3 cmpl $0, -4(%rbp) je .L4 cmpl $1, -4(%rbp) je .L5 jmp .L6 .L3: cmpl $3, -4(%rbp) je .L7 cmpl $4, -4(%rbp) je .L8 jmp .L6 Extra/incorrect comparisons started in GCC9 .L9: cmpl $4, -4(%rbp) je .L2 cmpl $4, -4(%rbp) jg .L3 cmpl $3, -4(%rbp) je .L4 cmpl $3, -4(%rbp) jg .L3 - already checked for ==4, >4, ==3 so >3 will always be false cmpl $2, -4(%rbp) je .L5 cmpl $2, -4(%rbp) jg .L3 - already checked for ==4, >4, ==3, ==2 so >2 will always be false cmpl $0, -4(%rbp) je .L6 cmpl $1, -4(%rbp) je .L7 jmp .L3