Despite not defining `vec_pack_trunc_<mode>' standard named patterns the backend provides vector pack operations via its own `@pred_trunc<mode>' set of patterns and they do trigger in vectorization producing narrowing VNCVT.X.X.W assembly instructions as expected.
Enable the `vect_pack_trunc' setting for RISC-V targets then, improving GCC C test results in `-march=rv64gcv' testing as follows: -FAIL: gcc.dg/vect/pr57705.c scan-tree-dump-times vect "vectorized 1 loop" 2 +PASS: gcc.dg/vect/pr57705.c scan-tree-dump-times vect "vectorized 1 loop" 3 +PASS: gcc.dg/vect/pr59354.c scan-tree-dump vect "vectorized 1 loop" -UNSUPPORTED: gcc.dg/vect/pr97678.c +PASS: gcc.dg/vect/pr97678.c (test for excess errors) +PASS: gcc.dg/vect/pr97678.c execution test +XFAIL: gcc.dg/vect/pr97678.c scan-tree-dump vect "vectorizing stmts using SLP" -UNSUPPORTED: gcc.dg/vect/vect-bool-cmp.c +PASS: gcc.dg/vect/vect-bool-cmp.c (test for excess errors) +PASS: gcc.dg/vect/vect-bool-cmp.c execution test +PASS: gcc.dg/vect/vect-iv-4.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-multitypes-14.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-multitypes-8.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-reduc-dot-u16b.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-strided-store-u16-i4.c scan-tree-dump-times vect "vectorized 1 loops" 2 -PASS: gcc.dg/vect/slp-13-big-array.c scan-tree-dump-times vect "vectorizing stmts using SLP" 2 +XFAIL: gcc.dg/vect/slp-13-big-array.c scan-tree-dump-times vect "vectorizing stmts using SLP" 3 -PASS: gcc.dg/vect/slp-13.c scan-tree-dump-times vect "vectorizing stmts using SLP" 2 +XFAIL: gcc.dg/vect/slp-13.c scan-tree-dump-times vect "vectorizing stmts using SLP" 3 +PASS: gcc.dg/vect/slp-multitypes-10.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-10.c scan-tree-dump-times vect "vectorizing stmts using SLP" 1 +PASS: gcc.dg/vect/slp-multitypes-5.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-5.c scan-tree-dump-times vect "vectorizing stmts using SLP" 1 +PASS: gcc.dg/vect/slp-multitypes-6.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-6.c scan-tree-dump-times vect "vectorizing stmts using SLP" 1 +PASS: gcc.dg/vect/slp-multitypes-9.c scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-9.c scan-tree-dump-times vect "vectorizing stmts using SLP" 1 -UNSUPPORTED: gcc.dg/vect/slp-perm-12.c +PASS: gcc.dg/vect/slp-perm-12.c (test for excess errors) +PASS: gcc.dg/vect/slp-perm-12.c execution test -UNSUPPORTED: gcc.dg/vect/bb-slp-11.c +PASS: gcc.dg/vect/bb-slp-11.c (test for excess errors) +PASS: gcc.dg/vect/bb-slp-11.c execution test -FAIL: gcc.dg/vect/pr57705.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loop" 2 +PASS: gcc.dg/vect/pr57705.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loop" 3 +PASS: gcc.dg/vect/pr59354.c -flto -ffat-lto-objects scan-tree-dump vect "vectorized 1 loop" -UNSUPPORTED: gcc.dg/vect/pr97678.c -flto -ffat-lto-objects +PASS: gcc.dg/vect/pr97678.c -flto -ffat-lto-objects (test for excess errors) +PASS: gcc.dg/vect/pr97678.c -flto -ffat-lto-objects execution test +XFAIL: gcc.dg/vect/pr97678.c -flto -ffat-lto-objects scan-tree-dump vect "vectorizing stmts using SLP" -UNSUPPORTED: gcc.dg/vect/vect-bool-cmp.c -flto -ffat-lto-objects +PASS: gcc.dg/vect/vect-bool-cmp.c -flto -ffat-lto-objects (test for excess errors) +PASS: gcc.dg/vect/vect-bool-cmp.c -flto -ffat-lto-objects execution test +PASS: gcc.dg/vect/vect-iv-4.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-multitypes-14.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-multitypes-8.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-reduc-dot-u16b.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/vect-strided-store-u16-i4.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 2 -PASS: gcc.dg/vect/slp-13-big-array.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 2 +XFAIL: gcc.dg/vect/slp-13-big-array.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 3 -PASS: gcc.dg/vect/slp-13.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 2 +XFAIL: gcc.dg/vect/slp-13.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 3 +PASS: gcc.dg/vect/slp-multitypes-10.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-10.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 1 +PASS: gcc.dg/vect/slp-multitypes-5.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-5.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 1 +PASS: gcc.dg/vect/slp-multitypes-6.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-6.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 1 +PASS: gcc.dg/vect/slp-multitypes-9.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorized 1 loops" 1 +PASS: gcc.dg/vect/slp-multitypes-9.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 1 -UNSUPPORTED: gcc.dg/vect/slp-perm-12.c -flto -ffat-lto-objects +PASS: gcc.dg/vect/slp-perm-12.c -flto -ffat-lto-objects (test for excess errors) +PASS: gcc.dg/vect/slp-perm-12.c -flto -ffat-lto-objects execution test -UNSUPPORTED: gcc.dg/vect/bb-slp-11.c -flto -ffat-lto-objects +PASS: gcc.dg/vect/bb-slp-11.c -flto -ffat-lto-objects (test for excess errors) +PASS: gcc.dg/vect/bb-slp-11.c -flto -ffat-lto-objects execution test -XPASS: gcc.dg/vect/no-scevccp-outer-21.c scan-tree-dump-times vect "OUTER LOOP VECTORIZED." 1 +PASS: gcc.dg/vect/no-scevccp-outer-21.c scan-tree-dump-times vect "OUTER LOOP VECTORIZED." 1 New XFAIL results are legitimate as they are currently expected for `vect_variable_length' targets such the RISC-V one is. The new condition for `vect_pack_trunc' does not check for `riscv_v', because we don't support different RISC-V vector extensions that might or might not support the vector demotion operation, so we know it is supported as long as vector operations are in general, and individual tests are supposed to check for overall vector operation support via `vect_int' or suchlike. gcc/testsuite/ * lib/target-supports.exp (check_effective_target_vect_pack_trunc): Also succeed for `riscv*-*-*' targets. --- Hi, Overall GCC C test results have improved from: === gcc Summary === # of expected passes 187616 # of unexpected failures 672 # of unexpected successes 14 # of expected failures 1436 # of unresolved testcases 615 # of unsupported tests 4731 to: === gcc Summary === # of expected passes 187659 # of unexpected failures 670 # of unexpected successes 13 # of expected failures 1442 # of unresolved testcases 615 # of unsupported tests 4723 with no changes (except for intermittent Python failures for C++) with the remaining testsuites. There are a few of regressions in `-march=rv64gc' testing: +FAIL: gcc.dg/vect/pr97678.c scan-tree-dump vect "vectorizing stmts using SLP" +FAIL: gcc.dg/vect/slp-13-big-array.c scan-tree-dump-times vect "vectorizing stmts using SLP" 3 +FAIL: gcc.dg/vect/slp-13.c scan-tree-dump-times vect "vectorizing stmts using SLP" 3 +FAIL: gcc.dg/vect/pr97678.c -flto -ffat-lto-objects scan-tree-dump vect "vectorizing stmts using SLP" +FAIL: gcc.dg/vect/slp-13-big-array.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 3 +FAIL: gcc.dg/vect/slp-13.c -flto -ffat-lto-objects scan-tree-dump-times vect "vectorizing stmts using SLP" 3 but they are a problem presumably with `vect_int' enabling these tests for a non-vector target rather than my change and may have been fixed since (I haven't double-checked) as I have only run smoke-testing with a slightly outdated tree from Sep 29th. NB I don't know why it works despite the lack of `vec_pack_trunc_<mode>' patterns in the backend. Perhaps something has changed in the middle end since our documentation has been last updated in the relevant area. If it is the case, then I think it would be good to update our documentation and whoever knows what is going on will be best suited to do so. Questions, comments, OK to apply? Maciej --- gcc/testsuite/lib/target-supports.exp | 1 + 1 file changed, 1 insertion(+) gcc-test-riscv-vect-pack-trunc.diff Index: gcc/gcc/testsuite/lib/target-supports.exp =================================================================== --- gcc.orig/gcc/testsuite/lib/target-supports.exp +++ gcc/gcc/testsuite/lib/target-supports.exp @@ -7981,6 +7981,7 @@ proc check_effective_target_vect_pack_trunc { } { && [check_effective_target_arm_little_endian]) || ([istarget mips*-*-*] && [et-is-effective-target mips_msa]) + || [istarget riscv*-*-*] || ([istarget s390*-*-*] && [check_effective_target_s390_vx]) || [istarget amdgcn*-*-*] }}]