@@ -285,8 +285,11 @@ (define_expand "movoo"
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 @@ (define_expand "movxo"
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"
@@ -344,4 +344,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 */
@@ -28834,7 +28834,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"
new file mode 100644
@@ -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]);
+}
+
new file mode 100644
@@ -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;
+}
+
new file mode 100644
@@ -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;
+}
+
new file mode 100644
@@ -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;
+}
+
new file mode 100644
@@ -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;
+}
+