If we put the SAVE_EXPR for a VLA size inside the MINUS_EXPR rather than
outside, it will work better with constant folding.

The equivalent change was made in the C front-end in 2004, in commit
r0-64535-g8b0b9aefd29dfe6398857bcf5628662e2f0e21f6

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog
2020-05-11  Jason Merrill  <ja...@redhat.com>

        * decl.c (compute_array_index_type_loc): Stabilize before building
        the MINUS_EXPR.
---
 gcc/cp/decl.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index adf94658420..dea1ba07c0e 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10449,6 +10449,15 @@ compute_array_index_type_loc (location_t name_loc, 
tree name, tree size,
     itype = build_min (MINUS_EXPR, sizetype, size, integer_one_node);
   else
     {
+      if (!TREE_CONSTANT (size))
+       {
+         /* A variable sized array.  Arrange for the SAVE_EXPR on the inside
+            of the MINUS_EXPR, which allows the -1 to get folded with the +1
+            that happens when building TYPE_SIZE.  */
+         size = variable_size (size);
+         stabilize_vla_size (size);
+       }
+
       /* Compute the index of the largest element in the array.  It is
         one less than the number of elements in the array.  We save
         and restore PROCESSING_TEMPLATE_DECL so that computations in
@@ -10466,11 +10475,6 @@ compute_array_index_type_loc (location_t name_loc, 
tree name, tree size,
 
       if (!TREE_CONSTANT (itype))
        {
-         /* A variable sized array.  */
-         itype = variable_size (itype);
-
-         stabilize_vla_size (itype);
-
          if (sanitize_flags_p (SANITIZE_VLA)
              && current_function_decl != NULL_TREE)
            {

base-commit: 2b2d298ff845ab7a07ffbd51da79473736da3324
-- 
2.18.1

Reply via email to