diff options
-rw-r--r-- | gcc/config/rs6000/mma.md | 10 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.cc | 39 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr106736-1.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr106736-2.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr106736-3.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr106736-4.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr106736-5.c | 18 |
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; +} + |