Hi!

As the testcase shows, ARRAY_REF on an array with variable length element
doesn't have INTEGER_CST TYPE_SIZE_UNIT which the code was assuming.
The following patch punts in that case.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-11-05  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/91945
        * builtins.c (compute_objsize): For ARRAY_REF, only multiply off
        by tpsize if it is both non-NULL and INTEGER_CST, otherwise punt.
        Formatting fix.

        * gfortran.dg/pr91945.f90: New test.

--- gcc/builtins.c.jj   2019-10-10 01:33:20.000000000 +0200
+++ gcc/builtins.c      2019-11-04 10:09:21.200301352 +0100
@@ -3626,7 +3626,7 @@ compute_objsize (tree dest, int ostype,
                }
            }
          else if (TREE_CODE (off) == SSA_NAME
-             && INTEGRAL_TYPE_P (TREE_TYPE (off)))
+                  && INTEGRAL_TYPE_P (TREE_TYPE (off)))
            {
              wide_int min, max;
              enum value_range_kind rng = get_range_info (off, &min, &max);
@@ -3680,7 +3680,8 @@ compute_objsize (tree dest, int ostype,
          if (TREE_CODE (dest) == ARRAY_REF)
            {
              tree eltype = TREE_TYPE (dest);
-             if (tree tpsize = TYPE_SIZE_UNIT (eltype))
+             tree tpsize = TYPE_SIZE_UNIT (eltype);
+             if (tpsize && TREE_CODE (tpsize) == INTEGER_CST)
                off = fold_build2 (MULT_EXPR, size_type_node, off, tpsize);
              else
                return NULL_TREE;
--- gcc/testsuite/gfortran.dg/pr91945.f90.jj    2019-11-04 10:13:40.392378534 
+0100
+++ gcc/testsuite/gfortran.dg/pr91945.f90       2019-11-04 10:13:21.272667903 
+0100
@@ -0,0 +1,5 @@
+! PR tree-optimization/91945
+! { dg-do compile }
+! { dg-options "-O3 -fstack-arrays -fno-guess-branch-probability" }
+
+include 'result_in_spec_1.f90'

        Jakub

Reply via email to