libgccjit: Allow comparing aligned int types

Message ID 9e79a3d614b1db87c564b0e50f7091c2c203d246.camel@zoho.com
State Accepted
Headers
Series libgccjit: Allow comparing aligned int types |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Antoni Boucher Dec. 21, 2023, 1:33 p.m. UTC
  Hi.
This patch allows comparing aligned integer types as equal.
There's a TODO in the code about whether we should check that the
alignment is equal.
What are your thoughts on this?

Thanks for the review.
  

Comments

Antoni Boucher Jan. 19, 2024, 8:59 p.m. UTC | #1
David: Ping.

On Thu, 2023-12-21 at 08:33 -0500, Antoni Boucher wrote:
> Hi.
> This patch allows comparing aligned integer types as equal.
> There's a TODO in the code about whether we should check that the
> alignment is equal.
> What are your thoughts on this?
> 
> Thanks for the review.
  
David Malcolm Jan. 24, 2024, 5:18 p.m. UTC | #2
On Thu, 2023-12-21 at 08:33 -0500, Antoni Boucher wrote:
> Hi.
> This patch allows comparing aligned integer types as equal.
> There's a TODO in the code about whether we should check that the
> alignment is equal.
> What are your thoughts on this?

I think we should check for equal alignment.

[...snip...]

> diff --git a/gcc/testsuite/jit.dg/test-types.c b/gcc/testsuite/jit.dg/test-types.c
> index a01944e35fa..c2f4d2bcb3d 100644
> --- a/gcc/testsuite/jit.dg/test-types.c
> +++ b/gcc/testsuite/jit.dg/test-types.c
> @@ -485,11 +485,15 @@ verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
>  
>    CHECK_VALUE (z.m_FILE_ptr, stderr);
>  
> +  gcc_jit_type *long_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG);
> +  gcc_jit_type *int64_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T);
>    if (sizeof(long) == 8)
> -    CHECK (gcc_jit_compatible_types (
> -      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG),
> -      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T)));
> +    CHECK (gcc_jit_compatible_types (long_type, int64_type));
>  
>    CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT)), sizeof (float));
>    CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE)), sizeof (double));
> +
> +  gcc_jit_type *aligned_long = gcc_jit_type_get_aligned (long_type, 4);
> +  gcc_jit_type *aligned_int64 = gcc_jit_type_get_aligned (int64_type, 4);
> +  CHECK (gcc_jit_compatible_types (aligned_long, aligned_int64));

This CHECK should be guarded on sizeof(long) == 8 like the check above.


Dave
  
Antoni Boucher Feb. 22, 2024, 5:40 p.m. UTC | #3
Thanks for the review.
Here's the updated patch.

On Wed, 2024-01-24 at 12:18 -0500, David Malcolm wrote:
> On Thu, 2023-12-21 at 08:33 -0500, Antoni Boucher wrote:
> > Hi.
> > This patch allows comparing aligned integer types as equal.
> > There's a TODO in the code about whether we should check that the
> > alignment is equal.
> > What are your thoughts on this?
> 
> I think we should check for equal alignment.
> 
> [...snip...]
> 
> > diff --git a/gcc/testsuite/jit.dg/test-types.c
> > b/gcc/testsuite/jit.dg/test-types.c
> > index a01944e35fa..c2f4d2bcb3d 100644
> > --- a/gcc/testsuite/jit.dg/test-types.c
> > +++ b/gcc/testsuite/jit.dg/test-types.c
> > @@ -485,11 +485,15 @@ verify_code (gcc_jit_context *ctxt,
> > gcc_jit_result *result)
> >  
> >    CHECK_VALUE (z.m_FILE_ptr, stderr);
> >  
> > +  gcc_jit_type *long_type = gcc_jit_context_get_type (ctxt,
> > GCC_JIT_TYPE_LONG);
> > +  gcc_jit_type *int64_type = gcc_jit_context_get_type (ctxt,
> > GCC_JIT_TYPE_INT64_T);
> >    if (sizeof(long) == 8)
> > -    CHECK (gcc_jit_compatible_types (
> > -      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG),
> > -      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T)));
> > +    CHECK (gcc_jit_compatible_types (long_type, int64_type));
> >  
> >    CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type
> > (ctxt, GCC_JIT_TYPE_FLOAT)), sizeof (float));
> >    CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type
> > (ctxt, GCC_JIT_TYPE_DOUBLE)), sizeof (double));
> > +
> > +  gcc_jit_type *aligned_long = gcc_jit_type_get_aligned
> > (long_type, 4);
> > +  gcc_jit_type *aligned_int64 = gcc_jit_type_get_aligned
> > (int64_type, 4);
> > +  CHECK (gcc_jit_compatible_types (aligned_long, aligned_int64));
> 
> This CHECK should be guarded on sizeof(long) == 8 like the check
> above.
> 
> 
> Dave
>
  

Patch

From b1db2e31729876d313061a94c13b155bcd552c02 Mon Sep 17 00:00:00 2001
From: Antoni Boucher <bouanto@zoho.com>
Date: Sun, 8 Oct 2023 09:12:12 -0400
Subject: [PATCH] libgccjit: Allow comparing aligned int types

gcc/jit/ChangeLog:

	* jit-recording.h (type::is_same_type_as): Compare integer
	types.
	(type::is_aligned, memento_of_get_aligned::is_same_type_as,
	memento_of_get_aligned::is_aligned): new methods.

gcc/testsuite/ChangeLog:

	* jit.dg/test-types.c: Add checks comparing aligned types.
---
 gcc/jit/jit-recording.h           | 28 +++++++++++++++++++++-------
 gcc/testsuite/jit.dg/test-types.c | 10 +++++++---
 2 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/gcc/jit/jit-recording.h b/gcc/jit/jit-recording.h
index 4a8082991fb..97f39f3fc98 100644
--- a/gcc/jit/jit-recording.h
+++ b/gcc/jit/jit-recording.h
@@ -555,6 +555,14 @@  public:
 
   virtual bool is_same_type_as (type *other)
   {
+    if (is_int ()
+		 && other->is_int ()
+		 && get_size () == other->get_size ()
+		 && is_signed () == other->is_signed ())
+    {
+      /* LHS (this) is an integer of the same size and sign as rtype.  */
+      return true;
+    }
     return this == other;
   }
 
@@ -571,6 +579,7 @@  public:
   virtual type *is_volatile () { return NULL; }
   virtual type *is_restrict () { return NULL; }
   virtual type *is_const () { return NULL; }
+  virtual type *is_aligned () { return NULL; }
   virtual type *is_array () = 0;
   virtual struct_ *is_struct () { return NULL; }
   virtual bool is_union () const { return false; }
@@ -625,13 +634,6 @@  public:
 	       accept it:  */
 	    return true;
 	  }
-      } else if (is_int ()
-		 && rtype->is_int ()
-		 && get_size () == rtype->get_size ()
-		 && is_signed () == rtype->is_signed ())
-      {
-	/* LHS (this) is an integer of the same size and sign as rtype.  */
-	return true;
       }
 
     return type::accepts_writes_from (rtype);
@@ -805,6 +807,18 @@  public:
   : decorated_type (other_type),
     m_alignment_in_bytes (alignment_in_bytes) {}
 
+  bool is_same_type_as (type *other) final override
+  {
+    // TODO: check if outermost alignment is equal?
+    if (!other->is_aligned ())
+    {
+      return m_other_type->is_same_type_as (other);
+    }
+    return m_other_type->is_same_type_as (other->is_aligned ());
+  }
+
+  type *is_aligned () final override { return m_other_type; }
+
   /* Strip off the alignment, giving the underlying type.  */
   type *unqualified () final override { return m_other_type; }
 
diff --git a/gcc/testsuite/jit.dg/test-types.c b/gcc/testsuite/jit.dg/test-types.c
index a01944e35fa..c2f4d2bcb3d 100644
--- a/gcc/testsuite/jit.dg/test-types.c
+++ b/gcc/testsuite/jit.dg/test-types.c
@@ -485,11 +485,15 @@  verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
 
   CHECK_VALUE (z.m_FILE_ptr, stderr);
 
+  gcc_jit_type *long_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG);
+  gcc_jit_type *int64_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T);
   if (sizeof(long) == 8)
-    CHECK (gcc_jit_compatible_types (
-      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG),
-      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT64_T)));
+    CHECK (gcc_jit_compatible_types (long_type, int64_type));
 
   CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT)), sizeof (float));
   CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE)), sizeof (double));
+
+  gcc_jit_type *aligned_long = gcc_jit_type_get_aligned (long_type, 4);
+  gcc_jit_type *aligned_int64 = gcc_jit_type_get_aligned (int64_type, 4);
+  CHECK (gcc_jit_compatible_types (aligned_long, aligned_int64));
 }
-- 
2.43.0