Message ID | 12282b03-1673-bf87-a793-bb696c13d064@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | [v2] rs6000: Don't ICE when we disassemble an MMA variable [PR101322] | expand |
On Wed, Aug 31, 2022 at 06:36:40PM -0500, Peter Bergner wrote: > Changes from v1: > * Fix spelling typo in git log entry > * Fix broken test checking src_ptr's type > * Use NOP_EXPR rather than VIEW_CONVERT_EXPR > * Change order of dg-options > > 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. Okay for trunk and all backports (after it has survived a breath of fresh air). Thanks! Segher
On 8/31/22 6:45 PM, Segher Boessenkool wrote: > On Wed, Aug 31, 2022 at 06:36:40PM -0500, Peter Bergner wrote: >> Changes from v1: >> * Fix spelling typo in git log entry >> * Fix broken test checking src_ptr's type >> * Use NOP_EXPR rather than VIEW_CONVERT_EXPR >> * Change order of dg-options >> >> 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. > > Okay for trunk and all backports (after it has survived a breath of > fresh air). Thanks! Ok, pushed to trunk and I'll give it some burn-in time before backporting. Thanks! Peter
diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc index 12afa86854c..e6948b9abb7 100644 --- a/gcc/config/rs6000/rs6000-builtin.cc +++ b/gcc/config/rs6000/rs6000-builtin.cc @@ -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); diff --git a/gcc/testsuite/g++.target/powerpc/pr101322.C b/gcc/testsuite/g++.target/powerpc/pr101322.C new file mode 100644 index 00000000000..43eaf3afcd4 --- /dev/null +++ b/gcc/testsuite/g++.target/powerpc/pr101322.C @@ -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); +}