<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/127511>127511</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [x86-64] Incorrect GVN optimization
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          IshwaraK
      </td>
    </tr>
</table>

<pre>
    The GVN optimizes-out the pointer-check code in else block of the below code snippet as part of 'removing nonlocal load' instruction. This is incorrect, because the pointer is getting modified in setjmp() part at first time. Moreover, the pointer itself marked as volatile too. So GVN shouldn't propagate top-level null value assignment to else block. Also saw that GVN works fine if I pass '-enable-gvn-memdep=false' to disable memdep of GVN pass. 

This problem doesn't exist in gcc compiler. The link to ce is here https://godbolt.org/z/M7jh4fYdo


```
#include <stdio.h>
#include <setjmp.h>

extern int bar(void**);

typedef struct aFlag {
  int flg;
} aFlag;

jmp_buf buf;

void foo() {
  volatile void *kPtr = ((void*)0);
  static int trace = 0;
  if(setjmp(buf) == 0) {
 bar((void **)&kPtr);
  } else {
    trace++;
    if (kPtr != ((void*)0)) // This code is getting removed in GVN pass
      ((aFlag *)kPtr)->flg |= 0x0001;
  }
  printf("trace: %d\n", trace);
}

```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJx0VN-L4zYQ_muUlyHBluN18uCH7OZSlnKl0KPQpyJbY1sbWWOkcXbv_voiOcmmVwoCg2fmm2---aFCML1DrEX5LMrjSs08kK9fw_CuvPp11ZD-Xn8bEH758zegic1ofmBY08zAA8JExjH6dTtge4aWNIJxgDYgNJbaM1CX_Bq09L7YgzPThAwqwKQ8Rw8hK48jXYzrwZGz1CoLlpQWsgLjAvu5ZUNuA98GEyA-15L32LKQL9Bgq-aAj4SiT4_MEXEkbTqDOjILyG_jJOROyP2SXjF0xgcGNiNu4Ct5pAv6iPsvPA5oOxiVP6OO3C9kFRuLwEQb-IOSQGGg2WonZMUweZpUrzh6TGuLF7TgZmvhouyMsAg_omNgelBsAwcbCIJ6Bx4UJ9h38ucAnXEIpoNXmFQIUbQ1OtVYXPcXtx5x1DiJ4tgpGzAKxwTahOgAizFKHeFi-AZEdhDZIQk6eWosjqAJw0IeP0zgKFjfttDSOBmLPsqPYI07R-wWo8gDeoSBeQqiOAh5EvLUk27I8oZ8L-Tph5Cnr9XbsO3-0rTkjO8pu77sIGRhXGtnjSCKl8Da0GYQxZf_mlLz7rbsgB-M3oFxDI3yQu4uZLSQh_T2onhe3Pj7hBo7WOYI1MmqHkQVrZCCO9tfnavjYr7Hvo3T383cQTN3938xC3RE1zG6Id0nItmFPJx_Zw-iOEJy_CS3z-7sAAIrNm2iwV61mAKym9V0Qu7uQxtJxITFcXH6TL6Uf00CnxLIp0jiIV2sMA3bjTUsaYV8jq-4_TRxK3dLBTL_3yIig9T0ZTOXA_C5emmrl827Dd4VH65412YkxCvVtSi-dDZ26CWV-ZFlWf7AP30nbxx3CUMuBRQHELLUonxxQsq0v0th-3tvf5q9la4LvS_2aoV1XhX7XVZJWa6GWu13TdsVVdk1WV60VSer7a6VHeZPOquqdmVqmckyk3mVl9sqKzcZFrpotnlZ5rJqci22GY7K2I21lzFuwsqEMGOdy6rM85VVDdqQbq6UDt8hWSPt8rjydQxaN3MfxDazJnD4hGHDNh3rj93T-mkryiO83m7h441W8V6uZm_rn5bT8DA3m5ZGIU8R9fpZT57e0j09JS5ByNOV7KWW_wQAAP__YXflnw">