From patchwork Tue Sep 1 22:22:41 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerry DeLisle X-Patchwork-Id: 2296274 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=NG8x+erQ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org; envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZL3T3Chwz1xvf for ; Wed, 02 Sep 2026 08:23:16 +1000 (AEST) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F3E3A4BA23C1 for ; Tue, 1 Sep 2026 22:23:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F3E3A4BA23C1 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=NG8x+erQ X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pf1-x42c.google.com (mail-pf1-x42c.google.com [IPv6:2607:f8b0:4864:20::42c]) by sourceware.org (Postfix) with ESMTPS id 5A6BC4BA2E17 for ; Tue, 1 Sep 2026 22:22:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5A6BC4BA2E17 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5A6BC4BA2E17 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::42c ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788301364; cv=none; b=cqdbinvrX+2+srazgWI940fomQw+9iNuMrja9mOpHcEU+mGwOjLNE3/30ztf6cAZKhcIqTOa7Cq7arrDoci5dRmoD6Zmh6Zuyl/6tey1y7S/arp1WXRgjXdx5g9zOubsIFbGgDZR4aIIaTlaf0R7GAmyRh6TV7i9EQMJBax1qqM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788301364; c=relaxed/simple; bh=ZF/GpcUpt/CPwI8ZvE+zZvQRdQfHMtfNjhKhABeOlJU=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=JH/SPPjT9XGA7rLu3LoLFn7TTpelR7Bie/QAidOImaoJ5MqidBhFgOCs5CTGdQlNhuatSwF7wBcmjyqFe5kuOdqC6s6+YGWk6mTiUgHa3XCJS/3p6pUmzYCX6VNXMlnM56qdx9QpzzBkrl4ECsfQL7sqMAkjdy3pvCStiWsDv7I= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=NG8x+erQ DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5A6BC4BA2E17 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-853f8c34ba4so598310b3a.0 for ; Tue, 01 Sep 2026 15:22:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788301363; x=1788906163; darn=gcc.gnu.org; h=autocrypt:subject:from:to:content-language:user-agent:mime-version :date:message-id:content-type:from:to:cc:subject:date:message-id :reply-to:content-type; bh=4MM2dC+g2GmNa1qfzQfzqthdXSteNOUn9OQ2dtJ1sMM=; b=NG8x+erQgZby2H9vP2Gec2qM2XxLm+4cI7mN2gdV7s/Bi+pWQ4OsHWNNIrMW0qMJZ3 ybie4wv35ym1Mml3MuvDVR5XKsxt9OEXiCTQQheIfXqG+8mokLQfky1b1D10G0Ml2vpq VQ2jXWGcyMfkcxz6KlC8pSB2qHmsVagw26/sRaIqi6wv9QM303zzvc0SsUm4zvh1qQXZ lO8ysboYyceWE5EJXRdDYcDNG4J9yJvwFCB+CPBwP+YfBzvcm38pg2ZdgfcYY78Oc7AI xdRbKY5OAZmn66kAIXnz4U15KOGYdUdkFipaf+iCzXcmgKXpQMdlRR0kQ4oGYtupbJLV aIQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788301363; x=1788906163; h=autocrypt:subject:from:to:content-language:user-agent:mime-version :date:message-id:content-type:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=4MM2dC+g2GmNa1qfzQfzqthdXSteNOUn9OQ2dtJ1sMM=; b=BiBaNG6gdKITxJw/0ZNtfRSE3+8z35i76I59HH4YN/QjCIE6Gx/t10tptQEHdABUDF zhlZHrbBOx/LrpCT2I55DvU3c6RFpE99mwqJd1mef+QesL+wOcATeveJWXQ0fZEV8kbe T/AxshkqSzqINPaKXfg4BiOxuRRlr/Rn9juFjHX1if2Bo8qw9VVi9Y5Q1Bn1gIGdxlBL BW9u1KafTUJ29LOhYRYSFkWH9le+v9aMjPZ7exdT/jJ8VYc9u3ti5ICsmBrCe9ya4apI 1OOEKvX53xC3XKSDF6KYgCmQFZooqKtRp/GFFbjb/oATJPtnQeTSBGHuGPilBgW3u+pc CXFQ== X-Forwarded-Encrypted: i=1; AKwUvBxfe/jMXPzMm2kG+Y9VwBVtvNC+kfJvcfn/FQj/1QApBQcllI+6u54fADWyMsKkgU+mUP9QDHcsni3JbA==@gcc.gnu.org X-Gm-Message-State: AFuF++lcOC4SQ1KbeclYZ1A5UtC/HMTj0ALz+M5N2vTaSq0pOIBe9LI9 wKAzqw2WZrsePBZquMIJEVJJteuKVopCIbcg6pQDVkbkdt1lM6FTyFXU X-Gm-Gg: AYBFou3DMh3r8a2Waq7DY2jGsyhCe2cuAVev4w+Q9luO/w72lxUNQsTv/Tl27YEbR+t xAgZHdLwdI3vzR4qsPegS8jgQTaYuf0bqKLc4IEgK3TKoSIJWwmYiQf+hEtIxcSRfLwxjgJIqoI qGLeU6yfI23+zM90tB76C8cebgQDOWTMb/yDPViDzboWvi2mtOJx6zaTvVR9TLkrt5bofIDC0Fq /exoX8TIufnEDH6bjdmpGwkZWT50MntCV/58tF09nHGEpVOs9eldGdMSyA6Xwcxby15C2EqH9y4 YopAfHDO45+i4+K6sPz5nEzvNOkCjHgYz2HfS8OCm7sTfZlRaLKdkSMKu9Nlk631gCBj6+e8HZb aRBO4dCf0MhqMhoUUWv9OpzyDhZSu5ZxUKjIy0gXSmm/Bl2eWPVa9nLRCM3ASllfn/Ag+sL9odk VQCG6qghpIIBIccmWoQEiEfsBtY3e2iUfkBEgWNPq9sG8mVgoVkxZUmVhx2DqzNkA= X-Received: by 2002:a05:6a00:148e:b0:847:893f:2d0c with SMTP id d2e1a72fcca58-85ed1d0414dmr1557414b3a.5.1788301363128; Tue, 01 Sep 2026 15:22:43 -0700 (PDT) Received: from [10.168.168.23] ([50.54.170.7]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-85db24f33a0sm449863b3a.9.2026.09.01.15.22.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 01 Sep 2026 15:22:42 -0700 (PDT) Message-ID: <1e10378b-2590-43b8-b6c3-6462fc9f7113@gmail.com> Date: Tue, 1 Sep 2026 15:22:41 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gfortran , gcc-patches From: Jerry D Subject: [PATCH][17 Regression] Fix PR126950 Wrong code issues with libgomp.fortran/use_device_addr-1.f90 Autocrypt: addr=jvdelisle2@gmail.com; keydata= xjMEY5TlkxYJKwYBBAHaRw8BAQdAyrkRDhmJhSTTlV/50gJLlvliU6/Lm5C9ViKV8T9y1GnN HkplcnJ5IEQgPGp2ZGVsaXNsZTJAZ21haWwuY29tPsKJBBMWCAAxFiEEOFR0TS0390uh8dRV uWXAJaWpwWoFAmOU5ZMCGwMECwkIBwUVCAkKCwUWAgMBAAAKCRC5ZcAlpanBalsJAP4wdCiH 2Of9oZv1QWgZ/AVdbWFM3Fv47/WZQHOXfoZ9HgD6AkXrKeJ+6usST7PEaDJjptaViT1fLiYY V/6XaOKSsgLOOARjlOWTEgorBgEEAZdVAQUBAQdAdA7PczYnl07vnOT9oP/wvvMDd4HP09Zl g3LzwXQJWT8DAQgHwngEGBYIACAWIQQ4VHRNLTf3S6Hx1FW5ZcAlpanBagUCY5TlkwIbDAAK CRC5ZcAlpanBasF/AQCa5WjlsVpLsEiggZyT18MOJNAdeRd7wkGDUrwedHrvawD/cE1H+/Ms L1ZwvQiLfGdx8crigQqWTQyos4kH8Wx82wc= X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org See attached patch. Tobias confirmed the problem he reported in the PR is fixed by this. Regression tested on x86_64. The changelog summarizes quite well. As noted in my email about 126964, this patch is needed to avoid the runtime checking in my patch previously submitted for it. I had this sitting in my worktree and got sidetracked chasing 126964. OK for mainline? Best regards, Jerry --- [PATCH] fortran: [PR126950] Load the span of a span addressed dummy on entry A TARGET assumed-shape dummy is addressed through the span of its descriptor since r17-3342. Its bounds and data pointer are loaded into local variables on entry, but the span was reloaded from the descriptor at each element reference. Inside an outlined region, such as an OpenMP target region, only those local variables are available; the descriptor is not mapped to the device, so the reload dereferenced a host pointer there and the region used a garbage span. Load the span on entry as well, alongside the bounds, and use that variable for element addressing. The variable is created with the dummy's declaration because the procedure body is translated before gfc_trans_dummy_array_bias emits the load. The load is placed in the init block, which is already guarded by the argument being present, so an absent optional dummy is not dereferenced. Assisted-by: Claude Opus 5 PR fortran/126950 gcc/fortran/ChangeLog: * trans.h (struct lang_decl): Add span. (GFC_DECL_SPAN, GFC_DECL_GET_SPAN): New macros. * trans-decl.cc (gfc_build_dummy_array_decl): Create the variable holding the span of a span addressed dummy. * trans-array.cc (gfc_trans_dummy_array_bias): Load it from the descriptor on entry. (gfc_get_array_span): Use it. * trans.cc (get_array_span): Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/c_loc_test_22.f90: Update dump patterns for the span being loaded on entry. * gfortran.dg/gomp/target-span-1.f90: New test. --- From a80cd262ae4c93c278501dd63588300581cbe356 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Wed, 19 Aug 2026 10:33:56 -0700 Subject: [PATCH] fortran: [PR126950] Load the span of a span addressed dummy on entry A TARGET assumed-shape dummy is addressed through the span of its descriptor since r17-3342. Its bounds and data pointer are loaded into local variables on entry, but the span was reloaded from the descriptor at each element reference. Inside an outlined region, such as an OpenMP target region, only those local variables are available; the descriptor is not mapped to the device, so the reload dereferenced a host pointer there and the region used a garbage span. Load the span on entry as well, alongside the bounds, and use that variable for element addressing. The variable is created with the dummy's declaration because the procedure body is translated before gfc_trans_dummy_array_bias emits the load. The load is placed in the init block, which is already guarded by the argument being present, so an absent optional dummy is not dereferenced. Assisted-by: Claude Opus 5 PR fortran/126950 gcc/fortran/ChangeLog: * trans.h (struct lang_decl): Add span. (GFC_DECL_SPAN, GFC_DECL_GET_SPAN): New macros. * trans-decl.cc (gfc_build_dummy_array_decl): Create the variable holding the span of a span addressed dummy. * trans-array.cc (gfc_trans_dummy_array_bias): Load it from the descriptor on entry. (gfc_get_array_span): Use it. * trans.cc (get_array_span): Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/c_loc_test_22.f90: Update dump patterns for the span being loaded on entry. * gfortran.dg/gomp/target-span-1.f90: New test. --- gcc/fortran/trans-array.cc | 20 +++++++++---- gcc/fortran/trans-decl.cc | 9 ++++-- gcc/fortran/trans.cc | 3 ++ gcc/fortran/trans.h | 7 +++++ gcc/testsuite/gfortran.dg/c_loc_test_22.f90 | 8 +++-- .../gfortran.dg/gomp/target-span-1.f90 | 30 +++++++++++++++++++ 6 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/gomp/target-span-1.f90 diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 4c9f0212101..7ac63ce6258 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -578,11 +578,14 @@ gfc_get_array_span (tree desc, gfc_expr *expr) gfc_symbol *sym = (expr && expr->expr_type == EXPR_VARIABLE) ? expr->symtree->n.sym : NULL; - if (span_addressed_array (desc) - || (get_CFI_desc (NULL, expr, &desc, NULL) - && (POINTER_TYPE_P (TREE_TYPE (desc)) - ? GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (desc))) - : GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc))))) + if (tree span = GFC_DECL_GET_SPAN (desc)) + /* A span addressed dummy loaded its span on entry. */ + tmp = span; + else if (span_addressed_array (desc) + || (get_CFI_desc (NULL, expr, &desc, NULL) + && (POINTER_TYPE_P (TREE_TYPE (desc)) + ? GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (desc))) + : GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc))))) /* This will have the span field set. */ tmp = gfc_conv_descriptor_span_get (gfc_get_span_descriptor (desc)); else if (expr->ts.type == BT_ASSUMED) @@ -7520,6 +7523,13 @@ gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc, if (VAR_P (GFC_TYPE_ARRAY_OFFSET (type))) gfc_add_modify (&init, GFC_TYPE_ARRAY_OFFSET (type), offset); + /* Load the span once here, like the bounds above, so that element + addressing does not reload it from the descriptor. The descriptor + itself is not available in an outlined region, such as an OpenMP + target region, whereas this local variable is. */ + if (tree span = GFC_DECL_GET_SPAN (tmpdesc)) + gfc_add_modify (&init, span, gfc_conv_descriptor_span_get (dumdesc)); + gfc_trans_vla_type_sizes (sym, &init); stmtInit = gfc_finish_block (&init); diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index dae1edda7d6..feddb1da854 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -1407,9 +1407,14 @@ gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy) GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy; /* The elements of the actual argument can be spaced by more than the - element size, so the span of the descriptor is used to address them. */ + element size, so the span of the descriptor is used to address them. + Create the variable that holds it here, since the body is translated + before gfc_trans_dummy_array_bias loads it from the descriptor. */ if (gfc_is_span_addressed_dummy (sym) && packed == PACKED_NO) - GFC_DECL_PTR_ARRAY_P (decl) = 1; + { + GFC_DECL_PTR_ARRAY_P (decl) = 1; + GFC_DECL_SPAN (decl) = gfc_create_var (gfc_array_index_type, "span"); + } if (sym->ns->proc_name->backend_decl == current_function_decl || sym->attr.contained) diff --git a/gcc/fortran/trans.cc b/gcc/fortran/trans.cc index c2ad65c9a74..b98fe0c680f 100644 --- a/gcc/fortran/trans.cc +++ b/gcc/fortran/trans.cc @@ -471,6 +471,9 @@ get_array_span (tree type, tree decl) to be multiplied with the size. */ span = gfc_resize_class_size_with_len (NULL, decl, span); } + else if (tree cached = GFC_DECL_GET_SPAN (decl)) + /* A span addressed dummy loaded its span on entry. */ + span = cached; else if (GFC_DECL_PTR_ARRAY_P (decl)) span = gfc_conv_descriptor_span_get (gfc_get_span_descriptor (decl)); else diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index e9e310974ee..e5162d5515c 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -1055,6 +1055,8 @@ struct GTY(()) lang_type { struct GTY(()) lang_decl { /* Dummy variables. */ tree saved_descriptor; + /* Element spacing of a span addressed dummy, loaded once on entry. */ + tree span; /* Assigned integer nodes. Stringlength is the IO format string's length. Addr is the address of the string or the target label. Stringlength is initialized to -2 and assigned to -1 when addr is assigned to the @@ -1076,6 +1078,11 @@ struct GTY(()) lang_decl { #define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset #define GFC_DECL_SAVED_DESCRIPTOR(node) \ (DECL_LANG_SPECIFIC(node)->saved_descriptor) +#define GFC_DECL_SPAN(node) (DECL_LANG_SPECIFIC(node)->span) +/* Return the cached span of a span addressed dummy, or NULL_TREE. */ +#define GFC_DECL_GET_SPAN(node) \ + (DECL_P (node) && DECL_LANG_SPECIFIC (node) \ + ? GFC_DECL_SPAN (node) : NULL_TREE) #define GFC_DECL_SCALAR_ALLOCATABLE(node) \ (DECL_LANG_SPECIFIC (node)->scalar_allocatable) #define GFC_DECL_SCALAR_POINTER(node) \ diff --git a/gcc/testsuite/gfortran.dg/c_loc_test_22.f90 b/gcc/testsuite/gfortran.dg/c_loc_test_22.f90 index 91547e8e337..2360c33913b 100644 --- a/gcc/testsuite/gfortran.dg/c_loc_test_22.f90 +++ b/gcc/testsuite/gfortran.dg/c_loc_test_22.f90 @@ -17,9 +17,11 @@ end ! { dg-final { scan-tree-dump-not " _gfortran_internal_pack" "original" } } ! { dg-final { scan-tree-dump-times "parm.\[0-9\]+.data = \\(void .\\) &\\(.xxx.\[0-9\]+\\)\\\[0\\\];" 1 "original" } } ! { dg-final { scan-tree-dump-times "parm.\[0-9\]+.data = \\(void .\\) &\\(.xxx.\[0-9\]+\\)\\\[D.\[0-9\]+ \\* 4\\\];" 1 "original" } } -! A TARGET assumed-shape dummy is addressed with the descriptor's runtime -! span, so the element offset is span-scaled instead of a constant 16. +! A TARGET assumed-shape dummy is addressed with the runtime span that is +! loaded from the descriptor on entry, so the element offset is span-scaled +! instead of a constant 16. ! { dg-final { scan-tree-dump-times "parm.\[0-9\]+.data = \\(void .\\) &\\(.yyy.\[0-9\]+\\)\\\[0\\\];" 1 "original" } } -! { dg-final { scan-tree-dump-times "parm.\[0-9\]+.data = \\(void .\\) yyy.\[0-9\]+ \\+ \\(sizetype\\) \\(\\(yyy->span \\* D.\[0-9\]+\\) \\* 4\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "span.\[0-9\]+ = yyy->span;" 1 "original" } } +! { dg-final { scan-tree-dump-times "parm.\[0-9\]+.data = \\(void .\\) yyy.\[0-9\]+ \\+ \\(sizetype\\) \\(\\(D.\[0-9\]+ \\* span.\[0-9\]+\\) \\* 4\\);" 1 "original" } } ! { dg-final { scan-tree-dump-times "D.\[0-9\]+ = parm.\[0-9\]+.data;\[^;]+ptr\[1-4\] = D.\[0-9\]+;" 4 "original" } } diff --git a/gcc/testsuite/gfortran.dg/gomp/target-span-1.f90 b/gcc/testsuite/gfortran.dg/gomp/target-span-1.f90 new file mode 100644 index 00000000000..30ba7e1862e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/target-span-1.f90 @@ -0,0 +1,30 @@ +! { dg-do compile } +! { dg-additional-options "-fdump-tree-original" } +! +! PR fortran/126950 +! +! A TARGET assumed-shape dummy is addressed through the span of its +! descriptor. The descriptor is not mapped to the device, so the span has +! to be loaded into a local variable on entry and that variable used inside +! the target region, rather than the region dereferencing the descriptor. + +module m + use iso_c_binding +contains + subroutine tgt (t) + real(c_double), target :: t(:) + !$omp target has_device_addr(t) + call inner (t(1)) + !$omp end target + end subroutine tgt + + subroutine inner (a) + real(c_double) :: a + end subroutine inner +end module m + +! The span is loaded from the descriptor once, on entry. +! { dg-final { scan-tree-dump-times "span\.\[0-9\]+ = t->span;" 1 "original" } } +! The element reference uses that variable, not the descriptor. +! { dg-final { scan-tree-dump "t\.\[0-9\]+ \\+ \\(sizetype\\) \\(\\(offset\.\[0-9\]+ \\+ \[^)\]*stride\.\[0-9\]+\[^)\]*\\) \\* span\.\[0-9\]+\\)" "original" } } +! { dg-final { scan-tree-dump-not "\\* t->span" "original" } } -- 2.55.0