[gcc r11-10251] rs6000: Don't ICE when we disassemble an MMA variable [PR101322]

Peter Bergner bergner@gcc.gnu.org
Mon Sep 12 17:40:58 GMT 2022


https://gcc.gnu.org/g:15ae5487dfd3f437b47a26d6198c8e1257fec2fc

commit r11-10251-g15ae5487dfd3f437b47a26d6198c8e1257fec2fc
Author: Peter Bergner <bergner@linux.ibm.com>
Date:   Wed Aug 31 21:14:36 2022 -0500

    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-call.c (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.
    
    (cherry picked from commit 2985049049f12b0aa3366ca244d387820385b9e8)

Diff:
---
 gcc/config/rs6000/rs6000-call.c             |  7 ++++++-
 gcc/testsuite/g++.target/powerpc/pr101322.C | 17 +++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
index ef20cb30388..e58b149d022 100644
--- a/gcc/config/rs6000/rs6000-call.c
+++ b/gcc/config/rs6000/rs6000-call.c
@@ -11877,7 +11877,12 @@ rs6000_gimple_fold_mma_builtin (gimple_stmt_iterator *gsi)
       unsigned nvec = (fncode == MMA_BUILTIN_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 == MMA_BUILTIN_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);
+}


More information about the Gcc-cvs mailing list