Hi Alex, > -----Original Message----- > From: Alex Coplan <alex.cop...@arm.com> > Sent: 29 September 2020 14:48 > To: gcc-patches@gcc.gnu.org > Cc: ni...@redhat.com; Richard Earnshaw <richard.earns...@arm.com>; > Ramana Radhakrishnan <ramana.radhakrish...@arm.com>; Kyrylo > Tkachov <kyrylo.tkac...@arm.com> > Subject: [PATCH] arm: Fix ICEs in no-literal-pool.c on MVE > > Hello, > > This patch fixes ICEs when compiling > gcc/testsuite/gcc.target/arm/pure-code/no-literal-pool.c with > -mfp16-format=ieee -mfloat-abi=hard -march=armv8.1-m.main+mve > -mpure-code. > > The existing conditions in the movsf/movdf expanders (as well as the > no_literal_pool patterns) were too restrictive, requiring > TARGET_HARD_FLOAT instead of TARGET_VFP_BASE, which caused > unrecognised > insns when compiling this testcase with integer MVE and -mpure-code. > > Testing: > * Bootstrapped and regtested on arm-none-linux-gnueabihf. > * Regtested an MVE cross build. > > Comparison of test results before/after patch on MVE build: > > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O0 > scan-assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O0 > scan-assembler text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O0 (test for > excess errors) > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O1 > scan-assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O1 > scan-assembler text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O1 (test for > excess errors) > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 -flto - > fno-use-linker-plugin -flto-partition=none -ffat-lto-objects scan-assembler- > not \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 -flto - > fno-use-linker-plugin -flto-partition=none -ffat-lto-objects scan-assembler > text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 -flto -fno-use- > linker-plugin -flto-partition=none -ffat-lto-objects (test for excess errors) > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 -flto - > fuse-linker-plugin -fno-fat-lto-objects -ffat-lto-objects scan-assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 -flto - > fuse-linker-plugin -fno-fat-lto-objects -ffat-lto-objects scan-assembler > text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 -flto -fuse- > linker-plugin -fno-fat-lto-objects -ffat-lto-objects (test for excess errors) > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 > scan-assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 > scan-assembler text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O2 (test for > excess errors) > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O3 - > fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions > scan-assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O3 - > fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions > scan-assembler text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -O3 -fomit-frame- > pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (test for > excess > errors) > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -Os > scan-assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > UNRESOLVED->PASS: gcc.target/arm/pure-code/no-literal-pool.c -Os > scan-assembler text,"0x20000006" > FAIL->PASS: gcc.target/arm/pure-code/no-literal-pool.c -Os (test for > excess errors) > UNRESOLVED->PASS: gcc.target/arm/thumb2-slow-flash-data-1.c scan- > assembler-not > \\.(float|l\\?double|d?byte|short|int|long|quad|word)\\s+[^.] > FAIL->PASS: gcc.target/arm/thumb2-slow-flash-data-1.c (test for excess > errors) > > OK for trunk?
Ok. Thanks, Kyrill > > Thanks, > Alex > > --- > > gcc/ChangeLog: > > * config/arm/arm.md (movsf): Relax TARGET_HARD_FLOAT to > TARGET_VFP_BASE. > (movdf): Likewise. > * config/arm/vfp.md (no_literal_pool_df_immediate): Likewise. > (no_literal_pool_sf_immediate): Likewise.