https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123392

            Bug ID: 123392
           Summary: [15/16 regression] SVE C++ overload initialization ICE
                    with debug symbols since
                    g:17b520a10cdaabbcbaeaf30fc5228986b368ce0c
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Keywords: aarch64-sve, ice-on-valid-code
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tnfchris at gcc dot gnu.org
                CC: belagod at gcc dot gnu.org
  Target Milestone: ---
            Target: aarch64*

The following example:

#include <arm_sve.h>

svint32_t res (int32_t *a)
{
  svint32_t s = { a[0], a[1], a[2], a[3] };
  return s;
}

compiled with -O3 -march=armv9-a -g

ICEs with

 <constructor 0xffff9df69228
    type <vector_type 0xffff9ede8e70 svint32_t
        type <integer_type 0xffff9ee565e8 int public SI
            size <integer_cst 0xffff9ee58180 constant 32>
            unit-size <integer_cst 0xffff9ee58198 constant 4>
            align:32 warn_if_not_align:0 symtab:-1629855424 alias-set 1
canonical-type 0xffff9ee565e8 precision:32 min <integer_cst 0xffff9ee58138
-2147483648> max <integer_cst 0xffff9ee58150 2147483647>
            pointer_to_this <pointer_type 0xffff9ee5eb28>>
        sizes-gimplified VNx4SI
        size <poly_int_cst 0xffff9ed21f00 type <integer_type 0xffff9ee560a8
bitsizetype>
            constant
            elt0: <integer_cst 0xffff9ee3cf78 constant 128> elt1: <integer_cst
0xffff9ee3cf78 128>>
        unit-size <poly_int_cst 0xffff9ed21ee0 type <integer_type
0xffff9ee56000 sizetype>
            constant
            elt0: <integer_cst 0xffff9ee3cf90 constant 16> elt1: <integer_cst
0xffff9ee3cf90 16>>
        align:128 warn_if_not_align:0 symtab:-1644748480 alias-set -1
structural-equality
        attributes <tree_list 0xffff9ed49050
            purpose <identifier_node 0xffff9ed40960 SVE type>
            value <tree_list 0xffff9ed49028
                value <integer_cst 0xffff9ee58048 constant 1>
                chain <tree_list 0xffff9ed49000
                    value <integer_cst 0xffff9ee3cf60 constant 0>
                    chain <tree_list 0xffff9ed41fc8
                        value <identifier_node 0xffff9ed471e0 u11__SVInt32_t>
                        chain <tree_list 0xffff9ed41fa0 value <identifier_node
0xffff9ed47230 svint32_t>>>>>
            chain <tree_list 0xffff9ed41f78
                purpose <identifier_node 0xffff9ed40870 SVE sizeless type>>>
nunits:[4,4]>
    length:4
    idx <integer_cst 0xffff9ee3cfa8 type <integer_type 0xffff9ee560a8
bitsizetype> constant 0>
    val <ssa_name 0xffff9ee47c60 type <integer_type 0xffff9ee565e8 int>
        visited
        def_stmt _1 = *a_6(D);
        version:1>
    idx <integer_cst 0xffff9ee58318 type <integer_type 0xffff9ee560a8
bitsizetype> constant 1>
    val <ssa_name 0xffff9ee47cf0 type <integer_type 0xffff9ee565e8 int>
        visited
        def_stmt _2 = MEM[(int32_t *)a_6(D) + 4B];
        version:2>
    idx <integer_cst 0xffff9efaeaf8 type <integer_type 0xffff9ee560a8
bitsizetype> constant 2>
    val <ssa_name 0xffff9ee47d80 type <integer_type 0xffff9ee565e8 int>
        visited
        def_stmt _3 = MEM[(int32_t *)a_6(D) + 8B];
        version:3>
    idx <integer_cst 0xffff9eddcb58 type <integer_type 0xffff9ee560a8
bitsizetype> constant 3>
    val <ssa_name 0xffff9ee47e10 type <integer_type 0xffff9ee565e8 int>
        visited
        def_stmt _4 = MEM[(int32_t *)a_6(D) + 12B];
        version:4>>
during RTL pass: expand
insrc.c: In function 'res':
insrc.c:3:11: internal compiler error: in expand_debug_expr, at
cfgexpand.cc:5780
    3 | svint32_t res (int32_t *a)
      |           ^~~

and started with

commit 17b520a10cdaabbcbaeaf30fc5228986b368ce0c
Author: Tejas Belagod <[email protected]>
Date:   Thu Sep 5 14:48:18 2024 +0530

    c: Fix constructor bounds checking for VLA and construct VLA vector
constants

    This patch adds support for checking bounds of SVE ACLE vector
initialization
    constructors.  It also adds support to construct vector constant from init
    constructors.

    gcc/c/ChangeLog:

            * c-typeck.cc (process_init_element): Add check to restrict
            constructor length to the minimum vector length allowed.

    gcc/ChangeLog:

            * tree.cc (build_vector_from_ctor): Add support to construct VLA
vector
            constants from init constructors.

    gcc/testsuite/ChangeLog:

            * gcc.target/aarch64/sve/acle/general-c/sizeless-1.c: Update test
to
            test initialize error.
            * gcc.target/aarch64/sve/acle/general-c/sizeless-2.c: Likewise.

 gcc/c/c-typeck.cc                                        | 16 +++++++++++-----
 .../gcc.target/aarch64/sve/acle/general-c/sizeless-1.c   | 13 +++++++++++++
 .../gcc.target/aarch64/sve/acle/general-c/sizeless-2.c   | 12 ++++++++++++
 gcc/tree.cc                                              | 16 +++++++++++-----
 4 files changed, 47 insertions(+), 10 deletions(-)

Reply via email to