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

    <tr>
        <th>Summary</th>
        <td>
            Missed GVN/PRE for load instruction
        </td>
    </tr>

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

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

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

<pre>
    Compile the test case with
```
clang -fno-omit-frame-pointer -fno-exceptions -O3 -c reduce2.ii -o reduce2.o --save-temps


struct u {
  bool ax();
  void bc();
  bool bd();
  long az;
  long bb;
};

inline bool u::ax() {
  if (bb > az)
    return true;
  if (bd())
    return false;
  return true;
}

inline void u::bc() {
  if (!ax())
    return;
 az++;
  return;
}

inline void foo(u *v) {
  if (!v->ax())
 return;
  if (v->az)
    v->bc();
  v->bc();
}

void bv(int l, int e) {
  for (; l!=e; ++l) {
    u m;
    while (m.ax())
      foo(&m);
  }
}
```
I got
```
    ...
 incq    %rcx
    movq    %rcx, -40(%rbp)
.LBB0_18: # %_Z3fooP1u.exit
                                        # in Loop: Header=BB0_3 Depth=2
    movq    -40(%rbp), %rcx // 1
   
   ... 

    testb   %al, %al
    jne .LBB0_18
# %bb.8:                                # %if.endthread-pre-split.i
                                        #   in Loop: Header=BB0_3 Depth=2
    movq    -40(%rbp), %rcx // 2

   ...

    testb   %al, %al
    jne .LBB0_18
# %bb.16:                               # %_ZN1u2axEv.exit.if.end_crit_edge.i12.i
 #   in Loop: Header=BB0_3 Depth=2
    movq    -40(%rbp), %rcx // 3

    ...
```

Instructions 2 and 3 can be moved before jne, then instruction 1 can be deleted.
It looks like a missed GVN/PRE for load instruction.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0ls-PozYUx_8a5_IEguchEw4cJpNJu9J2u-qhh15GNrwE7xpMbZOZ7l9fGQjJJKl2Ku1GiJjn9-PzvtiAcE7tW6KCZWuWbRai97WxxQupfW--1WohTfVP8WiaTmkCXxN4ch5K4QhelK9ZsmHJA1sm0zFcllq0e4h2rYlMo3y0s6KhqDOq9WRHO72W1HllWgfR7xyiEixVfUkYKwWRma8MRJETB4o8NZ2bqp2dnbd96aEHdr8eLQDSGA3ileGKYc74bD8YVYEsr-yDv6yu7Nq0exDfLi1SzhZ2vzmNh7NqtWppTNkz_sD4w5HkHFHtgOFKSmD8KZTA_DgDYMn3tgVvezorPUUcKW8E7IR25xG38gTga9pBmIn2qM81LcN0FvW6_KlwaGcdjkuU91DsjGG46oHhw-G_KA4R40_XKJccU8Do_VbiwXZjJdy2X-COy-jAcKVaD5rhI4QBXeDujB14-Tr4pIxvwm2AURt94QzQQ3MGAvBShw3HcNXEN1WHSSqGy-ZtEyfcefB2e36AvfE3Z0LaOI6nC9WWfwcLw8yWryePxhzO7fgI0V0yoGRWdjNl_HG9Tp7TFeMPwJAH9-e_-M6Yz2kf06vy5818_xdSqBY-GtOFjL-SqMgyvglFOGyo8zXjG7zGvITDx4kcGG4ZbiGdY-ZBHMdwfs9DnvDgk2PbQk9ZhD7Nf2kJ5p7H2LFrKeNBhHc0yDBTu5jayteWRBV1liLXaeVj9f_Vgp-kF14oM6-YH6NVuvy-WPN6-pT2KF6fDsOCikftnkur_DNVe4pVirNyP1MSfinASZO3O2zage343hrefwiirYBDKVqQFGpSBZJ2xlLQKRTzNbWgTkGQHr0r0uSpmop98KCN-epAq68EAhrlHFXwy5-fGG4___E0PJS0EdV5snhRFbzKeS4WVKTL-yRB5Cu-qIucMJf8jvKUUrpLs6XMZLYUlUhXSCTyhSowQUzDiSdLxFjmOU9JrPh9lQnOE3aXUCOUjrU-NLGx-4Vyrqciy3mKCy0kaTd8eiC29ALDJEMMXyK2CDGR7PeO3SVaOe9OWbzymorf3tPeore6qL3vXHjBDbdrr3zdy7g0DcNtyDn9RZ01X6j0DLcDiWO4HUj_DQAA__82e2SN">