)]}'
{
  "commit": "a5ce64f7d50e2f5e66ceeb88c7601bd04f3b94ea",
  "tree": "1dce8272400477434a326d07f6624ea72a714c0f",
  "parents": [
    "13e141515f5f9f2386c4a894326929f03fb59076"
  ],
  "author": {
    "name": "Jakub Jelinek",
    "email": "jakub@redhat.com",
    "time": "Wed Jan 22 17:51:14 2020 +0100"
  },
  "committer": {
    "name": "Jakub Jelinek",
    "email": "jakub@redhat.com",
    "time": "Wed Jan 22 20:12:56 2020 +0100"
  },
  "message": "i386: Fix wrong-code x86 issue with avx512{f,vl} fma PR93009\n\nAs mentioned in the PR, the following testcase is miscompiled with avx512vl.\nThe reason is that the fma *_bcst_1 define_insns have two alternatives:\n\"\u003dv,v\" \"0,v\" \"v,0\" \"m,m\" and use the same\nvfmadd213* %3\u003cavx512bcst\u003e, %2, %0\u003csd_mask_op4\u003e\npattern.  If the first alternative is chosen, everything is ok, but if the\nsecond alternative is chosen, %2 and %0 are the same register, so instead\nof doing dest\u003ddest*another+membcst we do dest\u003ddest*dest+membcst.\nNow, to fix this, either we\u0027d need separate:\n  \"vfmadd213\u003cssemodesuffix\u003e\\t{%3\u003cavx512bcst\u003e, %2, %0\u003csd_mask_op4\u003e|%0\u003csd_mask_op4\u003e, %2, %3\u003cavx512bcst\u003e}\n   vfmadd213\u003cssemodesuffix\u003e\\t{%3\u003cavx512bcst\u003e, %1, %0\u003csd_mask_op4\u003e|%0\u003csd_mask_op4\u003e, %1, %3\u003cavx512bcst\u003e}\"\nwhere for the second alternative, we\u0027d just use %1 instead of %2, but\nwhat I think is actually cleaner is just use a single alternative and\nmake the two multiplication operands commutative, which they really are.\n\n2020-01-15  Jakub Jelinek  \u003cjakub@redhat.com\u003e\n\n\tPR target/93009\n\t* config/i386/sse.md\n\t(*\u003csd_mask_codefor\u003efma_fmadd_\u003cmode\u003e\u003csd_maskz_name\u003e_bcst_1,\n\t*\u003csd_mask_codefor\u003efma_fmsub_\u003cmode\u003e\u003csd_maskz_name\u003e_bcst_1,\n\t*\u003csd_mask_codefor\u003efma_fnmadd_\u003cmode\u003e\u003csd_maskz_name\u003e_bcst_1,\n\t*\u003csd_mask_codefor\u003efma_fnmsub_\u003cmode\u003e\u003csd_maskz_name\u003e_bcst_1): Use\n\tjust a single alternative instead of two, make operands 1 and 2\n\tcommutative.\n\n\t* gcc.target/i386/avx512vl-pr93009.c: New test.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "41478485b52a8f4784606629b5eda9031be130dd",
      "old_mode": 33188,
      "old_path": "gcc/ChangeLog",
      "new_id": "a48cb990a45dbd13ebe06411b57406977e4e2ae9",
      "new_mode": 33188,
      "new_path": "gcc/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "c1b7ce9912553bea3507fba59550277f1ccfdb91",
      "old_mode": 33188,
      "old_path": "gcc/config/i386/sse.md",
      "new_id": "659cbff22f37ee1e92d292a9f4440a7ef05374a2",
      "new_mode": 33188,
      "new_path": "gcc/config/i386/sse.md"
    },
    {
      "type": "modify",
      "old_id": "0c26e20115151d7d72ad1ead98477bda3795243a",
      "old_mode": 33188,
      "old_path": "gcc/testsuite/ChangeLog",
      "new_id": "c313090d06456d1ba0d0dcf6b2139285ae6c5b33",
      "new_mode": 33188,
      "new_path": "gcc/testsuite/ChangeLog"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4dfc4a9f3c38f4cdd016a46a03f5a52ea7f55e4f",
      "new_mode": 33188,
      "new_path": "gcc/testsuite/gcc.target/i386/avx512vl-pr93009.c"
    }
  ]
}
