Hello,
running the testsuite in powerpc64le-linux with --with-cpu=power7 causes
FAIL: tmpdir-g++.dg-struct-layout-1/t024 cp_compat_x_tst.o compile, (internal
compiler error)
due to an unrecognizable insn
(insn 137 136 138 5 (set (reg:V2DI 5 5)
(vec_select:V2DI (reg:V2DI 211)
(parallel [
(const_int 1 [0x1])
(const_int 0 [0])
])))
/home/gcc-build/gcc/testsuite/g++/g++.dg-struct-layout-1//t024_test.h:6 -1
(nil))
i.e. an attempted vector permute into a GPR hard reg. It turns out this happens
when rs6000_emit_le_vsx_move is called with a GPR hard reg destination, which
in turn can happen when passing vectors to a vararg routine.
However, rs6000_emit_le_vsx_move is not set up to handle GPRs. Fortunately,
for GPRs this routine is not actually necessary; vectors can be loaded into
GPRs using the regular move patterns.
This patch fixes the problem by not invoking the rs6000_emit_le_vsx_move special
case if a hard reg GPR is involved as source/destination.
Tested on powerpc64le-linux.
OK for mainline?
Bye,
Ulrich
ChangeLog:
* config/rs6000/vector.md ("mov<mode>"): Do not call
rs6000_emit_le_vsx_move to move into or out of GPRs.
* config/rs6000/rs6000.c (rs6000_emit_le_vsx_move): Assert
source and destination are not GPR hard regs.
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 205009)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -7947,6 +7947,7 @@
gcc_assert (!BYTES_BIG_ENDIAN
&& VECTOR_MEM_VSX_P (mode)
&& mode != TImode
+ && !gpr_or_gpr_p (dest, source)
&& (MEM_P (source) ^ MEM_P (dest)));
if (MEM_P (source))
Index: gcc/config/rs6000/vector.md
===================================================================
--- gcc/config/rs6000/vector.md (revision 205009)
+++ gcc/config/rs6000/vector.md (working copy)
@@ -108,6 +108,7 @@
if (!BYTES_BIG_ENDIAN
&& VECTOR_MEM_VSX_P (<MODE>mode)
&& <MODE>mode != TImode
+ && !gpr_or_gpr_p (operands[0], operands[1])
&& (memory_operand (operands[0], <MODE>mode)
^ memory_operand (operands[1], <MODE>mode)))
{
--
Dr. Ulrich Weigand
GNU/Linux compilers and toolchain
[email protected]