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

    <tr>
        <th>Summary</th>
        <td>
            Miscompilation in RawTherapee with Clang 15+ and optimization
        </td>
    </tr>

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

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

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

<pre>
    Hello dear LLVM team,

over at RawTherapee we got a bug report of a SEGV happening when compiled with Clang 16:

https://github.com/Beep6581/RawTherapee/issues/6847

I was able to reduce the test case and can share it here:

```c++
namespace
{

    template<typename T>
    bool assignFromData(
        bool has_params_edited,
        T& value,
        bool& params_edited_value
    )
    {
        if (has_params_edited) {
            params_edited_value = true;
        }

        return true;
    }

    struct GeneralParamsEdited {
        bool v0;
        bool v1;
    };

    struct ParamsEdited {
        GeneralParamsEdited general;
    };

}

int main(int argc, char** argv)
{
    ParamsEdited* const pedited =
        argc > 1
            ? new ParamsEdited
            : nullptr;

    int v0;
    int v1;

    assignFromData(pedited, v0, pedited->general.v0);
    assignFromData(pedited, v1, pedited->general.v1);

    return 0;
}
```

Same code in Godbolt:

https://godbolt.org/z/aW7dEYTb9

The reduced code segfaults when compiled with Clang 15 or 16 with `-Og`. When changing the `has_params_edited` parameter in `assignFromData()` from `bool` to `void*` the problem is gone. The difference in assembly between the two versions shows why:

```diff
--- fail.log
+++ good.log
@@ -12,9 +12,8 @@
         test    rax, rax
         je      .LBB0_5
 .LBB0_4:
-        mov     byte ptr [rax], 1
+        mov     word ptr [rax], 257
 .LBB0_5:
-        mov     byte ptr [rax + 1], 1
         xor     eax, eax
         pop     rcx
         ret
```

I'm aware that passing `pedited->general.v[01]` with `pedited == nullptr` is UB, but this shouldn't affect `has_params_edited` which is meant to protect exactly against this during runtime.

Best regards,
Flössie
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVkGP4jgT_TXmUgI5DgnkwKGBZr6RZvStdnpntKeWkxSJR44d2Q5Mz69fVULTQOjeRQiT8qtXVXb5xdJ7VRnEFUvWLNlOZBdq61Y7bdF7hZPcli-r_6HWFkqUDr58-f4VAsqGiQ3jW8Yfhl97QAcywJ_y-FSjky0iHBEqG0BC3lXgsLUugN2DhG-Pn75DLdsWjTIVHGs0UNimVRpLOKpQw0ZLU0GUsvjhMkodQuvJJnZM7CoV6i6fFbZhYrdGbNNkGTGxu8iBiZ3yvkPPxC5dzheXZJ_hKD3IXCMECw7LrkAINUJAH6CQHkGaEgppwNfSIagANTq8yYmlfPgWTKzp21uNbNC3ssATaLG-9AEACNi0WgZk8Sa8tEgO8MTixzdEbq2GYYN2zjZbGSQTy7f5M6aW_rmVTjb-GUsVsDxvzivsiYkUDlJ3OJoiBpq9IngesGcgE9nFw2sxrxRqD0ws72SRjbH0uRMKWLyF4Dpk8Y0DW2xvl44-DkPnzNjlDtwH1xUBPqFBJ_UfffDHPvY4vX49D3yUxWCPRqHi0b6eon0c5l4u1WD7lxA39SkToJHKMLGkv9JVBRMbKGrpmHhg4oFMh_P2XSVyGZ2QhTU-QIunnOPtdc7EDSx-hGi8oyzegcHjNeUd1AOYTus2uDsLR_nfrHxviu5gR6eiPTc-cYjNaxlTFj-eFnZGE9kV_4c00Xs00SXNG9mpI98qeNuqV4m4dPlGB76wJYIy8MmWudXhY7kbMDPrKiZ2v5nYyR-L8vHvpzy7dHqq8SRm5UDvsdrLTgf_gdAmYB1E6WBjKZ_-v2Ipn8GP3qOWpiKhJnFkKR8f9JQPZxoDOiqHpXysWyIj3N7ZhuZ72Uk5SS9L-cEqasHeUCO0zuYaG1AeKmtwBlRUqfZ7dGiKfsWk99jk-gVyDEdEMyj30cIBnVfWePC1PVLNL-8JNhEOpul0Cnup9Ezb6gQatFysobK2vLDPOZtzmEaCiU0GTKz7f0sYJm56vn-TUGvIX9RMNFwDfuIwzr6s1_w5Oc0OT_Nz3tNXeGMPgxq9BIQ2OGDJmkiTLdFH59Rv8UfryjFeJIurgMl_Dkh1Q3Qd9lzTL-v6EYeicVR0a9tBwovbGYfhgxPzmYlFA_JI7-JQywAtNZmpqIHunVOWrHmfZMrPjX2pbvH2rEYpp177a00J512AUKu-gTpdGiYWAeR-j0V4t_uPtSpqomhQmkBN3TobyAN_ySLoF5CVVCSvPXPZOcrbdSaoBmeXRa6pZRxW0pX-_K7eabaJ2Trtr2TlKi6zOJMTXEVpNl-kacajSb1aIi-XWSI48ijnMV_wdF7iMuaFzERWZBO1ElzEPIsSvowTHs3yjPMUS8njQqZFIdicY9MfA31oSGcm_eVplabzBZ9omaP2_UVRiIJ0gwnqfSYESX8PJUuynbgVMUzzrvJszrXywb9xBhU0rr4qPyiRDMoaOtFXV8dLbaJmo5uYbYNq1O_eYdI5vfrgOkjRTsO0dfYnFuHqLkgV_RMAAP__SOMoAg">