Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/814409/?format=api
{ "id": 814409, "url": "http://patchwork.ozlabs.org/api/1.2/patches/814409/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20170915214516.GA1701@tucnak/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/1.2/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170915214516.GA1701@tucnak>", "list_archive_url": null, "date": "2017-09-15T21:45:16", "name": "Backports to 6.x", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "745e7438c572ec7c0f19886174ba1da66ff97aa1", "submitter": { "id": 671, "url": "http://patchwork.ozlabs.org/api/1.2/people/671/?format=api", "name": "Jakub Jelinek", "email": "jakub@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20170915214516.GA1701@tucnak/mbox/", "series": [ { "id": 3389, "url": "http://patchwork.ozlabs.org/api/1.2/series/3389/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=3389", "date": "2017-09-15T21:45:16", "name": "Backports to 6.x", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/3389/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/814409/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/814409/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-return-462303-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "mailing list gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-462303-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"eaLXe8rf\"; dkim-atps=neutral", "sourceware.org; auth=none", "ext-mx09.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx09.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=jakub@redhat.com" ], "Received": [ "from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xv88k4H0Vz9sMN\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 16 Sep 2017 07:45:41 +1000 (AEST)", "(qmail 96730 invoked by alias); 15 Sep 2017 21:45:29 -0000", "(qmail 96692 invoked by uid 89); 15 Sep 2017 21:45:27 -0000", "from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by\n\tsourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP;\n\tFri, 15 Sep 2017 21:45:23 +0000", "from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com\n\t[10.5.11.12])\t(using TLSv1.2 with cipher AECDH-AES256-SHA\n\t(256/256 bits))\t(No client certificate requested)\tby\n\tmx1.redhat.com (Postfix) with ESMTPS id 954C64A6FB\tfor\n\t<gcc-patches@gcc.gnu.org>; Fri, 15 Sep 2017 21:45:20 +0000 (UTC)", "from tucnak.zalov.cz (ovpn-116-102.ams2.redhat.com\n\t[10.36.116.102])\tby smtp.corp.redhat.com (Postfix) with\n\tESMTPS id DC7F54138\tfor <gcc-patches@gcc.gnu.org>;\n\tFri, 15 Sep 2017 21:45:19 +0000 (UTC)", "from tucnak.zalov.cz (localhost [127.0.0.1])\tby tucnak.zalov.cz\n\t(8.15.2/8.15.2) with ESMTP id v8FLjHve017990\tfor\n\t<gcc-patches@gcc.gnu.org>; Fri, 15 Sep 2017 23:45:17 +0200", "(from jakub@localhost)\tby tucnak.zalov.cz (8.15.2/8.15.2/Submit)\n\tid v8FLjGAU017989\tfor gcc-patches@gcc.gnu.org;\n\tFri, 15 Sep 2017 23:45:16 +0200" ], "DomainKey-Signature": "a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:subject:message-id:reply-to:mime-version:content-type;\n\tq=dns; s=default; b=RUoM/uMtXgy9PaLEJCUBh959qx+iqL+2KlbmB8rL+d3\n\tdWWe9vH8hHX2inpcr2qgjPXwPs2mfww3K22YypDpJ50YaKaFC8Y5wosI3kUZ57A+\n\tk1abhzO7sML4OdqVOJIFcs4QXSrdArMrXZqRV0Esbuuo6Mh0oSdDX8iAJ3kNWc3Y\n\t=", "DKIM-Signature": "v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:subject:message-id:reply-to:mime-version:content-type;\n\ts=default; bh=D5c/p2L/ZZicueo9X0H43VxZonA=; b=eaLXe8rf/8kG/P3Nw\n\tak4KKn7ZU8pl/XXryXOb8+adP4nFvQ5sPUCVaRPxV0oS2d9AfOTiwgZYEWdv3M5n\n\tPk8nyGA4Ihzto6mje0SmiimIaHpox9/EPBTCAz5BWwXf1rM/zzCErCaiplp+0SuD\n\th8dfG6pARqrj+KqKM2XOwjNzzg=", "Mailing-List": "contact gcc-patches-help@gcc.gnu.org; run by ezmlm", "Precedence": "bulk", "List-Id": "<gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "List-Archive": "<http://gcc.gnu.org/ml/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-help@gcc.gnu.org>", "Sender": "gcc-patches-owner@gcc.gnu.org", "X-Virus-Found": "No", "X-Spam-SWARE-Status": "No, score=-11.9 required=5.0 tests=BAYES_00, GIT_PATCH_2,\n\tGIT_PATCH_3, RP_MATCHES_RCVD,\n\tSPF_HELO_PASS autolearn=ham version=3.3.2 spammy=", "X-HELO": "mx1.redhat.com", "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 954C64A6FB", "Date": "Fri, 15 Sep 2017 23:45:16 +0200", "From": "Jakub Jelinek <jakub@redhat.com>", "To": "gcc-patches@gcc.gnu.org", "Subject": "Backports to 6.x", "Message-ID": "<20170915214516.GA1701@tucnak>", "Reply-To": "Jakub Jelinek <jakub@redhat.com>", "MIME-Version": "1.0", "Content-Type": "multipart/mixed; boundary=\"sMZCuqyhuhd4ycTi\"", "Content-Disposition": "inline", "User-Agent": "Mutt/1.7.1 (2016-10-04)", "X-IsSubscribed": "yes" }, "content": "Hi!\n\nI've backported 13 commits of mine and one from Richard.\nBootstrapped/regtested on x86_64-linux and i686-linux, committed\nto gcc-6-branch.\n\n\tJakub\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-06-30 Jakub Jelinek <jakub@redhat.com>\n\n\tPR target/81225\n\t* config/i386/sse.md (vec_extract_lo_<mode><mask_name>): For\n\tV8FI, V16FI and VI8F_256 iterators, use <store_mask_predicate> instead\n\tof nonimmediate_operand and <store_mask_constraint> instead of m for\n\tthe input operand. For V8FI iterator, always split if input is a MEM.\n\tFor V16FI and V8SF_256 iterators, don't test if both operands are MEM\n\tif <mask_applied>. For VI4F_256 iterator, use <store_mask_predicate>\n\tinstead of register_operand and <store_mask_constraint> instead of v for\n\tthe input operand. Make sure both operands aren't MEMs for if not\n\t<mask_applied>.\n\n\t* gcc.target/i386/pr81225.c: New test.\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tPR libquadmath/65757\n\t* math/roundq.c: Cherry-pick upstream glibc 2015-04-28 change.\n\n--- libquadmath/math/roundq.c\t(revision 250378)\n+++ libquadmath/math/roundq.c\t(revision 250379)\n@@ -1,5 +1,5 @@\n /* Round __float128 to integer away from zero.\n- Copyright (C) 1997, 1999 Free Software Foundation, Inc.\n+ Copyright (C) 1997-2017 Free Software Foundation, Inc.\n This file is part of the GNU C Library.\n Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and\n \t\t Jakub Jelinek <jj@ultra.linux.cz>, 1999.\n@@ -32,7 +32,7 @@ roundq (__float128 x)\n \n GET_FLT128_WORDS64 (i0, i1, x);\n j0 = ((i0 >> 48) & 0x7fff) - 0x3fff;\n- if (j0 < 31)\n+ if (j0 < 48)\n {\n if (j0 < 0)\n \t{\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-08-08 Richard Biener <rguenther@suse.de>\n\n\tPR middle-end/81766\n\t* function.c (thread_prologue_and_epilogue_insns): Restore\n\tbehavior of always calling find_many_sub_basic_blocks on\n\tthe inserted prologue.\n\n\t* gcc.target/i386/pr81766.c: New testcase.\n\n\t2017-08-02 Jakub Jelinek <jakub@redhat.com>\n\n\tPR middle-end/79499\n\t* function.c (thread_prologue_and_epilogue_insns): Determine blocks\n\tfor find_many_sub_basic_blocks bitmap by looking up BLOCK_FOR_INSN\n\tof first NONDEBUG_INSN_P in each of the split_prologue_seq and\n\tprologue_seq sequences - if any.\n\n\t* gcc.dg/pr79499.c: New test.\n\n--- gcc/function.c\t(revision 250814)\n+++ gcc/function.c\t(revision 250958)\n@@ -6068,13 +6068,19 @@ thread_prologue_and_epilogue_insns (void\n \n try_shrink_wrapping (&entry_edge, &bb_flags, prologue_seq);\n \n+ rtx_insn *split_prologue_insn = split_prologue_seq;\n if (split_prologue_seq != NULL_RTX)\n {\n+ while (split_prologue_insn && !NONDEBUG_INSN_P (split_prologue_insn))\n+\tsplit_prologue_insn = NEXT_INSN (split_prologue_insn);\n insert_insn_on_edge (split_prologue_seq, orig_entry_edge);\n inserted = true;\n }\n+ rtx_insn *prologue_insn = prologue_seq;\n if (prologue_seq != NULL_RTX)\n {\n+ while (prologue_insn && !NONDEBUG_INSN_P (prologue_insn))\n+\tprologue_insn = NEXT_INSN (prologue_insn);\n insert_insn_on_edge (prologue_seq, entry_edge);\n inserted = true;\n }\n@@ -6215,8 +6221,19 @@ epilogue_done:\n commit_edge_insertions ();\n \n /* Look for basic blocks within the prologue insns. */\n+ if (split_prologue_insn\n+\t && BLOCK_FOR_INSN (split_prologue_insn) == NULL)\n+\tsplit_prologue_insn = NULL;\n+ if (prologue_insn\n+\t && BLOCK_FOR_INSN (prologue_insn) == NULL)\n+\tprologue_insn = NULL;\n blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));\n bitmap_clear (blocks);\n+ if (split_prologue_insn)\n+\tbitmap_set_bit (blocks,\n+\t\t\tBLOCK_FOR_INSN (split_prologue_insn)->index);\n+ if (prologue_insn)\n+\tbitmap_set_bit (blocks, BLOCK_FOR_INSN (prologue_insn)->index);\n bitmap_set_bit (blocks, entry_edge->dest->index);\n bitmap_set_bit (blocks, orig_entry_edge->dest->index);\n find_many_sub_basic_blocks (blocks);\n--- gcc/testsuite/gcc.dg/pr79499.c\t(nonexistent)\n+++ gcc/testsuite/gcc.dg/pr79499.c\t(revision 250815)\n@@ -0,0 +1,13 @@\n+/* PR middle-end/79499 */\n+/* { dg-do compile { target split_stack } } */\n+/* { dg-options \"-O2 -fsplit-stack -fno-omit-frame-pointer\" } */\n+\n+struct S { struct S *a, *b; };\n+\n+void\n+foo (struct S *x)\n+{\n+ do\n+ x->b = x->a;\n+ while (x = x->a);\n+}\n--- gcc/testsuite/gcc.target/i386/pr81766.c\t(nonexistent)\n+++ gcc/testsuite/gcc.target/i386/pr81766.c\t(revision 250958)\n@@ -0,0 +1,5 @@\n+/* { dg-do compile } */\n+/* { dg-require-effective-target lp64 } */\n+/* { dg-options \"-O2 -fPIE -mcmodel=large\" } */\n+\n+int main() { return 0; }\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-07-27 Jakub Jelinek <jakub@redhat.com>\n\n\tPR c/45784\n\t* c-omp.c (c_finish_omp_for): If the condition is wrapped in\n\trhs of COMPOUND_EXPR(s), skip them and readd their lhs into\n\tnew COMPOUND_EXPRs around the rhs of the comparison.\n\n\t* testsuite/libgomp.c/pr45784.c: New test.\n\t* testsuite/libgomp.c++/pr45784.C: New test.\n\n--- gcc/c-family/c-omp.c\t(revision 251847)\n+++ gcc/c-family/c-omp.c\t(revision 251848)\n@@ -531,6 +531,12 @@ c_finish_omp_for (location_t locus, enum\n \t{\n \t bool cond_ok = false;\n \n+\t /* E.g. C sizeof (vla) could add COMPOUND_EXPRs with\n+\t evaluation of the vla VAR_DECL. We need to readd\n+\t them to the non-decl operand. See PR45784. */\n+\t while (TREE_CODE (cond) == COMPOUND_EXPR)\n+\t cond = TREE_OPERAND (cond, 1);\n+\n \t if (EXPR_HAS_LOCATION (cond))\n \t elocus = EXPR_LOCATION (cond);\n \n@@ -605,6 +611,21 @@ c_finish_omp_for (location_t locus, enum\n \t\t else if (code != CILK_SIMD && code != CILK_FOR)\n \t\t cond_ok = false;\n \t\t}\n+\n+\t if (cond_ok && TREE_VEC_ELT (condv, i) != cond)\n+\t\t{\n+\t\t tree ce = NULL_TREE, *pce = &ce;\n+\t\t tree type = TREE_TYPE (TREE_OPERAND (cond, 1));\n+\t\t for (tree c = TREE_VEC_ELT (condv, i); c != cond;\n+\t\t c = TREE_OPERAND (c, 1))\n+\t\t {\n+\t\t *pce = build2 (COMPOUND_EXPR, type, TREE_OPERAND (c, 0),\n+\t\t\t\t TREE_OPERAND (cond, 1));\n+\t\t pce = &TREE_OPERAND (*pce, 1);\n+\t\t }\n+\t\t TREE_OPERAND (cond, 1) = ce;\n+\t\t TREE_VEC_ELT (condv, i) = cond;\n+\t\t}\n \t }\n \n \t if (!cond_ok)\n--- libgomp/testsuite/libgomp.c/pr45784.c\t(nonexistent)\n+++ libgomp/testsuite/libgomp.c/pr45784.c\t(revision 251848)\n@@ -0,0 +1,41 @@\n+/* PR c/45784 */\n+/* { dg-do run } */\n+\n+void\n+foo (int n)\n+{\n+ char *p, vla[2 * n];\n+ int i;\n+ #pragma omp parallel for\n+ for (p = vla; p < vla + (sizeof (vla) / sizeof (vla[0])); p++)\n+ *p = ' ';\n+ #pragma omp parallel for\n+ for (i = 0; i < 2 * n; i++)\n+ if (vla[i] != ' ')\n+ __builtin_abort ();\n+}\n+\n+void\n+bar (int n)\n+{\n+ char *p, vla1[n], vla2[n * 2], vla3[n * 3], vla4[n * 4];\n+ int i;\n+ __builtin_memset (vla4, ' ', n * 4);\n+ #pragma omp parallel for\n+ for (p = vla4 + sizeof (vla1); p < vla4 + sizeof (vla3) - sizeof (vla2) + sizeof (vla1); p += sizeof (vla4) / sizeof (vla4))\n+ p[0] = '!';\n+ #pragma omp parallel for\n+ for (i = 0; i < n * 4; i++)\n+ if (vla4[i] != ((i >= n && i < 2 * n) ? '!' : ' '))\n+ __builtin_abort ();\n+}\n+\n+int\n+main ()\n+{\n+ volatile int n;\n+ n = 128;\n+ foo (n);\n+ bar (n);\n+ return 0;\n+}\n--- libgomp/testsuite/libgomp.c++/pr45784.C\t(nonexistent)\n+++ libgomp/testsuite/libgomp.c++/pr45784.C\t(revision 251848)\n@@ -0,0 +1,5 @@\n+// PR c/45784\n+// { dg-do run }\n+\n+#include \"../libgomp.c/pr45784.c\"\n+\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-08-03 Jakub Jelinek <jakub@redhat.com>\n\n\tPR middle-end/81052\n\t* omp-low.c (diagnose_sb_0): Handle flag_openmp_simd like flag_openmp.\n\t(pass_diagnose_omp_blocks::gate): Enable also for flag_openmp_simd.\n\n\t* c-c++-common/pr81052.c: New test.\n\n--- gcc/omp-low.c\t(revision 251848)\n+++ gcc/omp-low.c\t(revision 251849)\n@@ -9089,7 +9089,7 @@ diagnose_sb_0 (gimple_stmt_iterator *gsi\n }\n if (kind == NULL)\n {\n- gcc_checking_assert (flag_openmp);\n+ gcc_checking_assert (flag_openmp || flag_openmp_simd);\n kind = \"OpenMP\";\n }\n \n@@ -9349,7 +9349,7 @@ public:\n /* opt_pass methods: */\n virtual bool gate (function *)\n {\n- return flag_cilkplus || flag_openacc || flag_openmp;\n+ return flag_cilkplus || flag_openacc || flag_openmp || flag_openmp_simd;\n }\n virtual unsigned int execute (function *)\n {\n--- gcc/testsuite/c-c++-common/pr81052.c\t(nonexistent)\n+++ gcc/testsuite/c-c++-common/pr81052.c\t(revision 251849)\n@@ -0,0 +1,28 @@\n+/* PR middle-end/81052 */\n+/* { dg-do compile } */\n+/* { dg-options \"-fopenmp-simd -O2\" } */\n+\n+int\n+foo (int x, int y)\n+{\n+ int i;\n+#pragma omp simd\n+ for (i = x; i < y; ++i)\n+ return 0;\t\t\t/* { dg-error \"invalid branch to/from OpenMP structured block\" } */\n+ return 1;\n+}\n+\n+#ifdef __cplusplus\n+template <typename T>\n+T\n+bar (T x, T y)\n+{\n+ T i;\n+#pragma omp simd\n+ for (i = x; i < y; ++i)\n+ return 0;\t\t\t/* { dg-error \"invalid branch to/from OpenMP structured block\" \"\" { target c++ } } */\n+ return 1;\n+}\n+\n+int x = bar (1, 7);\n+#endif\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-08-03 Jakub Jelinek <jakub@redhat.com>\n\n\tPR target/81621\n\t* bb-reorder.c (pass_partition_blocks::execute): Return TODO_df_finish\n\tafter setting changeable df flags.\n\n\t* gcc.dg/pr81621.c: New test.\n\n--- gcc/bb-reorder.c\t(revision 251850)\n+++ gcc/bb-reorder.c\t(revision 251851)\n@@ -2881,7 +2881,8 @@ pass_partition_blocks::execute (function\n \n crossing_edges = find_rarely_executed_basic_blocks_and_crossing_edges ();\n if (!crossing_edges.exists ())\n- return 0;\n+ /* Make sure to process deferred rescans and clear changeable df flags. */\n+ return TODO_df_finish;\n \n crtl->has_bb_partition = true;\n \n@@ -2947,7 +2948,8 @@ pass_partition_blocks::execute (function\n df_analyze ();\n }\n \n- return 0;\n+ /* Make sure to process deferred rescans and clear changeable df flags. */\n+ return TODO_df_finish;\n }\n \n } // anon namespace\n--- gcc/testsuite/gcc.dg/pr81621.c\t(nonexistent)\n+++ gcc/testsuite/gcc.dg/pr81621.c\t(revision 251851)\n@@ -0,0 +1,5 @@\n+/* PR target/81621 */\n+/* { dg-do compile { target freorder } } */\n+/* { dg-options \"-Og -fno-split-wide-types -freorder-blocks-and-partition\" } */\n+\n+#include \"graphite/scop-10.c\"\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-08-09 Jakub Jelinek <jakub@redhat.com>\n\n\tPR c/81687\n\t* omp-low.c (omp_copy_decl): Don't remap FORCED_LABEL or DECL_NONLOCAL\n\tLABEL_DECLs.\n\t* tree-cfg.c (move_stmt_op): Don't adjust DECL_CONTEXT of FORCED_LABEL\n\tor DECL_NONLOCAL labels.\n\t(move_stmt_r) <case GIMPLE_LABEL>: Adjust DECL_CONTEXT of FORCED_LABEL\n\tor DECL_NONLOCAL labels here.\n\n\t* testsuite/libgomp.c/pr81687-1.c: New test.\n\t* testsuite/libgomp.c/pr81687-2.c: New test.\n\n--- gcc/omp-low.c\t(revision 251852)\n+++ gcc/omp-low.c\t(revision 251853)\n@@ -800,6 +800,8 @@ omp_copy_decl (tree var, copy_body_data\n \n if (TREE_CODE (var) == LABEL_DECL)\n {\n+ if (FORCED_LABEL (var) || DECL_NONLOCAL (var))\n+\treturn var;\n new_var = create_artificial_label (DECL_SOURCE_LOCATION (var));\n DECL_CONTEXT (new_var) = current_function_decl;\n insert_decl_map (&ctx->cb, var, new_var);\n--- gcc/tree-cfg.c\t(revision 251852)\n+++ gcc/tree-cfg.c\t(revision 251853)\n@@ -6667,7 +6667,15 @@ move_stmt_op (tree *tp, int *walk_subtre\n \t\t*tp = t = out->to;\n \t }\n \n-\t DECL_CONTEXT (t) = p->to_context;\n+\t /* For FORCED_LABELs we can end up with references from other\n+\t functions if some SESE regions are outlined. It is UB to\n+\t jump in between them, but they could be used just for printing\n+\t addresses etc. In that case, DECL_CONTEXT on the label should\n+\t be the function containing the glabel stmt with that LABEL_DECL,\n+\t rather than whatever function a reference to the label was seen\n+\t last time. */\n+\t if (!FORCED_LABEL (t) && !DECL_NONLOCAL (t))\n+\t DECL_CONTEXT (t) = p->to_context;\n \t}\n else if (p->remap_decls_p)\n \t{\n@@ -6785,6 +6793,21 @@ move_stmt_r (gimple_stmt_iterator *gsi_p\n case GIMPLE_OMP_RETURN:\n case GIMPLE_OMP_CONTINUE:\n break;\n+\n+ case GIMPLE_LABEL:\n+ {\n+\t/* For FORCED_LABEL, move_stmt_op doesn't adjust DECL_CONTEXT,\n+\t so that such labels can be referenced from other regions.\n+\t Make sure to update it when seeing a GIMPLE_LABEL though,\n+\t that is the owner of the label. */\n+\twalk_gimple_op (stmt, move_stmt_op, wi);\n+\t*handled_ops_p = true;\n+\ttree label = gimple_label_label (as_a <glabel *> (stmt));\n+\tif (FORCED_LABEL (label) || DECL_NONLOCAL (label))\n+\t DECL_CONTEXT (label) = p->to_context;\n+ }\n+ break;\n+\n default:\n if (is_gimple_omp (stmt))\n \t{\n--- libgomp/testsuite/libgomp.c/pr81687-1.c\t(nonexistent)\n+++ libgomp/testsuite/libgomp.c/pr81687-1.c\t(revision 251853)\n@@ -0,0 +1,23 @@\n+/* PR c/81687 */\n+/* { dg-do link } */\n+/* { dg-additional-options \"-O2\" } */\n+\n+extern int printf (const char *, ...);\n+\n+int\n+main ()\n+{\n+ #pragma omp parallel\n+ {\n+ lab1:\n+ printf (\"lab1=%p\\n\", (void *)(&&lab1));\n+ }\n+ lab2:\n+ #pragma omp parallel\n+ {\n+ lab3:\n+ printf (\"lab2=%p\\n\", (void *)(&&lab2));\n+ }\n+ printf (\"lab3=%p\\n\", (void *)(&&lab3));\n+ return 0;\n+}\n--- libgomp/testsuite/libgomp.c/pr81687-2.c\t(nonexistent)\n+++ libgomp/testsuite/libgomp.c/pr81687-2.c\t(revision 251853)\n@@ -0,0 +1,27 @@\n+/* PR c/81687 */\n+/* { dg-do link } */\n+/* { dg-additional-options \"-O2\" } */\n+\n+int\n+main ()\n+{\n+ __label__ lab4, lab5, lab6;\n+ volatile int l = 0;\n+ int m = l;\n+ void foo (int x) { if (x == 1) goto lab4; }\n+ void bar (int x) { if (x == 2) goto lab5; }\n+ void baz (int x) { if (x == 3) goto lab6; }\n+ #pragma omp parallel\n+ {\n+ foo (m + 1);\n+ lab4:;\n+ }\n+ #pragma omp task\n+ {\n+ bar (m + 2);\n+ lab5:;\n+ }\n+ baz (m + 3);\n+ lab6:;\n+ return 0;\n+}\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-09-04 Jakub Jelinek <jakub@redhat.com>\n\n\t* lra-remat.c (reg_overlap_for_remat_p): Fix a pasto.\n\n--- gcc/lra-remat.c\t(revision 251854)\n+++ gcc/lra-remat.c\t(revision 251855)\n@@ -684,7 +684,7 @@ reg_overlap_for_remat_p (lra_insn_reg *r\n \n \tif (regno2 >= FIRST_PSEUDO_REGISTER && reg_renumber[regno2] >= 0)\n \t regno2 = reg_renumber[regno2];\n-\tif (regno >= FIRST_PSEUDO_REGISTER)\n+\tif (regno2 >= FIRST_PSEUDO_REGISTER)\n \t nregs2 = 1;\n \telse\n \t nregs2 = hard_regno_nregs[regno2][reg->biggest_mode];\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-09-05 Jakub Jelinek <jakub@redhat.com>\n\n\tPR middle-end/81768\n\t* omp-low.c (expand_omp_simd): Force second operands of COND_EXPR\n\tinto gimple val before gimplification fo the COND_EXPR.\n\n\t* gcc.dg/gomp/pr81768-1.c: New test.\n\n--- gcc/omp-low.c\t(revision 251855)\n+++ gcc/omp-low.c\t(revision 251856)\n@@ -4725,24 +4725,28 @@ expand_omp_simd (struct omp_region *regi\n \t tree itype2 = TREE_TYPE (fd->loops[i - 1].v);\n \t if (POINTER_TYPE_P (itype2))\n \t\titype2 = signed_type_for (itype2);\n+\t t = fold_convert (itype2, fd->loops[i - 1].step);\n+\t t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE, true,\n+\t\t\t\t\t GSI_SAME_STMT);\n \t t = build3 (COND_EXPR, itype2,\n \t\t\t build2 (fd->loops[i].cond_code, boolean_type_node,\n \t\t\t\t fd->loops[i].v,\n \t\t\t\t fold_convert (itype, fd->loops[i].n2)),\n-\t\t\t build_int_cst (itype2, 0),\n-\t\t\t fold_convert (itype2, fd->loops[i - 1].step));\n+\t\t\t build_int_cst (itype2, 0), t);\n \t if (POINTER_TYPE_P (TREE_TYPE (fd->loops[i - 1].v)))\n \t\tt = fold_build_pointer_plus (fd->loops[i - 1].v, t);\n \t else\n \t\tt = fold_build2 (PLUS_EXPR, itype2, fd->loops[i - 1].v, t);\n \t expand_omp_build_assign (&gsi, fd->loops[i - 1].v, t);\n \n+\t t = fold_convert (itype, fd->loops[i].n1);\n+\t t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE, true,\n+\t\t\t\t\t GSI_SAME_STMT);\n \t t = build3 (COND_EXPR, itype,\n \t\t\t build2 (fd->loops[i].cond_code, boolean_type_node,\n \t\t\t\t fd->loops[i].v,\n \t\t\t\t fold_convert (itype, fd->loops[i].n2)),\n-\t\t\t fd->loops[i].v,\n-\t\t\t fold_convert (itype, fd->loops[i].n1));\n+\t\t\t fd->loops[i].v, t);\n \t expand_omp_build_assign (&gsi, fd->loops[i].v, t);\n \t }\n \t}\n--- gcc/testsuite/gcc.dg/gomp/pr81768-1.c\t(nonexistent)\n+++ gcc/testsuite/gcc.dg/gomp/pr81768-1.c\t(revision 251856)\n@@ -0,0 +1,15 @@\n+/* PR middle-end/81768 */\n+/* { dg-do compile } */\n+\n+float b[10][15][10];\n+\n+void\n+foo (void)\n+{\n+ float *i;\n+#pragma omp target parallel for simd schedule(static, 32) collapse(3)\n+ for (i = &b[0][0][0]; i < &b[0][0][10]; i++)\n+ for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10)\n+ for (float *k = &b[0][0][10]; k > &b[0][0][0]; --k)\n+\tb[i - &b[0][0][0]][(j - &b[0][0][0]) / 10 - 1][(k - &b[0][0][0]) - 1] -= 3.5;\n+}\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-09-05 Jakub Jelinek <jakub@redhat.com>\n\n\tPR middle-end/81768\n\t* omp-low.c (lower_omp_for): Recompute tree invariant if\n\tgimple_omp_for_initial/final is ADDR_EXPR.\n\n\t* gcc.dg/gomp/pr81768-2.c: New test.\n\n--- gcc/omp-low.c\t(revision 251856)\n+++ gcc/omp-low.c\t(revision 251857)\n@@ -6927,10 +6927,14 @@ lower_omp_for (gimple_stmt_iterator *gsi\n rhs_p = gimple_omp_for_initial_ptr (stmt, i);\n if (!is_gimple_min_invariant (*rhs_p))\n \t*rhs_p = get_formal_tmp_var (*rhs_p, &body);\n+ else if (TREE_CODE (*rhs_p) == ADDR_EXPR)\n+\trecompute_tree_invariant_for_addr_expr (*rhs_p);\n \n rhs_p = gimple_omp_for_final_ptr (stmt, i);\n if (!is_gimple_min_invariant (*rhs_p))\n \t*rhs_p = get_formal_tmp_var (*rhs_p, &body);\n+ else if (TREE_CODE (*rhs_p) == ADDR_EXPR)\n+\trecompute_tree_invariant_for_addr_expr (*rhs_p);\n \n rhs_p = &TREE_OPERAND (gimple_omp_for_incr (stmt, i), 1);\n if (!is_gimple_min_invariant (*rhs_p))\n--- gcc/testsuite/gcc.dg/gomp/pr81768-2.c\t(nonexistent)\n+++ gcc/testsuite/gcc.dg/gomp/pr81768-2.c\t(revision 251857)\n@@ -0,0 +1,15 @@\n+/* PR middle-end/81768 */\n+/* { dg-do compile } */\n+\n+float b[10][15][10];\n+\n+void\n+foo (void)\n+{\n+ float *i;\n+#pragma omp target parallel for schedule(static, 32) collapse(3)\n+ for (i = &b[0][0][0]; i < &b[0][0][10]; i++)\n+ for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10)\n+ for (float *k = &b[0][0][10]; k > &b[0][0][0]; --k)\n+ b[i - &b[0][0][0]][(j - &b[0][0][0]) / 10 - 1][(k - &b[0][0][0]) - 1] -= 3.5;\n+}\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-09-12 Jakub Jelinek <jakub@redhat.com>\n\n\tPR target/82112\n\t* c-common.c (sync_resolve_size): Instead of c_dialect_cxx ()\n\tassertion check that in the condition.\n\t(get_atomic_generic_size): Likewise. Before testing if parameter\n\thas pointer type, if it has array type, call for C++\n\tdefault_conversion to perform array-to-pointer conversion.\n\n\t* c-c++-common/pr82112.c: New test.\n\t* gcc.dg/pr82112.c: New test.\n\n--- gcc/c-family/c-common.c\t(revision 252802)\n+++ gcc/c-family/c-common.c\t(revision 252803)\n@@ -6576,10 +6576,9 @@ sync_resolve_size (tree function, vec<tr\n }\n \n argtype = type = TREE_TYPE ((*params)[0]);\n- if (TREE_CODE (type) == ARRAY_TYPE)\n+ if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())\n {\n /* Force array-to-pointer decay for C++. */\n- gcc_assert (c_dialect_cxx());\n (*params)[0] = default_conversion ((*params)[0]);\n type = TREE_TYPE ((*params)[0]);\n }\n@@ -6741,10 +6740,9 @@ get_atomic_generic_size (location_t loc,\n \n /* Get type of first parameter, and determine its size. */\n type_0 = TREE_TYPE ((*params)[0]);\n- if (TREE_CODE (type_0) == ARRAY_TYPE)\n+ if (TREE_CODE (type_0) == ARRAY_TYPE && c_dialect_cxx ())\n {\n /* Force array-to-pointer decay for C++. */\n- gcc_assert (c_dialect_cxx());\n (*params)[0] = default_conversion ((*params)[0]);\n type_0 = TREE_TYPE ((*params)[0]);\n }\n@@ -6783,6 +6781,12 @@ get_atomic_generic_size (location_t loc,\n /* __atomic_compare_exchange has a bool in the 4th position, skip it. */\n if (n_param == 6 && x == 3)\n continue;\n+ if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())\n+\t{\n+\t /* Force array-to-pointer decay for C++. */\n+\t (*params)[x] = default_conversion ((*params)[x]);\n+\t type = TREE_TYPE ((*params)[x]);\n+\t}\n if (!POINTER_TYPE_P (type))\n \t{\n \t error_at (loc, \"argument %d of %qE must be a pointer type\", x + 1,\n--- gcc/testsuite/gcc.dg/pr82112.c\t(nonexistent)\n+++ gcc/testsuite/gcc.dg/pr82112.c\t(revision 252803)\n@@ -0,0 +1,21 @@\n+/* PR target/82112 */\n+/* { dg-do compile } */\n+/* { dg-options \"-std=gnu90\" } */\n+\n+struct S { int a[10]; } bar (void);\n+int b, c;\n+\n+void\n+foo (void)\n+{\n+ __atomic_load (bar ().a, &b, __ATOMIC_ACQUIRE);\t/* { dg-error \"argument 1 of .__atomic_load. must be a non-void pointer type\" } */\n+ __atomic_load (&b, bar ().a, __ATOMIC_ACQUIRE);\t/* { dg-error \"argument 2 of .__atomic_load. must be a pointer type\" } */\n+ __atomic_store (bar ().a, &b, __ATOMIC_SEQ_CST);\t/* { dg-error \"argument 1 of .__atomic_store. must be a non-void pointer type\" } */\n+ __atomic_store (&b, bar ().a, __ATOMIC_SEQ_CST);\t/* { dg-error \"argument 2 of .__atomic_store. must be a pointer type\" } */\n+ __atomic_exchange (bar ().a, &b, &c, __ATOMIC_RELAXED);\t/* { dg-error \"argument 1 of .__atomic_exchange. must be a non-void pointer type\" } */\n+ __atomic_exchange (&b, bar ().a, &c, __ATOMIC_RELAXED);\t/* { dg-error \"argument 2 of .__atomic_exchange. must be a pointer type\" } */\n+ __atomic_exchange (&b, &c, bar ().a, __ATOMIC_RELAXED);\t/* { dg-error \"argument 3 of .__atomic_exchange. must be a pointer type\" } */\n+ __atomic_compare_exchange (bar ().a, &b, &c, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED);\t/* { dg-error \"argument 1 of .__atomic_compare_exchange. must be a non-void pointer type\" } */\n+ __atomic_compare_exchange (&b, bar ().a, &c, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED);\t/* { dg-error \"argument 2 of .__atomic_compare_exchange. must be a pointer type\" } */\n+ __atomic_compare_exchange (&b, &c, bar ().a, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED);\t/* { dg-error \"argument 3 of .__atomic_compare_exchange. must be a pointer type\" } */\n+}\n--- gcc/testsuite/c-c++-common/pr82112.c\t(nonexistent)\n+++ gcc/testsuite/c-c++-common/pr82112.c\t(revision 252803)\n@@ -0,0 +1,13 @@\n+/* PR target/82112 */\n+/* { dg-do compile } */\n+\n+int c[10], d[10], e[10], f[10], g[10], h[10], i[10], j[10], k[10], l[10];\n+\n+void\n+foo (void)\n+{\n+ __atomic_load (c, d, __ATOMIC_ACQUIRE);\n+ __atomic_store (e, f, __ATOMIC_SEQ_CST);\n+ __atomic_exchange (g, h, i, __ATOMIC_RELAXED);\n+ __atomic_compare_exchange (j, k, l, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED);\n+}\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-09-12 Jakub Jelinek <jakub@redhat.com>\n\n\tPR target/82112\n\t* gcc.target/powerpc/pr82112.c: New test.\n\t* g++.dg/ext/altivec-18.C: New test.\n\n--- gcc/testsuite/gcc.target/powerpc/pr82112.c\t(nonexistent)\n+++ gcc/testsuite/gcc.target/powerpc/pr82112.c\t(revision 252804)\n@@ -0,0 +1,16 @@\n+/* PR target/82112 */\n+/* { dg-do compile } */\n+/* { dg-require-effective-target powerpc_altivec_ok } */\n+/* { dg-options \"-maltivec -std=gnu90\" } */\n+\n+#include <altivec.h>\n+\n+struct __attribute__((aligned (16))) S { unsigned char c[64]; } bar (void);\n+vector unsigned char v;\n+\n+void\n+foo (void)\n+{\n+ vec_ld (0, bar ().c);\t/* { dg-error \"invalid parameter combination for AltiVec intrinsic\" } */\n+ vec_st (v, 0, bar ().c);\t/* { dg-error \"invalid parameter combination for AltiVec intrinsic\" } */\n+}\n--- gcc/testsuite/g++.dg/ext/altivec-18.C\t(nonexistent)\n+++ gcc/testsuite/g++.dg/ext/altivec-18.C\t(revision 252804)\n@@ -0,0 +1,14 @@\n+// PR target/82112\n+// { dg-do compile { target powerpc*-*-* } }\n+// { dg-require-effective-target powerpc_altivec_ok }\n+// { dg-options \"-maltivec\" }\n+\n+#include <altivec.h>\n+\n+__attribute__((aligned (16))) extern const unsigned char c[16];\n+\n+void\n+foo (void)\n+{\n+ vec_ld (0, c);\n+}\n2017-09-15 Jakub Jelinek <jakub@redhat.com>\n\n\tBackported from mainline\n\t2017-09-14 Jakub Jelinek <jakub@redhat.com>\n\n\tPR c++/81314\n\t* cp-gimplify.c (omp_var_to_track): Look through references.\n\t(omp_cxx_notice_variable): Likewise.\n\n\t* testsuite/libgomp.c++/pr81314.C: New test.\n\n--- gcc/cp/cp-gimplify.c\t(revision 252805)\n+++ gcc/cp/cp-gimplify.c\t(revision 252806)\n@@ -924,6 +924,8 @@ omp_var_to_track (tree decl)\n tree type = TREE_TYPE (decl);\n if (is_invisiref_parm (decl))\n type = TREE_TYPE (type);\n+ else if (TREE_CODE (type) == REFERENCE_TYPE)\n+ type = TREE_TYPE (type);\n while (TREE_CODE (type) == ARRAY_TYPE)\n type = TREE_TYPE (type);\n if (type == error_mark_node || !CLASS_TYPE_P (type))\n@@ -976,6 +978,8 @@ omp_cxx_notice_variable (struct cp_gener\n \t tree type = TREE_TYPE (decl);\n \t if (is_invisiref_parm (decl))\n \t\ttype = TREE_TYPE (type);\n+\t else if (TREE_CODE (type) == REFERENCE_TYPE)\n+\t\ttype = TREE_TYPE (type);\n \t while (TREE_CODE (type) == ARRAY_TYPE)\n \t\ttype = TREE_TYPE (type);\n \t get_copy_ctor (type, tf_none);\n--- libgomp/testsuite/libgomp.c++/pr81314.C\t(nonexistent)\n+++ libgomp/testsuite/libgomp.c++/pr81314.C\t(revision 252806)\n@@ -0,0 +1,38 @@\n+// PR c++/81314\n+// { dg-do link }\n+\n+template <int N>\n+struct S {\n+ S () { s = 0; }\n+ S (const S &x) { s = x.s; }\n+ ~S () {}\n+ int s;\n+};\n+\n+void\n+foo (S<2> &x)\n+{\n+ #pragma omp taskloop\n+ for (int i = 0; i < 100; ++i)\n+ x.s++;\n+}\n+\n+void\n+bar (S<3> &x)\n+{\n+ #pragma omp task\n+ x.s++;\n+}\n+\n+int\n+main ()\n+{\n+ S<2> s;\n+ S<3> t;\n+ #pragma omp parallel\n+ #pragma omp master\n+ {\n+ foo (s);\n+ bar (t);\n+ }\n+}", "diff": "--- gcc/config/i386/sse.md\t(revision 250284)\n+++ gcc/config/i386/sse.md\t(revision 250285)\n@@ -7230,12 +7230,13 @@ (define_insn \"vec_extract_lo_<mode>_mask\n (define_insn \"vec_extract_lo_<mode><mask_name>\"\n [(set (match_operand:<ssehalfvecmode> 0 \"<store_mask_predicate>\" \"=<store_mask_constraint>,v\")\n \t(vec_select:<ssehalfvecmode>\n-\t (match_operand:V8FI 1 \"nonimmediate_operand\" \"v,m\")\n+\t (match_operand:V8FI 1 \"<store_mask_predicate>\" \"v,<store_mask_constraint>\")\n \t (parallel [(const_int 0) (const_int 1)\n (const_int 2) (const_int 3)])))]\n- \"TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))\"\n+ \"TARGET_AVX512F\n+ && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))\"\n {\n- if (<mask_applied> || !TARGET_AVX512VL)\n+ if (<mask_applied> || (!TARGET_AVX512VL && !MEM_P (operands[1])))\n return \"vextract<shuffletype>64x4\\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}\";\n else\n return \"#\";\n@@ -7374,14 +7375,15 @@ (define_expand \"avx_vextractf128<mode>\"\n (define_insn \"vec_extract_lo_<mode><mask_name>\"\n [(set (match_operand:<ssehalfvecmode> 0 \"nonimmediate_operand\" \"=v,m\")\n \t(vec_select:<ssehalfvecmode>\n-\t (match_operand:V16FI 1 \"nonimmediate_operand\" \"vm,v\")\n+\t (match_operand:V16FI 1 \"<store_mask_predicate>\"\n+\t\t\t\t \"<store_mask_constraint>,v\")\n \t (parallel [(const_int 0) (const_int 1)\n (const_int 2) (const_int 3)\n (const_int 4) (const_int 5)\n (const_int 6) (const_int 7)])))]\n \"TARGET_AVX512F\n && <mask_mode512bit_condition>\n- && !(MEM_P (operands[0]) && MEM_P (operands[1]))\"\n+ && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))\"\n {\n if (<mask_applied>)\n return \"vextract<shuffletype>32x8\\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}\";\n@@ -7413,11 +7415,12 @@ (define_split\n (define_insn \"vec_extract_lo_<mode><mask_name>\"\n [(set (match_operand:<ssehalfvecmode> 0 \"<store_mask_predicate>\" \"=v,m\")\n \t(vec_select:<ssehalfvecmode>\n-\t (match_operand:VI8F_256 1 \"nonimmediate_operand\" \"vm,v\")\n+\t (match_operand:VI8F_256 1 \"<store_mask_predicate>\"\n+\t\t\t\t \"<store_mask_constraint>,v\")\n \t (parallel [(const_int 0) (const_int 1)])))]\n \"TARGET_AVX\n && <mask_avx512vl_condition> && <mask_avx512dq_condition>\n- && !(MEM_P (operands[0]) && MEM_P (operands[1]))\"\n+ && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))\"\n {\n if (<mask_applied>)\n return \"vextract<shuffletype>64x2\\t{$0x0, %1, %0%{%3%}|%0%{%3%}, %1, 0x0}\";\n@@ -7493,12 +7496,16 @@ (define_split\n \n \n (define_insn \"vec_extract_lo_<mode><mask_name>\"\n- [(set (match_operand:<ssehalfvecmode> 0 \"<store_mask_predicate>\" \"=<store_mask_constraint>\")\n+ [(set (match_operand:<ssehalfvecmode> 0 \"<store_mask_predicate>\"\n+\t\t\t\t\t \"=<store_mask_constraint>,v\")\n \t(vec_select:<ssehalfvecmode>\n-\t (match_operand:VI4F_256 1 \"register_operand\" \"v\")\n+\t (match_operand:VI4F_256 1 \"<store_mask_predicate>\"\n+\t\t\t\t \"v,<store_mask_constraint>\")\n \t (parallel [(const_int 0) (const_int 1)\n \t\t (const_int 2) (const_int 3)])))]\n- \"TARGET_AVX && <mask_avx512vl_condition> && <mask_avx512dq_condition>\"\n+ \"TARGET_AVX\n+ && <mask_avx512vl_condition> && <mask_avx512dq_condition>\n+ && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))\"\n {\n if (<mask_applied>)\n return \"vextract<shuffletype>32x4\\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}\";\n--- gcc/testsuite/gcc.target/i386/pr81225.c\t(nonexistent)\n+++ gcc/testsuite/gcc.target/i386/pr81225.c\t(revision 250285)\n@@ -0,0 +1,14 @@\n+/* PR target/81225 */\n+/* { dg-do compile } */\n+/* { dg-options \"-mavx512ifma -O3 -ffloat-store\" } */\n+\n+long a[24];\n+float b[4], c[24];\n+int d;\n+\n+void\n+foo ()\n+{\n+ for (d = 0; d < 24; d++)\n+ c[d] = (float) d ? : b[a[d]];\n+}\n", "prefixes": [] }