https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86847
Bug ID: 86847 Summary: [9 Regression] Switch code size growth Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: ka6ash at gmail dot com CC: marxin at gcc dot gnu.org Target Milestone: --- I noticed that the size of code has grown in switch statements between 8.1.0 and trunk. For the code shown below, gcc-trunk generates 2 jumps for each switch statement (18 in total) when gcc-8.1.0 only 11. The difference appears at switchlower1 pass. As I understand, gcc-8 prunes redundant tests when gcc-9 doesn't and instead relies on further tree optimizations (https://gcc.gnu.org/ml/gcc-patches/2017-09/msg00891.html). But the optimizations cannot manage with it as well as pruning in gcc-8 can and size grows. Enabling -O2 does not change the situation significantly. int cipher_to_alg(int cipher) { switch (cipher) { case 8: return 2; case 16: return 3; case 32: return 4; case 64: return 6; case 256: return 9; case 512: return 10; case 2048: return 11; case 4096: return 12; case 8192: return 13; } return 0; } arm-none-eabi-gcc-8.1.0 cipher.c -Os -S cipher_to_alg: cmp r0, #256 beq .L6 bgt .L3 cmp r0, #16 beq .L7 bgt .L4 cmp r0, #8 moveq r0, #2 .L15: movne r0, #0 bx lr .L4: cmp r0, #32 beq .L9 cmp r0, #64 moveq r0, #6 b .L15 .L3: cmp r0, #2048 beq .L11 bgt .L5 cmp r0, #512 moveq r0, #10 b .L15 .L5: cmp r0, #4096 beq .L13 cmp r0, #8192 moveq r0, #13 b .L15 .L6: mov r0, #9 bx lr .L7: mov r0, #3 bx lr .L9: mov r0, #4 bx lr .L11: mov r0, #11 bx lr .L13: mov r0, #12 bx lr arm-none-eabi-gcc-9.0.0 cipher.c -Os -S cipher_to_alg: cmp r0, #256 bgt .L2 beq .L8 cmp r0, #16 bgt .L4 beq .L9 cmp r0, #8 bgt .L20 bne .L20 mov r0, #2 bx lr .L4: cmp r0, #32 bgt .L5 bne .L20 mov r0, #4 bx lr .L5: cmp r0, #64 bgt .L20 bne .L20 mov r0, #6 bx lr .L2: cmp r0, #2048 bgt .L6 beq .L15 cmp r0, #512 bgt .L20 bne .L20 mov r0, #10 bx lr .L6: cmp r0, #4096 bgt .L7 bne .L20 mov r0, #12 bx lr .L7: cmp r0, #8192 bgt .L20 bne .L20 mov r0, #13 bx lr .L8: mov r0, #9 bx lr .L9: mov r0, #3 bx lr .L15: mov r0, #11 bx lr .L20: mov r0, #0 bx lr