public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-2234] d: Fix accesses of immutable arrays using constant index still bounds checked
@ 2023-07-01 23:18 Iain Buclaw
  0 siblings, 0 replies; only message in thread
From: Iain Buclaw @ 2023-07-01 23:18 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:61b1c562f8c703bff045e91257120e42b7fae523

commit r14-2234-g61b1c562f8c703bff045e91257120e42b7fae523
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sat Jul 1 23:32:53 2023 +0200

    d: Fix accesses of immutable arrays using constant index still bounds checked
    
    Starts setting TREE_READONLY against specific kinds of VAR_DECLs, so
    that the middle-end/optimization passes can more aggressively constant
    fold D code that makes use of `immutable' or `const'.
    
            PR d/110514
    
    gcc/d/ChangeLog:
    
            * decl.cc (get_symbol_decl): Set TREE_READONLY on certain kinds of
            const and immutable variables.
            * expr.cc (ExprVisitor::visit (ArrayLiteralExp *)): Set TREE_READONLY
            on immutable dynamic array literals.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr110514a.d: New test.
            * gdc.dg/pr110514b.d: New test.
            * gdc.dg/pr110514c.d: New test.
            * gdc.dg/pr110514d.d: New test.

Diff:
---
 gcc/d/decl.cc                    | 14 ++++++++++++++
 gcc/d/expr.cc                    |  4 ++++
 gcc/testsuite/gdc.dg/pr110514a.d |  9 +++++++++
 gcc/testsuite/gdc.dg/pr110514b.d |  8 ++++++++
 gcc/testsuite/gdc.dg/pr110514c.d |  8 ++++++++
 gcc/testsuite/gdc.dg/pr110514d.d |  8 ++++++++
 6 files changed, 51 insertions(+)

diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index 78c4ab554dc..3f980851259 100644
--- a/gcc/d/decl.cc
+++ b/gcc/d/decl.cc
@@ -1277,6 +1277,20 @@ get_symbol_decl (Declaration *decl)
 		DECL_INITIAL (decl->csym) = build_expr (ie, true);
 	    }
 	}
+
+      /* [type-qualifiers/const-and-immutable]
+
+	 `immutable` applies to data that cannot change. Immutable data values,
+	 once constructed, remain the same for the duration of the program's
+	 execution.  */
+      if (vd->isImmutable () && !vd->setInCtorOnly ())
+	TREE_READONLY (decl->csym) = 1;
+
+      /* `const` applies to data that cannot be changed by the const reference
+	 to that data. It may, however, be changed by another reference to that
+	 same data.  */
+      if (vd->isConst () && !vd->isDataseg ())
+	TREE_READONLY (decl->csym) = 1;
     }
 
   /* Set the declaration mangled identifier if static.  */
diff --git a/gcc/d/expr.cc b/gcc/d/expr.cc
index c6245ff5fc1..aeafe433ca5 100644
--- a/gcc/d/expr.cc
+++ b/gcc/d/expr.cc
@@ -2701,6 +2701,10 @@ public:
 	    if (tb->ty == TY::Tarray)
 	      ctor = d_array_value (type, size_int (e->elements->length), ctor);
 
+	    /* Immutable literals can be placed in rodata.  */
+	    if (tb->isImmutable ())
+	      TREE_READONLY (decl) = 1;
+
 	    d_pushdecl (decl);
 	    rest_of_decl_compilation (decl, 1, 0);
 	  }
diff --git a/gcc/testsuite/gdc.dg/pr110514a.d b/gcc/testsuite/gdc.dg/pr110514a.d
new file mode 100644
index 00000000000..46e370527d3
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110514a.d
@@ -0,0 +1,9 @@
+// { dg-do "compile" }
+// { dg-options "-O -fdump-tree-optimized" }
+immutable uint[] imm_arr = [1,2,3];
+int test_imm(immutable uint[] ptr)
+{
+    return imm_arr[2] == 3 ? 123 : 456;
+}
+// { dg-final { scan-assembler-not "_d_arraybounds_indexp" } }
+// { dg-final { scan-tree-dump "return 123;" optimized } }
diff --git a/gcc/testsuite/gdc.dg/pr110514b.d b/gcc/testsuite/gdc.dg/pr110514b.d
new file mode 100644
index 00000000000..86aeb485c34
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110514b.d
@@ -0,0 +1,8 @@
+// { dg-do "compile" }
+// { dg-options "-O" }
+immutable uint[] imm_ctor_arr;
+int test_imm_ctor(immutable uint[] ptr)
+{
+    return imm_ctor_arr[2] == 3;
+}
+// { dg-final { scan-assembler "_d_arraybounds_indexp" } }
diff --git a/gcc/testsuite/gdc.dg/pr110514c.d b/gcc/testsuite/gdc.dg/pr110514c.d
new file mode 100644
index 00000000000..94779e123a4
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110514c.d
@@ -0,0 +1,8 @@
+// { dg-do "compile" }
+// { dg-options "-O" }
+const uint[] cst_arr = [1,2,3];
+int test_cst(const uint[] ptr)
+{
+    return cst_arr[2] == 3;
+}
+// { dg-final { scan-assembler "_d_arraybounds_indexp" } }
diff --git a/gcc/testsuite/gdc.dg/pr110514d.d b/gcc/testsuite/gdc.dg/pr110514d.d
new file mode 100644
index 00000000000..56e9a3139ea
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110514d.d
@@ -0,0 +1,8 @@
+// { dg-do "compile" }
+// { dg-options "-O" }
+const uint[] cst_ctor_arr;
+int test_cst_ctor(const uint[] ptr)
+{
+    return cst_ctor_arr[2] == 3;
+}
+// { dg-final { scan-assembler "_d_arraybounds_indexp" } }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-07-01 23:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-01 23:18 [gcc r14-2234] d: Fix accesses of immutable arrays using constant index still bounds checked Iain Buclaw

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).