IDA Pro v9.3 fails to analyze a standard jump table in MIPS32 big-endian code compiled at -O2 or -O3. The jr at 0x4007b0 is not recognized as a switch dispatch. IDA draws no outgoing edges from the indirect jump, leaving the rest of the function appearing unreachable.
The issue reproduces with both GCC v14 and LLVM/Clang v19, on both MIPS32 and MIPS64, and regardless of whether the binary is stripped or contains full DWARF debug info. Ghidra v12 correctly identifies all switch cases in every combination.
The same source compiled at -O0 is recognized correctly by IDA.
Disassembly of a reproducer function via llvm-objdump:
00400770 <fn>:
400770: 10 a0 00 ce beqz $5, 0x400aac <fn+0x33c>
400774: 3c 0d 00 40 lui $13, 0x40
400778: 00 00 38 25 move $7, $zero
40077c: 00 00 30 25 move $6, $zero
400780: 00 00 10 25 move $2, $zero
400784: 00 00 60 25 move $12, $zero
400788: 00 00 50 25 move $10, $zero
40078c: 00 00 48 25 move $9, $zero
400790: 00 00 40 25 move $8, $zero
400794: 25 ad 0b 60 addiu $13, $13, 0xb60
400798: 00 88 58 21 addu $11, $4, $8
40079c: 91 63 00 00 lbu $3, 0x0($11)
4007a0: 30 63 00 0f andi $3, $3, 0xf
4007a4: 00 03 18 80 sll $3, $3, 0x2
4007a8: 01 a3 18 21 addu $3, $13, $3
4007ac: 8c 6b 00 00 lw $11, 0x0($3)
4007b0: 01 60 00 08 jr $11
4007b4: 00 00 00 00 nop
4007b8: 25 03 00 01 addiu $3, $8, 0x1
4007bc: 00 65 58 2b sltu $11, $3, $5
4007c0: 15 60 00 c1 bnez $11, 0x400ac8 <fn+0x358>
4007c4: 00 00 00 00 nop
4007c8: 00 0a 28 42 srl $5, $10, 0x1
4007cc: 3c 03 c4 ce lui $3, 0xc4ce
4007d0: 3c 04 1a 85 lui $4, 0x1a85
4007d4: 00 a9 28 26 xor $5, $5, $9
4007d8: 34 63 b9 fe ori $3, $3, 0xb9fe
4007dc: 00 a3 00 18 mult $5, $3
4007e0: 34 84 ec 53 ori $4, $4, 0xec53
4007e4: 71 44 00 00 madd $10, $4
4007e8: 01 87 18 26 xor $3, $12, $7
4007ec: 00 46 10 26 xor $2, $2, $6
4007f0: 00 00 50 12 mflo $10
4007f4: 00 a4 00 19 multu $5, $4
4007f8: 00 00 20 10 mfhi $4
4007fc: 00 00 28 12 mflo $5
400800: 01 44 20 21 addu $4, $10, $4
400804: 00 65 18 26 xor $3, $3, $5
400808: 00 04 30 42 srl $6, $4, 0x1
40080c: 00 44 10 26 xor $2, $2, $4
400810: 03 e0 00 08 jr $ra
400814: 00 66 18 26 xor $3, $3, $6
400818: 00 06 78 40 sll $15, $6, 0x1
40081c: 31 83 00 3f andi $3, $12, 0x3f
400820: 00 66 c0 06 srlv $24, $6, $3
400824: 00 67 70 06 srlv $14, $7, $3
400828: 00 03 18 27 nor $3, $zero, $3
40082c: 00 6f 18 04 sllv $3, $15, $3
400830: 31 8b 00 20 andi $11, $12, 0x20
400834: 00 6e 70 25 or $14, $3, $14
400838: 03 00 c8 25 move $25, $24
40083c: 01 cb c0 0a movz $24, $14, $11
400840: 00 09 7f c2 srl $15, $9, 0x1f
400844: 00 0b c8 0b movn $25, $zero, $11
400848: 00 0a 50 40 sll $10, $10, 0x1
40084c: 00 09 48 40 sll $9, $9, 0x1
400850: 33 03 00 01 andi $3, $24, 0x1
400854: 25 08 00 01 addiu $8, $8, 0x1
400858: 03 20 30 25 move $6, $25
40085c: 03 00 38 25 move $7, $24
400860: 01 ea 50 25 or $10, $15, $10
400864: 00 69 48 25 or $9, $3, $9
400868: 01 05 18 2b sltu $3, $8, $5
40086c: 14 60 ff cb bnez $3, 0x40079c <fn+0x2c>
400870: 00 88 58 21 addu $11, $4, $8
400874: 10 00 ff d5 b 0x4007cc <fn+0x5c>
400878: 00 0a 28 42 srl $5, $10, 0x1
40087c: 00 ec 18 25 or $3, $7, $12
400880: 00 46 30 25 or $6, $2, $6
400884: 25 08 00 01 addiu $8, $8, 0x1
400888: 00 60 38 25 move $7, $3
40088c: 01 46 50 25 or $10, $10, $6
400890: 10 00 ff f5 b 0x400868 <fn+0xf8>
400894: 01 23 48 25 or $9, $9, $3
400898: 00 ec 18 24 and $3, $7, $12
40089c: 00 46 30 24 and $6, $2, $6
4008a0: 00 60 38 25 move $7, $3
4008a4: 00 06 58 27 nor $11, $zero, $6
4008a8: 00 03 18 27 nor $3, $zero, $3
4008ac: 25 08 00 01 addiu $8, $8, 0x1
4008b0: 01 4b 50 24 and $10, $10, $11
4008b4: 10 00 ff ec b 0x400868 <fn+0xf8>
4008b8: 01 23 48 24 and $9, $9, $3
4008bc: 00 06 70 23 negu $14, $6
4008c0: 00 07 18 23 negu $3, $7
4008c4: 00 07 58 2b sltu $11, $zero, $7
4008c8: 01 cb 30 23 subu $6, $14, $11
4008cc: 25 08 00 01 addiu $8, $8, 0x1
4008d0: 10 00 ff e5 b 0x400868 <fn+0xf8>
4008d4: 00 60 38 25 move $7, $3
4008d8: 01 2c 18 21 addu $3, $9, $12
4008dc: 01 42 58 21 addu $11, $10, $2
4008e0: 00 69 50 2b sltu $10, $3, $9
4008e4: 01 4b 50 21 addu $10, $10, $11
4008e8: 00 67 48 23 subu $9, $3, $7
4008ec: 01 46 50 23 subu $10, $10, $6
4008f0: 00 c0 70 25 move $14, $6
4008f4: 00 e0 58 25 move $11, $7
4008f8: 00 69 18 2b sltu $3, $3, $9
4008fc: 00 40 30 25 move $6, $2
400900: 01 80 38 25 move $7, $12
400904: 01 43 50 23 subu $10, $10, $3
400908: 25 08 00 01 addiu $8, $8, 0x1
40090c: 01 c0 10 25 move $2, $14
400910: 10 00 ff d5 b 0x400868 <fn+0xf8>
400914: 01 60 60 25 move $12, $11
400918: 24 e3 ff ff addiu $3, $7, -0x1
40091c: 2c eb 00 01 sltiu $11, $7, 0x1
400920: 00 c0 10 25 move $2, $6
400924: 00 e0 60 25 move $12, $7
400928: 00 cb 30 23 subu $6, $6, $11
40092c: 25 08 00 01 addiu $8, $8, 0x1
400930: 10 00 ff cd b 0x400868 <fn+0xf8>
400934: 00 60 38 25 move $7, $3
400938: 24 03 01 b3 addiu $3, $zero, 0x1b3
40093c: 00 09 5a 00 sll $11, $9, 0x8
400940: 01 23 00 19 multu $9, $3
400944: 25 08 00 01 addiu $8, $8, 0x1
400948: 00 00 78 12 mflo $15
40094c: 00 00 70 10 mfhi $14
400950: 71 43 48 02 mul $9, $10, $3
400954: 01 2b 18 21 addu $3, $9, $11
400958: 01 87 48 21 addu $9, $12, $7
40095c: 00 46 58 21 addu $11, $2, $6
400960: 01 2c 50 2b sltu $10, $9, $12
400964: 00 6e 70 21 addu $14, $3, $14
400968: 01 4b 50 21 addu $10, $10, $11
40096c: 01 2f 48 26 xor $9, $9, $15
400970: 10 00 ff bd b 0x400868 <fn+0xf8>
400974: 01 4e 50 26 xor $10, $10, $14
400978: 00 46 18 2b sltu $3, $2, $6
40097c: 14 60 00 05 bnez $3, 0x400994 <fn+0x224>
400980: 00 c0 58 25 move $11, $6
400984: 14 c2 00 08 bne $6, $2, 0x4009a8 <fn+0x238>
400988: 01 87 18 2b sltu $3, $12, $7
40098c: 10 60 00 06 beqz $3, 0x4009a8 <fn+0x238>
400990: 00 00 00 00 nop
400994: 00 e0 18 25 move $3, $7
400998: 00 40 30 25 move $6, $2
40099c: 01 80 38 25 move $7, $12
4009a0: 01 60 10 25 move $2, $11
4009a4: 00 60 60 25 move $12, $3
4009a8: 10 00 ff af b 0x400868 <fn+0xf8>
4009ac: 25 08 00 01 addiu $8, $8, 0x1
4009b0: 00 07 cc c2 srl $25, $7, 0x13
4009b4: 00 06 7c c2 srl $15, $6, 0x13
4009b8: 00 0a 1e 40 sll $3, $10, 0x19
4009bc: 00 09 5e 40 sll $11, $9, 0x19
4009c0: 00 06 c3 40 sll $24, $6, 0xd
4009c4: 00 07 73 40 sll $14, $7, 0xd
4009c8: 00 09 49 c2 srl $9, $9, 0x7
4009cc: 00 0a 51 c2 srl $10, $10, 0x7
4009d0: 25 08 00 01 addiu $8, $8, 0x1
4009d4: 03 38 30 25 or $6, $25, $24
4009d8: 01 ee 38 25 or $7, $15, $14
4009dc: 01 6a 50 25 or $10, $11, $10
4009e0: 10 00 ff a1 b 0x400868 <fn+0xf8>
4009e4: 00 69 48 25 or $9, $3, $9
4009e8: 00 ec 18 26 xor $3, $7, $12
4009ec: 00 46 30 26 xor $6, $2, $6
4009f0: 25 08 00 01 addiu $8, $8, 0x1
4009f4: 00 60 38 25 move $7, $3
4009f8: 00 4a 10 26 xor $2, $2, $10
4009fc: 10 00 ff 9a b 0x400868 <fn+0xf8>
400a00: 01 89 60 26 xor $12, $12, $9
400a04: 00 47 00 18 mult $2, $7
400a08: 35 8b 00 01 ori $11, $12, 0x1
400a0c: 71 66 00 00 madd $11, $6
400a10: 25 08 00 01 addiu $8, $8, 0x1
400a14: 00 00 18 12 mflo $3
400a18: 00 eb 00 19 multu $7, $11
400a1c: 00 00 30 10 mfhi $6
400a20: 00 00 38 12 mflo $7
400a24: 00 66 30 21 addu $6, $3, $6
400a28: 01 27 48 26 xor $9, $9, $7
400a2c: 10 00 ff 8e b 0x400868 <fn+0xf8>
400a30: 01 46 50 26 xor $10, $10, $6
400a34: 00 ec 18 21 addu $3, $7, $12
400a38: 00 c2 58 21 addu $11, $6, $2
400a3c: 00 67 70 2b sltu $14, $3, $7
400a40: 01 cb 30 21 addu $6, $14, $11
400a44: 00 60 38 25 move $7, $3
400a48: 01 23 18 21 addu $3, $9, $3
400a4c: 01 46 50 21 addu $10, $10, $6
400a50: 00 69 48 2b sltu $9, $3, $9
400a54: 01 2a 50 21 addu $10, $9, $10
400a58: 25 08 00 01 addiu $8, $8, 0x1
400a5c: 10 00 ff 82 b 0x400868 <fn+0xf8>
400a60: 00 60 48 25 move $9, $3
400a64: 25 03 00 01 addiu $3, $8, 0x1
400a68: 00 65 58 2b sltu $11, $3, $5
400a6c: 11 60 00 12 beqz $11, 0x400ab8 <fn+0x348>
400a70: 00 83 18 21 addu $3, $4, $3
400a74: 00 00 30 25 move $6, $zero
400a78: 90 67 00 00 lbu $7, 0x0($3)
400a7c: 10 00 ff 7a b 0x400868 <fn+0xf8>
400a80: 25 08 00 02 addiu $8, $8, 0x2
400a84: 3c 0a 14 05 lui $10, 0x1405
400a88: 3c 09 f7 67 lui $9, 0xf767
400a8c: 00 00 38 25 move $7, $zero
400a90: 00 00 30 25 move $6, $zero
400a94: 25 08 00 01 addiu $8, $8, 0x1
400a98: 25 4a 7b 7e addiu $10, $10, 0x7b7e
400a9c: 00 00 10 25 move $2, $zero
400aa0: 00 00 60 25 move $12, $zero
400aa4: 10 00 ff 70 b 0x400868 <fn+0xf8>
400aa8: 35 29 81 4f ori $9, $9, 0x814f
400aac: 00 00 10 25 move $2, $zero
400ab0: 03 e0 00 08 jr $ra
400ab4: 00 00 18 25 move $3, $zero
400ab8: 00 00 38 25 move $7, $zero
400abc: 00 00 30 25 move $6, $zero
400ac0: 10 00 ff 69 b 0x400868 <fn+0xf8>
400ac4: 25 08 00 02 addiu $8, $8, 0x2
400ac8: 00 83 18 21 addu $3, $4, $3
400acc: 90 63 00 00 lbu $3, 0x0($3)
400ad0: 00 65 58 2b sltu $11, $3, $5
400ad4: 11 60 ff e9 beqz $11, 0x400a7c <fn+0x30c>
400ad8: 00 00 00 00 nop
400adc: 10 00 ff 2e b 0x400798 <fn+0x28>
400ae0: 00 60 40 25 move $8, $3