rs6000: Don't ICE when we disassemble an MMA variable [PR101322]

When we expand an MMA disassemble built-in with C++ using a pointer that
is cast to a valid MMA type, the type isn't passed down to the expand
machinery and we end up using the base type of the pointer which leads to
an ICE.  This patch enforces we always use the correct MMA type regardless
of the pointer type being used.

2022-08-31  Peter Bergner  <bergner@linux.ibm.com>

gcc/
	PR target/101322
	* config/rs6000/rs6000-builtin.cc (rs6000_gimple_fold_mma_builtin):
	Enforce the use of a valid MMA pointer type.

gcc/testsuite/
	PR target/101322
	* g++.target/powerpc/pr101322.C: New test.
This commit is contained in:
Peter Bergner 2022-08-31 21:14:36 -05:00
parent e8c83ab9d5
commit 2985049049
2 changed files with 23 additions and 1 deletions

View file

@ -1085,7 +1085,12 @@ rs6000_gimple_fold_mma_builtin (gimple_stmt_iterator *gsi,
unsigned nvec = (fncode == RS6000_BIF_DISASSEMBLE_ACC) ? 4 : 2;
tree dst_ptr = gimple_call_arg (stmt, 0);
tree src_ptr = gimple_call_arg (stmt, 1);
tree src_type = TREE_TYPE (src_ptr);
tree src_type = (fncode == RS6000_BIF_DISASSEMBLE_ACC)
? build_pointer_type (vector_quad_type_node)
: build_pointer_type (vector_pair_type_node);
if (TREE_TYPE (src_ptr) != src_type)
src_ptr = build1 (NOP_EXPR, src_type, src_ptr);
tree src = create_tmp_reg_or_ssa_name (TREE_TYPE (src_type));
gimplify_assign (src, build_simple_mem_ref (src_ptr), &new_seq);

View file

@ -0,0 +1,17 @@
/* PR target/101322 */
/* { dg-require-effective-target power10_ok } */
/* { dg-options "-O2 -mdejagnu-cpu=power10" } */
/* Verify we don't ICE on the following test cases. */
void
foo (char *resp, char *vpp)
{
__builtin_vsx_disassemble_pair (resp, (__vector_pair *) vpp);
}
void
bar (char *resp, char *vpp)
{
__builtin_mma_disassemble_acc (resp, (__vector_quad *)vpp);
}