aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/config/rs6000/mma.md10
-rw-r--r--gcc/config/rs6000/rs6000-protos.h2
-rw-r--r--gcc/config/rs6000/rs6000.cc39
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr106736-1.c20
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr106736-2.c17
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr106736-3.c18
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr106736-4.c19
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr106736-5.c18
8 files changed, 140 insertions, 3 deletions
diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md
index 032f426..f2952a3 100644
--- a/gcc/config/rs6000/mma.md
+++ b/gcc/config/rs6000/mma.md
@@ -285,8 +285,11 @@
expanding to RTL and have seen errors. It would not cause further ICEs
as the compilation would stop soon after expanding. */
}
+ else if (rs6000_opaque_type_invalid_use_p (currently_expanding_gimple_stmt))
+ ;
else
- gcc_unreachable ();
+ /* Catch unexpected cases. */
+ gcc_assert (false);
})
(define_insn_and_split "*movoo"
@@ -329,8 +332,11 @@
some missing required conditions. So do the same handlings for XOmode
as OOmode here. */
}
+ else if (rs6000_opaque_type_invalid_use_p (currently_expanding_gimple_stmt))
+ ;
else
- gcc_unreachable ();
+ /* Catch unexpected cases. */
+ gcc_assert (false);
})
(define_insn_and_split "*movxo"
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 8355621..911e251 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -347,4 +347,6 @@ extern rtx rs6000_gen_lvx (enum machine_mode, rtx, rtx);
extern rtx rs6000_gen_stvx (enum machine_mode, rtx, rtx);
extern void rs6000_emit_xxspltidp_v2df (rtx, long value);
+extern gimple *currently_expanding_gimple_stmt;
+extern bool rs6000_opaque_type_invalid_use_p (gimple *);
#endif /* rs6000-protos.h */
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index e074e8f..d362668 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -28899,7 +28899,44 @@ constant_generates_xxspltidp (vec_const_128bit_type *vsx_const)
return sf_value;
}
-
+/* Now we have only two opaque types, they are __vector_quad and
+ __vector_pair built-in types. They are target specific and
+ only available when MMA is supported. With MMA supported, it
+ simply returns true, otherwise it checks if the given gimple
+ STMT is an assignment stmt and uses either of these two opaque
+ types unexpectedly, if yes, it would raise an error message
+ and returns true, otherwise it returns false. */
+
+bool
+rs6000_opaque_type_invalid_use_p (gimple *stmt)
+{
+ if (TARGET_MMA)
+ return false;
+
+ if (stmt)
+ {
+ /* The usage of MMA opaque types is very limited for now,
+ to check with gassign is enough so far. */
+ if (gassign *ga = dyn_cast<gassign *> (stmt))
+ {
+ tree lhs = gimple_assign_lhs (ga);
+ tree type = TREE_TYPE (lhs);
+ if (type == vector_quad_type_node)
+ {
+ error ("type %<__vector_quad%> requires the %qs option", "-mmma");
+ return true;
+ }
+ else if (type == vector_pair_type_node)
+ {
+ error ("type %<__vector_pair%> requires the %qs option", "-mmma");
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-rs6000.h"
diff --git a/gcc/testsuite/gcc.target/powerpc/pr106736-1.c b/gcc/testsuite/gcc.target/powerpc/pr106736-1.c
new file mode 100644
index 0000000..65bd79d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr106736-1.c
@@ -0,0 +1,20 @@
+/* { dg-require-effective-target powerpc_p9modulo_ok } */
+/* If the default cpu type is power10 or later, type __vector_quad is
+ supported. To keep the test point available all the time, this case
+ specifies -mdejagnu-cpu=power9 here. */
+/* { dg-options "-mdejagnu-cpu=power9" } */
+
+/* Verify there is no ICE and don't check the error messages on unsupported
+ type since they could be fragile and are not test points of this case. */
+
+/* { dg-excess-errors "pr106736-1" } */
+
+extern void bar (__vector_quad *);
+
+void
+foo (__vector_quad *a, __vector_quad *b)
+{
+ __vector_quad arr[2] = {*a, *b};
+ bar (&arr[0]);
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/pr106736-2.c b/gcc/testsuite/gcc.target/powerpc/pr106736-2.c
new file mode 100644
index 0000000..12ad936
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr106736-2.c
@@ -0,0 +1,17 @@
+/* { dg-require-effective-target powerpc_p9modulo_ok } */
+/* If the default cpu type is power10 or later, type __vector_pair is
+ supported. To keep the test point available all the time, this case
+ specifies -mdejagnu-cpu=power9 here. */
+/* { dg-options "-mdejagnu-cpu=power9" } */
+
+/* Verify there is no ICE and don't check the error messages on unsupported
+ type since they could be fragile and are not test points of this case. */
+
+/* { dg-excess-errors "pr106736-2" } */
+
+void
+foo (__vector_pair *a, __vector_pair *b)
+{
+ *a = *b;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/pr106736-3.c b/gcc/testsuite/gcc.target/powerpc/pr106736-3.c
new file mode 100644
index 0000000..4fb368b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr106736-3.c
@@ -0,0 +1,18 @@
+/* { dg-require-effective-target powerpc_p9modulo_ok } */
+/* If the default cpu type is power10 or later, type __vector_quad is
+ supported. To keep the test point available all the time, this case
+ specifies -mdejagnu-cpu=power9 here. */
+/* { dg-options "-mdejagnu-cpu=power9" } */
+
+/* Verify there is no ICE and don't check the error messages on unsupported
+ type since they could be fragile and are not test points of this case. */
+
+/* { dg-excess-errors "pr106736-3" } */
+
+__vector_quad ga;
+void
+foo (__vector_quad *a)
+{
+ ga = *a;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/pr106736-4.c b/gcc/testsuite/gcc.target/powerpc/pr106736-4.c
new file mode 100644
index 0000000..4b36641
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr106736-4.c
@@ -0,0 +1,19 @@
+/* { dg-require-effective-target powerpc_p9modulo_ok } */
+/* If the default cpu type is power10 or later, type __vector_quad is
+ supported. To keep the test point available all the time, this case
+ specifies -mdejagnu-cpu=power9 here. */
+/* { dg-options "-mdejagnu-cpu=power9" } */
+
+/* Verify there is no ICE and don't check the error messages on unsupported
+ type since they could be fragile and are not test points of this case. */
+
+/* { dg-excess-errors "pr106736-4" } */
+
+__vector_quad ga;
+__vector_quad gb;
+void
+foo ()
+{
+ gb = ga;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/pr106736-5.c b/gcc/testsuite/gcc.target/powerpc/pr106736-5.c
new file mode 100644
index 0000000..d7370b8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr106736-5.c
@@ -0,0 +1,18 @@
+/* { dg-require-effective-target powerpc_p9modulo_ok } */
+/* If the default cpu type is power10 or later, type __vector_pair is
+ supported. To keep the test point available all the time, this case
+ specifies -mdejagnu-cpu=power9 here. */
+/* { dg-options "-mdejagnu-cpu=power9" } */
+
+/* Verify there is no ICE and don't check the error messages on unsupported
+ type since they could be fragile and are not test points of this case. */
+
+/* { dg-excess-errors "pr106736-5" } */
+
+__vector_pair ga;
+void
+foo (__vector_pair *a)
+{
+ *a = ga;
+}
+