get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/814409/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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": []
}