[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #8 from Uroš Bizjak --- *** Bug 91453 has been marked as a duplicate of this bug. ***
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #7 from Richard Biener --- Author: rguenth Date: Thu Aug 15 12:44:23 2019 New Revision: 274535 URL: https://gcc.gnu.org/viewcvs?rev=274535=gcc=rev Log: 2019-08-15 Richard Biener PR target/91454 * config/i386/i386-features.c (gen_gpr_to_xmm_move_src): New helper. (general_scalar_chain::make_vector_copies): Use it. Modified: trunk/gcc/ChangeLog trunk/gcc/config/i386/i386-features.c
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 Richard Biener changed: What|Removed |Added Status|ASSIGNED|RESOLVED Resolution|--- |FIXED --- Comment #6 from Richard Biener --- Fixed.
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #5 from Richard Biener --- (In reply to Richard Biener from comment #4) > Btw, remove_partial_avx_dependency suggests the VEC_MERGE/DUPLICATE form > is canonical for V2DFmode ... (is it?). Not according to typedef double v2di __attribute__((vector_size(16))); v2di foo (double x) { return (v2di) { x, 0. }; } which produces (insn 6 3 7 2 (set (reg:V2DF 85) (vec_concat:V2DF (reg/v:DF 83 [ x ]) (const_double:DF 0.0 [0x0.0p+0]))) "t.c":5:10 3056 {vec_concatv2df} (nil)) but maybe the merge/duplicate pattern also exists.
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #4 from Richard Biener --- Btw, remove_partial_avx_dependency suggests the VEC_MERGE/DUPLICATE form is canonical for V2DFmode ... (is it?). Otherwise untested fix: Index: gcc/config/i386/i386-features.c === --- gcc/config/i386/i386-features.c (revision 274504) +++ gcc/config/i386/i386-features.c (working copy) @@ -658,6 +658,25 @@ scalar_chain::emit_conversion_insns (rtx emit_insn_after (insns, BB_HEAD (new_bb)); } +/* Generate the canonical SET_SRC to move GPR to a VMODE vector register, + zeroing the upper parts. */ + +static rtx +gen_gpr_to_xmm_move_src (enum machine_mode vmode, rtx gpr) +{ + switch (GET_MODE_NUNITS (vmode)) +{ +case 1: + return gen_rtx_SUBREG (vmode, gpr, 0); +case 2: + return gen_rtx_VEC_CONCAT (vmode, gpr, +CONST0_RTX (GET_MODE_INNER (vmode))); +default: + return gen_rtx_VEC_MERGE (vmode, gen_rtx_VEC_DUPLICATE (vmode, gpr), + CONST0_RTX (vmode), GEN_INT (HOST_WIDE_INT_1U)); +} +} + /* Make vector copies for all register REGNO definitions and replace its uses in a chain. */ @@ -684,13 +703,8 @@ general_scalar_chain::make_vector_copies } else emit_move_insn (tmp, reg); - emit_insn (gen_rtx_SET - (gen_rtx_SUBREG (vmode, vreg, 0), -gen_rtx_VEC_MERGE (vmode, - gen_rtx_VEC_DUPLICATE (vmode, - tmp), - CONST0_RTX (vmode), - GEN_INT (HOST_WIDE_INT_1U; + emit_insn (gen_rtx_SET (gen_rtx_SUBREG (vmode, vreg, 0), + gen_gpr_to_xmm_move_src (vmode, tmp))); } else if (!TARGET_64BIT && smode == DImode) { @@ -720,13 +734,8 @@ general_scalar_chain::make_vector_copies } } else - emit_insn (gen_rtx_SET - (gen_rtx_SUBREG (vmode, vreg, 0), - gen_rtx_VEC_MERGE (vmode, - gen_rtx_VEC_DUPLICATE (vmode, - reg), - CONST0_RTX (vmode), - GEN_INT (HOST_WIDE_INT_1U; + emit_insn (gen_rtx_SET (gen_rtx_SUBREG (vmode, vreg, 0), + gen_gpr_to_xmm_move_src (vmode, reg))); rtx_insn *seq = get_insns (); end_sequence (); rtx_insn *insn = DF_REF_INSN (ref);
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 Richard Biener changed: What|Removed |Added Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #3 from Richard Biener --- Instead we seem to use (insn 6 3 7 2 (set (reg:V2DI 85) (vec_concat:V2DI (reg/v:DI 83 [ x ]) (const_int 0 [0]))) "t.c":5:10 4212 {*vec_concatv2di_0} (nil)) bah. Is there a helper abstracting the canonical forms for this?
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #2 from Richard Biener --- Looks like we miss a pattern for (insn 162 16 163 2 (set (subreg:V2DI (reg:DI 169) 0) (vec_merge:V2DI (vec_duplicate:V2DI (reg:DI 101 [ ubound.0 ])) (const_vector:V2DI [ (const_int 0 [0]) repeated x2 ]) (const_int 1 [0x1]))) "t.f90":8:0 -1 (nil)) ? I expected that this canonical form for movq gpr, %xmm is handled?
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 --- Comment #1 from Martin Liška --- Another issues caused by the revision: $ gfortran /home/marxin/Programming/gcc/gcc/testsuite/gfortran.dg/power_8.f90 -fno-ivopts -Os -m32 -mtune=athlon-tbird /home/marxin/Programming/gcc/gcc/testsuite/gfortran.dg/power_8.f90:63:0: 63 | end program p | Error: unrecognizable insn: (insn 289 288 63 7 (set (subreg:V2DI (reg:DI 202) 0) (vec_merge:V2DI (vec_duplicate:V2DI (mem/c:DI (plus:SI (reg/f:SI 19 frame) (const_int -8 [0xfff8])) [0 S8 A64])) (const_vector:V2DI [ (const_int 0 [0]) repeated x2 ]) (const_int 1 [0x1]))) "/home/marxin/Programming/gcc/gcc/testsuite/gfortran.dg/power_8.f90":20:0 -1 (nil)) during RTL pass: subreg3 /home/marxin/Programming/gcc/gcc/testsuite/gfortran.dg/power_8.f90:63:0: internal compiler error: in extract_insn, at recog.c:2310 0x6b6b2f _fatal_insn(char const*, rtx_def const*, char const*, int, char const*) /home/marxin/Programming/gcc/gcc/rtl-error.c:108 0x6b6b4b _fatal_insn_not_found(rtx_def const*, char const*, int, char const*) /home/marxin/Programming/gcc/gcc/rtl-error.c:116 0x6b4cd3 extract_insn(rtx_insn*) /home/marxin/Programming/gcc/gcc/recog.c:2310 0x172de67 decompose_multiword_subregs /home/marxin/Programming/gcc/gcc/lower-subreg.c:1540 0x172ef9d execute /home/marxin/Programming/gcc/gcc/lower-subreg.c:1808 $ gcc /home/marxin/Programming/gcc/gcc/testsuite/c-c++-common/ubsan/overflow-sub-2.c -m32 -mtune=k6-2 -Ofast during RTL pass: pro_and_epilogue /home/marxin/Programming/gcc/gcc/testsuite/c-c++-common/ubsan/overflow-sub-2.c: In function ‘main’: /home/marxin/Programming/gcc/gcc/testsuite/c-c++-common/ubsan/overflow-sub-2.c:43:1: internal compiler error: in ix86_expand_epilogue, at config/i386/i386.c:8974 43 | } | ^ 0x765f5f ix86_expand_epilogue(int) /home/marxin/Programming/gcc/gcc/config/i386/i386.c:8974 0x1402340 gen_epilogue() /home/marxin/Programming/gcc/gcc/config/i386/i386.md:12970 0x10f0f98 target_gen_epilogue /home/marxin/Programming/gcc/gcc/config/i386/i386.md:12469 0xad20b8 make_epilogue_seq /home/marxin/Programming/gcc/gcc/function.c:5762 0xad21bb thread_prologue_and_epilogue_insns() /home/marxin/Programming/gcc/gcc/function.c:5844 0xad28b2 rest_of_handle_thread_prologue_and_epilogue /home/marxin/Programming/gcc/gcc/function.c:6334 0xad28b2 execute /home/marxin/Programming/gcc/gcc/function.c:6376
[Bug target/91454] [10 Regression] ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91454 Martin Liška changed: What|Removed |Added Status|UNCONFIRMED |NEW Last reconfirmed||2019-08-15 Known to work||9.1.0 Target Milestone|--- |10.0 Ever confirmed|0 |1 Known to fail||10.0