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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: 2 field loads instead of 1
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    The code is:
```
struct alignas(8) Y {
  int c;
  int d;
};

bool bar(Y* y) {
   return (y->c | y->d) == 0;
}
```

clang generates:
```
bar(Y*):
        movl 4(%rdi), %eax
        orl     (%rdi), %eax
        sete    %al
 retq
```

Unless I am missing something this can be a single `cmpq` with memory.

The real world use case is a container empty() method that needs to check 2 int fields for 0.

I added `alignas(8)` just to ensure that the alignment is somehow in the way. Probably should be cmpq even w/o alignment at least on x86.

My real code actually contains atomic variables, I would assume cmpq can be done for the following as well:
```
bool foo(X* x) {
   return (x->a.load(std::memory_order_relaxed) |
 x->b.load(std::memory_order_relaxed)) == 0;
}
```

Also the following should probably be compiled to a single cmpq:
```
bool baz(Y* y) {
   return y->c == 0 && y->d == 0;
}
```
Or, are there any concerns with the second accesses validity? These are both fields of the same base object, so I would assume if the first valid, the second is valid as well.

This last snippet is probably more frequent in real life.

https://godbolt.org/z/Kv6rMcehd

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVV1v4jgU_TXm5aooOBDggQemLFK1qnYfZqWdp9GNfUM849jU14Gmv35lh35QbWerRSix5ft9znGQ2Rwc0UYsvojFboJ9bH3Y6NPQ__SnSe31sPnaEiivCQyLciuKnSi2oiou_7zlGHoVAa05OGQhVysh1_ANxPLLaABgXAQlyqu9ftmL5e51nZ-19xZqDEKuvgm5hSFFfBMPAsU-OBByNdyI8jcFYnkLeamzabkT5Q6KqxT_Vvv4VBbdAQ7kKGCkDxt9LUjI9YsRXH6dP1mYC7kSchG0SSbyFoRcED5eW_pg8_sztkyRRtsF2stRoPjwi27-cpaY4Q6wg84wG3cA9h3FNq1iaxgUOqgJENKhJRBVobrjg6gKOJvYQkedD8P0bdREhEBo4eyD1dAzgUJOvAAE5V1E4ygAdcc45MbWkFJ6DbHFCI5IM0QPqiX1E2SmQGPIaobGByiukt0Bak061XVNq1Thj55jikSO-0Bj-NjSSMCOXEw1pYZbfwbj8tkZhyn8GXyNtR2AW99bnSaQugY6kYOzkHv_JgZGsIQcwTt4XFVX5d0P4yiyMFDFHq0dnofAgNF3RsEJg8HaEids7-CccyJz313yXlDQ3lGeQSq08db6cwIKGc5k7YdkTBJpvBdy9XeSyOPHEnlMusCp9aiFXHHUKWa5HUH-7oOm8D2QxUcaxbO8vQTJjvVnHf-H8LaW_bu2L9gcn7FKIPnuaCzpBPoLZTNffzWbGp_-6_p4vjsuRYOQlZDV5R75fC9_hIQwZi5SIECXyaAoOB71lFpkUt5pQKWImRhOaI02cRDlHr62xJQj1D62z7rwzeiIHUGdtObrH6RiSsb-PaPMaNyYwHGMnezeJDaXlM_Eeqduw2AT3dmZ45Gyhl4w6HwgaAI99FldbmS_NQ1dBWljPObLU-6F3B-8rr2NUx8OQu6fhNz_fqrCvaJWj-YTvSn1ulzjhDazar1eLeVsXk3aTaXX80KV9aposGgWVDSVKuYVrReLWs9XODEbWchyNpuVs2IuZTVdl7WaoyxUiVVZqlrMC-rQ2Km1py5VMDHMPW2WclYUE4s1Wc5fPSmThSi3_hhNZ54wGu9YSCnkrZAyXZ-kb94eprPFbhI2yfGm7g8s5oU1HPk1WTTR0uY-O8OVc7kFOcILSVUMxnEk1Anr2aQPdvNuiCa2fT1VvhNyn0sdXzfH4Ecu7HNnLOQ-N_dPAAAA__9w9lrJ">