https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117421
Bug ID: 117421 Summary: [RISCV] Use byte comparison instead of word comparison Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: wojciech_mula at poczta dot onet.pl Target Milestone: --- Consider this simple function: --- #include <string_view> bool ext_is_gzip(std::string_view ext) { return ext == "gzip"; } --- For the x86 target, GCC nicely inlines compile-time constant, and produces the code like that (it's from GCC 15, with `-O3 -march=icelake-server`): --- ext_is_gzip(std::basic_string_view<char, std::char_traits<char> >): xorl %eax, %eax cmpq $4, %rdi je .L5 ret .L5: cmpl $1885960807, (%rsi) sete %al ret --- However, for the RISC-V target, GCC emits plain byte-by-byte comparison (riscv64-unknown-linux-gnu-g++ (crosstool-NG UNKNOWN) 15.0.0 20241031 (experimental), with `-O3 -march=rv64gcv`): --- ext_is_gzip(std::basic_string_view<char, std::char_traits<char> >): addi sp,sp,-16 sd a0,0(sp) sd a1,8(sp) li a5,4 beq a0,a5,.L9 li a0,0 addi sp,sp,16 jr ra .L9: lbu a4,0(a1) li a5,103 beq a4,a5,.L10 .L3: li a0,1 .L4: xori a0,a0,1 addi sp,sp,16 jr ra .L10: lbu a4,1(a1) li a5,122 bne a4,a5,.L3 lbu a4,2(a1) li a5,105 bne a4,a5,.L3 lbu a4,3(a1) li a5,112 li a0,0 beq a4,a5,.L4 li a0,1 j .L4 --- My wild guess is that we have by default a high cost of placing huge compile-time values in RISC-V. However, when I checked what is emitted for "gzip" & "pizg" given as u32, then we have: --- 0: 677a7537 lui a0,0x677a7 4: 9705051b addiw a0,a0,-1680 # 677a6970 8: 70698537 lui a0,0x70698 c: a675051b addiw a0,a0,-1433 # 70697a67 --- A godbolt link for convenience: https://godbolt.org/z/e16bP369n.