aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorKewen Lin <linkw@linux.ibm.com>2022-12-20 21:02:08 -0600
committerKewen Lin <linkw@linux.ibm.com>2022-12-20 21:02:08 -0600
commit282462b39584ae49eaaa6f53bd44b6cfdc4ccbcb (patch)
tree21893f93acb887e477cd90a9e209a0f3dc069b6a /gcc/config
parentef0abcbc400e0ecb8ed1ddf61d96f8f3f88fe63b (diff)
downloadgcc-282462b39584ae49eaaa6f53bd44b6cfdc4ccbcb.zip
gcc-282462b39584ae49eaaa6f53bd44b6cfdc4ccbcb.tar.gz
gcc-282462b39584ae49eaaa6f53bd44b6cfdc4ccbcb.tar.bz2
rs6000: Raise error for __vector_{quad,pair} uses without MMA enabled [PR106736]
As PR106736 shows, it's unexpected to use __vector_quad and __vector_pair types without MMA support, it would cause ICE when expanding the corresponding assignment. We can't guard these built-in types registering under MMA support as Peter pointed out in that PR, because the registering is global, it doesn't work for target pragma/attribute support with MMA enabled. The existing verify_type_context mentioned in [2] can help to make the diagnostics invalid built-in type uses better, but as Richard pointed out in [4], it can't deal with all cases. As the discussions in [1][3], this patch is to check the invalid use of built-in types __vector_quad and __vector_pair in mov pattern of OOmode and XOmode, on the currently being expanded gimple assignment statement. It still puts an assertion in else arm rather than just makes it go through, it's to ensure we can catch any other possible unexpected cases in time if there are. [1] https://gcc.gnu.org/pipermail/gcc/2022-December/240218.html [2] https://gcc.gnu.org/pipermail/gcc/2022-December/240220.html [3] https://gcc.gnu.org/pipermail/gcc/2022-December/240223.html [4] https://gcc.gnu.org/pipermail/gcc-patches/2022-December/608083.html PR target/106736 gcc/ChangeLog: * config/rs6000/mma.md (define_expand movoo): Call function rs6000_opaque_type_invalid_use_p to check and emit error message for the invalid use of opaque type. (define_expand movxo): Likewise. * config/rs6000/rs6000-protos.h (rs6000_opaque_type_invalid_use_p): New function declaration. (currently_expanding_gimple_stmt): New extern declaration. * config/rs6000/rs6000.cc (rs6000_opaque_type_invalid_use_p): New function. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr106736-1.c: New test. * gcc.target/powerpc/pr106736-2.c: Likewise. * gcc.target/powerpc/pr106736-3.c: Likewise. * gcc.target/powerpc/pr106736-4.c: Likewise. * gcc.target/powerpc/pr106736-5.c: Likewise.
Diffstat (limited to 'gcc/config')
-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
3 files changed, 48 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"