https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71519
Bug ID: 71519 Summary: "Out of range operand" bteqz inst generated by "casesi_internal_mips16_<mode>" Product: gcc Version: 5.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: yszhou4tech at gmail dot com Target Milestone: --- There is a big switch statement in pcre_exec.c bundled with erlang 17.5. When cross compiling it with GCC 5.3.0 with MIPS16 enabled, the generated assembly code contains a bteqz instruction with out of range target label ``` mips-openwrt-linux-musl-gcc -c -Werror=return-type -Os -pipe -mno-branch-likely -mips32r2 -mtune=24kc -g3 -fno-caller-saves -fno-plt -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float -mips16 -minterlink-mips16 -iremap /home/yousong/git-repo/lede/build_dir/target-mips_24kc_musl-1.1.14/otp_src_17.5:otp_src_17.5 -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -D_GNU_SOURCE -I/home/yousong/git-repo/lede/build_dir/target-mips_24kc_musl-1.1.14/otp_src_17.5/erts/mips-openwrt-linux-gnu -fno-tree-copyrename -I/home/yousong/git-repo/lede/staging_dir/target-mips_24kc_musl-1.1.14/usr/include -I/home/yousong/git-repo/lede/staging_dir/target-mips_24kc_musl-1.1.14/include -I/home/yousong/git-repo/lede/staging_dir/toolchain-mips_24kc_gcc-5.3.0_musl-1.1.14/usr/include -I/home/yousong/git-repo/lede/staging_dir/toolchain-mips_24kc_gcc-5.3.0_musl-1.1.14/include/fortify -I/home/yousong/git-repo/lede/staging_dir/toolchain-mips_24kc_gcc-5.3.0_musl-1.1.14/include -D_GNU_SOURCE -DHAVE_CONFIG_H -Wall -Wstrict-prototypes -Wmissing-prototypes -Wdeclaration-after-statement -DUSE_THREADS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS -DERLANG_INTEGRATION -o /home/yousong/git-repo/lede/build_dir/target-mips_24kc_musl-1.1.14/otp_src_17.5/erts/emulator/pcre/obj/mips-openwrt-linux-gnu/opt/pcre_exec.o /home/yousong/git-repo/lede/build_dir/target-mips_24kc_musl-1.1.14/otp_src_17.5/erts/emulator/pcre/pcre_exec.c {standard input}: Assembler messages: {standard input}:1946: Error: operand value out of range for instruction ``` The generated code are like the following ``` 1944 .loc 1 848 0 1945 sltu $2, 156 1946 bteqz $L125 1947 sll $3, $2, 2 1948 la $2, $L127 1949 addu $3, $2, $3 1950 lw $3, 0($3) 1951 addu $2, $2, $3 1952 j $2 1953 .align 2 1954 .align 2 1955 $L127: 1956 .word $L126-$L127 1957 .word $L128-$L127 1958 .word $L129-$L127 1959 .word $L130-$L127 1960 .word $L131-$L127 ... 49207 $L125: 49208 $LBE2372 = . 49209 $LBB2374 = . 49210 .loc 1 6452 0 49211 lw $16,0($16) 49212 $LVL4091 = . ```