public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] add g_nonstandard_bool attribute for GIMPLE FE use
@ 2020-12-11  9:02 Richard Biener
  2020-12-13 17:35 ` Jeff Law
  2020-12-13 23:59 ` Martin Sebor
  0 siblings, 2 replies; 7+ messages in thread
From: Richard Biener @ 2020-12-11  9:02 UTC (permalink / raw)
  To: gcc-patches; +Cc: joseph

This adds __attribute__((g_nonstandard_bool(precision))) to be able
to construct nonstandard boolean types which for the included testcase
is needed to simulate Ada and LTO interaction (Ada uses a 8 bit
precision boolean_type_node).  This will also be useful for vector
unit testcases where we need to produce vector types with
non-standard boolean type components.

--

Joseph, is using attributes a good enough way to extend the set of C
types for use of the GIMPLE FE?  I chose to add a g_ prefix to
note use by the GIMPLE FE but since we can mix C and GIMPLE FE
functions in one TU those of course can leak into C functions
(and eventually lead to ICEs/issues there) - but the attribute is
simply ignored when not compiling with -fgimple.

I figured there's no documentation about GIMPLE FE "extensions",
I'll see to write something as followup (there's a small section
in sourcebuild.texi and the -fgimple docs itself).  I chose to
not document this attribute in the place we document attributes
supposed to be used in production.

OK for trunk?

I'll push the actual vectorizer fix for PR95582 separately, this
patch is only "needed" to add a testcase for the PR.

Thanks,
Richard.

2020-12-11  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/95582
gcc/c-family/
	* c-attribs.c (c_common_attribute_table): Add entry for
	g_nonstandard_bool.
	(handle_g_nonstandard_bool_attribute): New.

gcc/testsuite/
	* gcc.dg/pr95582.c: New testcase.
---
 gcc/c-family/c-attribs.c       | 41 ++++++++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/pr95582.c | 19 ++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr95582.c

diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index f7dad7a91d7..be3009865b1 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -161,6 +161,8 @@ static tree handle_copy_attribute (tree *, tree, tree, int, bool *);
 static tree handle_nsobject_attribute (tree *, tree, tree, int, bool *);
 static tree handle_objc_root_class_attribute (tree *, tree, tree, int, bool *);
 static tree handle_objc_nullability_attribute (tree *, tree, tree, int, bool *);
+static tree handle_g_nonstandard_bool_attribute (tree *, tree, tree, int,
+						 bool *);
 
 /* Helper to define attribute exclusions.  */
 #define ATTR_EXCL(name, function, type, variable)	\
@@ -274,6 +276,8 @@ const struct attribute_spec c_common_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
        affects_type_identity, handler, exclude } */
+  { "g_nonstandard_bool",     1, 1, false, true, false, true,
+			      handle_g_nonstandard_bool_attribute, NULL },
   { "packed",                 0, 0, false, false, false, false,
 			      handle_packed_attribute,
 	                      attr_aligned_exclusions },
@@ -894,6 +898,43 @@ validate_attr_arg (tree node[2], tree name, tree newarg)
 
 /* Attribute handlers common to C front ends.  */
 
+/* Handle a "g_nonstandard_bool" attribute; arguments as in
+   struct attribute_spec.handler.  */
+
+static tree
+handle_g_nonstandard_bool_attribute (tree *node, tree name, tree args,
+				     int ARG_UNUSED (flags), bool *no_add_attrs)
+{
+  *no_add_attrs = true;
+  if (!flag_gimple)
+    {
+      warning (OPT_Wattributes, "%qE attribute ignored", name);
+      return NULL_TREE;
+    }
+
+  if (!TYPE_P (*node) || TREE_CODE (*node) != BOOLEAN_TYPE)
+    {
+      warning (OPT_Wattributes, "%qE attribute only supported on "
+	       "boolean types", name);
+      return NULL_TREE;
+    }
+
+  unsigned HOST_WIDE_INT prec = HOST_WIDE_INT_M1U;
+  if (tree_fits_uhwi_p (TREE_VALUE (args)))
+    prec = tree_to_uhwi (TREE_VALUE (args));
+  if (prec > MAX_FIXED_MODE_SIZE)
+    {
+      warning (OPT_Wattributes, "%qE attribute with unsupported boolean "
+	       "precision", name);
+      return NULL_TREE;
+    }
+
+  tree new_type = build_nonstandard_boolean_type (prec);
+  *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
+
+  return NULL_TREE;
+}
+
 /* Handle a "packed" attribute; arguments as in
    struct attribute_spec.handler.  */
 
diff --git a/gcc/testsuite/gcc.dg/pr95582.c b/gcc/testsuite/gcc.dg/pr95582.c
new file mode 100644
index 00000000000..cba3354557b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr95582.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple -O3" } */
+
+typedef _Bool bool8 __attribute__((g_nonstandard_bool(8)));
+
+bool8 data[16];
+
+void __GIMPLE(ssa) foo(int f)
+{
+  _Bool t;
+  bool8 tp;
+
+__BB(2):
+   t_2 = f_1(D) != 0;
+   tp_3 = (bool8) t_2;
+   data[0] = tp_3;
+   data[1] = tp_3;
+   return;
+}
-- 
2.26.2

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-01-06  9:21 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-11  9:02 [PATCH] add g_nonstandard_bool attribute for GIMPLE FE use Richard Biener
2020-12-13 17:35 ` Jeff Law
2020-12-13 23:59 ` Martin Sebor
2020-12-16 22:04   ` Joseph Myers
2021-01-05 12:52     ` Richard Biener
2021-01-05 18:54       ` Joseph Myers
2021-01-06  9:21         ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).