![]() This patch eliminates an unnecessary sign extension for scalar inlined string comparisons on rv64. Conceptually this is pretty simple. Prove all the paths which "return" a value from the inlined string comparison already have sign extended values. FINAL_LABEL is the point after the calculation of the return value. So if we have a jump to FINAL_LABEL, we must have a properly extended result value at that point. Second we're going to arrange in the .md part of the expander to use an X mode temporary for the result. After computing the result we will (if necessary) extract the low part of the result using a SUBREG tagged with the appropriate SUBREG_PROMOTED_* bits. So with that background. We find a jump to FINAL_LABEL in emit_strcmp_scalar_compare_byte. Since we know the result is X mode, we can just emit the subtraction of the two chars in X mode and we'll have a properly sign extended result. There's 4 jumps to final_label in emit_strcmp_scalar. The first is just returning zero and needs trivial simplification to not force the result into SImode. The second is after calling strcmp in the library. The ABI mandates that value is sign extended, so there's nothing to do for that case. The 3rd occurs after a call to emit_strcmp_scalar_result_calculation_nonul. If we dive into that routine it needs simplificationq similar to what we did in emit_strcmp_scalar_compare_byte The 4th occurs after a call to emit_strcmp_scalar_result_calculation which again needs trivial adjustment like we've done in the other routines. Finally, at the end of expand_strcmp, just store the X mode result sitting in SUB to RESULT. The net of all that is we know every path has its result properly extended to X mode. Standard redundant extension removal will take care of the rest. We've been running this within Ventana for about 6 months, so naturally it's been through various QA cycles, dhrystone, spec2017, etc. It's also been through a build/test cycle in my tester. Waiting on results from the pre-commit testing before moving forward. gcc/ * config/riscv/riscv-string.cc (emit_strcmp_scalar_compare_byte): Set RESULT directly rather than using a new temporary. (emit_strcmp_scalar_result_calculation_nonul): Likewise. (emit_strcmp_scalar_result_calculation): Likewise. (riscv_expand_strcmp_scalar): Use CONST0_RTX rather than generating a new node. (expand_strcmp): Copy directly from SUB to RESULT. * config/riscv/riscv.md (cmpstrnsi, cmpstrsi): Pass an X mode temporary to the expansion routines. If necessary extract low part of the word to store in final result location. |
||
---|---|---|
.github | ||
c++tools | ||
config | ||
contrib | ||
fixincludes | ||
gcc | ||
gnattools | ||
gotools | ||
include | ||
INSTALL | ||
libada | ||
libatomic | ||
libbacktrace | ||
libcc1 | ||
libcody | ||
libcpp | ||
libdecnumber | ||
libffi | ||
libgcc | ||
libgfortran | ||
libgm2 | ||
libgo | ||
libgomp | ||
libgrust | ||
libiberty | ||
libitm | ||
libobjc | ||
libphobos | ||
libquadmath | ||
libsanitizer | ||
libssp | ||
libstdc++-v3 | ||
libvtv | ||
lto-plugin | ||
maintainer-scripts | ||
zlib | ||
.dir-locals.el | ||
.gitattributes | ||
.gitignore | ||
ABOUT-NLS | ||
ar-lib | ||
ChangeLog | ||
ChangeLog.jit | ||
ChangeLog.tree-ssa | ||
compile | ||
config-ml.in | ||
config.guess | ||
config.rpath | ||
config.sub | ||
configure | ||
configure.ac | ||
COPYING | ||
COPYING.LIB | ||
COPYING.RUNTIME | ||
COPYING3 | ||
COPYING3.LIB | ||
depcomp | ||
install-sh | ||
libtool-ldflags | ||
libtool.m4 | ||
ltgcc.m4 | ||
ltmain.sh | ||
ltoptions.m4 | ||
ltsugar.m4 | ||
ltversion.m4 | ||
lt~obsolete.m4 | ||
MAINTAINERS | ||
Makefile.def | ||
Makefile.in | ||
Makefile.tpl | ||
missing | ||
mkdep | ||
mkinstalldirs | ||
move-if-change | ||
multilib.am | ||
README | ||
SECURITY.txt | ||
symlink-tree | ||
test-driver | ||
ylwrap |
This directory contains the GNU Compiler Collection (GCC). The GNU Compiler Collection is free software. See the files whose names start with COPYING for copying permission. The manuals, and some of the runtime libraries, are under different terms; see the individual source files for details. The directory INSTALL contains copies of the installation information as HTML and plain text. The source of this information is gcc/doc/install.texi. The installation information includes details of what is included in the GCC sources and what files GCC installs. See the file gcc/doc/gcc.texi (together with other files that it includes) for usage and porting information. An online readable version of the manual is in the files gcc/doc/gcc.info*. See http://gcc.gnu.org/bugs/ for how to report bugs usefully. Copyright years on GCC source files may be listed using range notation, e.g., 1987-2012, indicating that every year in the range, inclusive, is a copyrightable year that could otherwise be listed individually.