aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2023-07-01 23:32:53 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2023-07-02 01:10:31 +0200
commit61b1c562f8c703bff045e91257120e42b7fae523 (patch)
tree9262cb6550adba86a8ec45f4408a042b4776809c /gcc
parentfca6d9c12f5bf06469cf9f7db8c42f66ef792fd2 (diff)
downloadgcc-61b1c562f8c703bff045e91257120e42b7fae523.zip
gcc-61b1c562f8c703bff045e91257120e42b7fae523.tar.gz
gcc-61b1c562f8c703bff045e91257120e42b7fae523.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/d/decl.cc14
-rw-r--r--gcc/d/expr.cc4
-rw-r--r--gcc/testsuite/gdc.dg/pr110514a.d9
-rw-r--r--gcc/testsuite/gdc.dg/pr110514b.d8
-rw-r--r--gcc/testsuite/gdc.dg/pr110514c.d8
-rw-r--r--gcc/testsuite/gdc.dg/pr110514d.d8
6 files changed, 51 insertions, 0 deletions
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index 78c4ab5..3f98085 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 c6245ff..aeafe43 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 0000000..46e3705
--- /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 0000000..86aeb48
--- /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 0000000..94779e1
--- /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 0000000..56e9a31
--- /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" } }