Current code to handle -mslow-flash-data in machine description files suffers from a number of issues which this patch fixes: 1) The insn_and_split in vfp.md to load a generic floating-point constant via GPR first and move it to VFP register are guarded by !reload_completed which is forbidden explicitely in the GCC internals documentation section 17.2 point 3; 2) A number of testcase in the testsuite ICEs under -mslow-flash-data when targeting the hardfloat ABI [1]; 3) Instructions performing load from literal pool are not disabled. These problems are addressed by 2 separate actions: 1) Making the splitters take a clobber and changing the expanders accordingly to generate a mov with clobber in cases where a literal pool would be used. The splitter can thus be enabled after reload since it does not call gen_reg_rtx anymore; 2) Adding new predicates and constraints to disable literal pool loads in existing instructions when -mslow-flash-data is in effect. The patch also rework the splitter for DFmode slightly to generate an intermediate DI load instead of 2 intermediate SI loads, thus relying on the existing DI splitters instead of redoing their job. At last, the patch adds some missing arm_fp_ok effective target to some of the slow-flash-data testcases. [1] c-c++-common/Wunused-var-3.c gcc.c-torture/compile/pr72771.c gcc.c-torture/compile/vector-5.c gcc.c-torture/compile/vector-6.c gcc.c-torture/execute/20030914-1.c gcc.c-torture/execute/20050316-1.c gcc.c-torture/execute/pr59643.c gcc.dg/builtin-tgmath-1.c gcc.dg/debug/pr55730.c gcc.dg/graphite/interchange-7.c gcc.dg/pr56890-2.c gcc.dg/pr68474.c gcc.dg/pr80286.c gcc.dg/torture/pr35227.c gcc.dg/torture/pr65077.c gcc.dg/torture/pr86363.c g++.dg/torture/pr81112.C g++.dg/torture/pr82985.C g++.dg/warn/Wunused-var-7.C and a lot more in libstdc++ in special_functions/*_comp_ellint_* and special_functions/*_ellint_* directories. 2018-12-14 Thomas Preud'homme <thomas.preudhomme@arm.com> gcc/ * config/arm/arm.md (arm_movdi): Split if -mslow-flash-data and source is a constant that would be loaded by literal pool. (movsf expander): Generate a no_literal_pool_sf_immediate insn if -mslow-flash-data is present, targeting hardfloat ABI and source is a float constant that cannot be loaded via vmov. (movdf expander): Likewise but generate a no_literal_pool_df_immediate insn. (arm_movsf_soft_insn): Split if -mslow-flash-data and source is a float constant that would be loaded by literal pool. (softfloat constant movsf splitter): Splitter for the above case. (movdf_soft_insn): Split if -mslow-flash-data and source is a float constant that would be loaded by literal pool. (softfloat constant movdf splitter): Splitter for the above case. * config/arm/constraints.md (Pz): Document existing constraint. (Ha): Define constraint. (Tu): Likewise. * config/arm/predicates.md (hard_sf_operand): New predicate. (hard_df_operand): Likewise. * config/arm/thumb2.md (thumb2_movsi_insn): Split if -mslow-flash-data and constant would be loaded by literal pool. * constant/arm/vfp.md (thumb2_movsi_vfp): Likewise and disable constant load in VFP register. (movdi_vfp): Likewise. (thumb2_movsf_vfp): Use hard_sf_operand as predicate for source to prevent match for a constant load if -mslow-flash-data and constant cannot be loaded via vmov. Adapt constraint accordingly by using Ha instead of E for generic floating-point constant load. (thumb2_movdf_vfp): Likewise using hard_df_operand predicate instead. (no_literal_pool_df_immediate): Add a clobber to use as the intermediate general purpose register and also enable it after reload but disable it constant is a valid FP constant. Add constraints and generate a DI intermediate load rather than 2 SI loads. (no_literal_pool_sf_immediate): Add a clobber to use as the intermediate general purpose register and also enable it after reload. 2018-11-14 Thomas Preud'homme <thomas.preudhomme@arm.com> gcc/testsuite/ * gcc.target/arm/thumb2-slow-flash-data-2.c: Require arm_fp_ok effective target. * gcc.target/arm/thumb2-slow-flash-data-3.c: Likewise. * gcc.target/arm/thumb2-slow-flash-data-4.c: Likewise. * gcc.target/arm/thumb2-slow-flash-data-5.c: Likewise. From-SVN: r267141
Name |
Last commit
|
Last update |
---|---|---|
INSTALL | Loading commit data... | |
config | Loading commit data... | |
contrib | Loading commit data... | |
fixincludes | Loading commit data... | |
gcc | Loading commit data... | |
gnattools | Loading commit data... | |
gotools | Loading commit data... | |
include | Loading commit data... | |
intl | Loading commit data... | |
libada | Loading commit data... | |
libatomic | Loading commit data... | |
libbacktrace | Loading commit data... | |
libcc1 | Loading commit data... | |
libcpp | Loading commit data... | |
libdecnumber | Loading commit data... | |
libffi | Loading commit data... | |
libgcc | Loading commit data... | |
libgfortran | Loading commit data... | |
libgo | Loading commit data... | |
libgomp | Loading commit data... | |
libhsail-rt | Loading commit data... | |
libiberty | Loading commit data... | |
libitm | Loading commit data... | |
libobjc | Loading commit data... | |
liboffloadmic | Loading commit data... | |
libphobos | Loading commit data... | |
libquadmath | Loading commit data... | |
libsanitizer | Loading commit data... | |
libssp | Loading commit data... | |
libstdc++-v3 | Loading commit data... | |
libvtv | Loading commit data... | |
lto-plugin | Loading commit data... | |
maintainer-scripts | Loading commit data... | |
zlib | Loading commit data... | |
.dir-locals.el | Loading commit data... | |
.gitattributes | Loading commit data... | |
.gitignore | Loading commit data... | |
ABOUT-NLS | Loading commit data... | |
COPYING | Loading commit data... | |
COPYING.LIB | Loading commit data... | |
COPYING.RUNTIME | Loading commit data... | |
COPYING3 | Loading commit data... | |
COPYING3.LIB | Loading commit data... | |
ChangeLog | Loading commit data... | |
ChangeLog.jit | Loading commit data... | |
ChangeLog.tree-ssa | Loading commit data... | |
MAINTAINERS | Loading commit data... | |
Makefile.def | Loading commit data... | |
Makefile.in | Loading commit data... | |
Makefile.tpl | Loading commit data... | |
README | Loading commit data... | |
ar-lib | Loading commit data... | |
compile | Loading commit data... | |
config-ml.in | Loading commit data... | |
config.guess | Loading commit data... | |
config.rpath | Loading commit data... | |
config.sub | Loading commit data... | |
configure | Loading commit data... | |
configure.ac | Loading commit data... | |
depcomp | Loading commit data... | |
install-sh | Loading commit data... | |
libtool-ldflags | Loading commit data... | |
libtool.m4 | Loading commit data... | |
ltgcc.m4 | Loading commit data... | |
ltmain.sh | Loading commit data... | |
ltoptions.m4 | Loading commit data... | |
ltsugar.m4 | Loading commit data... | |
ltversion.m4 | Loading commit data... | |
lt~obsolete.m4 | Loading commit data... | |
missing | Loading commit data... | |
mkdep | Loading commit data... | |
mkinstalldirs | Loading commit data... | |
move-if-change | Loading commit data... | |
multilib.am | Loading commit data... | |
symlink-tree | Loading commit data... | |
test-driver | Loading commit data... | |
ylwrap | Loading commit data... |