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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect code generation for aligned struct with pragma pack
        </td>
    </tr>

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

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

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

<pre>
    The following code, compiled with `-O3 -msse` produces output which segfaults. This occurs for clang >= 13.

```
#pragma pack(push, 1)

struct Header {
    char a;
    char data[57];

    Header(char _a): a(_a) {}
};

struct Derived : Header {
    Derived(): Header(0) {}
} __attribute__((__aligned__(64)));

struct Final : Derived {};

#pragma pack(pop)

void __attribute__((weak)) foo(int& q, Final& f);

int main() {
    int q;
    Final f;
    __builtin_memset(f.data, 0, 57);
    // optimization barrier
    if (foo)
        foo(q, f);
    return 0;
}
```

The segfault is due to the following output, which uses `movaps` for unaligned stores:
```
main:
        subq    $72, %rsp
        xorps   %xmm0, %xmm0
        movups  %xmm0, 50(%rsp)
        movaps  %xmm0, 40(%rsp)
        movaps  %xmm0, 24(%rsp)
        movaps  %xmm0, 8(%rsp)
```

The problematic IR appears to be:
```
define linkonce_odr dso_local void @_ZN5FinalC2Ev(%struct.Final* nonnull align 1 dereferenceable(58) %0) unnamed_addr #3 comdat align 2 !dbg !140 {
  %2 = alloca %struct.Final*, align 8
  store %struct.Final* %0, %struct.Final** %2, align 8
  call void @llvm.dbg.declare(metadata %struct.Final** %2, metadata !146, metadata !DIExpression()), !dbg !148
  %3 = load %struct.Final*, %struct.Final** %2, align 8
  %4 = bitcast %struct.Final* %3 to %struct.Derived*, !dbg !149
  call void @_ZN7DerivedC2Ev(%struct.Derived* nonnull align 64 dereferenceable(58) %4), !dbg !149
  ret void, !dbg !149
}
```

Note how the alignment constraint for `Derived` is not propagated to `Final`, but we assume that alignment constraint in the constructor for `Derived`, which is invoked from `Final` using the same base pointer. This appears to only happen when we're in the context of a `pragma pack`. Alignment constraints for base classes should propagate to derived classes, even while `pragma pack` is active.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVVslu4zgQ_Rr5QsSQtXg5-OCOE3Qu3cCgT3MxKImyOKFIhYudnq-fR0rxqvQghqyFLL5XVWQ9slDV7_WvhpFaCaGOXO5JqSoWJY94th0XrCJHbhsSzeOHnyl5aI1heCedVpUrmSHK2c5Zcmx42RDD9jV1wpop-dVwdJal0wbgmpSCAjxKn6J0S2bpNIq3UbwZ7vN4uPrPJO003beUdLR8jZJl50zjXZpFyepynLHalZZ8Z7RimkSLb30zwa9sqCY0Sm-bKmpplH_LF1G-PfWebXooUAbjHfWE6QZAyTJ8BJLFdhi2uIUYHNoyzQ_InB865tzQD9AB_0Qbj3CQ3Y5aq3nhLNvtwqAlmgTfS1aFhnnmcfpr1KFnLqkI7pxc6zmure8Tr7qblB8Ur8YcOjL62nuA2VZo4NJGyZy8-XkL9P6rvvcQdqSlXPbJuM6T73u7msM-kPqqbbcrHBeWy13LWsNAu6ynYZ5BHfsbZvuC14-JkmdcRHWWt_xfarmSpKBac8zCmb4mHsuHszq3-l8fYoitvoXWzDotQXyK8zSXN8s83H3xfZQNQclUjhGriL2qyb7IPF1fZ86g8gDUqgPtjK9HX2JODouCGKs0M5jvUeKQ7nRzHZJxxVufmWyReKYoybXpro3ele5MMMrf2zYezMLrlR38ct7wwi6PwwwHzNt09mFcmWdfM0-yL5kv760_nRwoXSFYizVSkpe_CO06RqFpmKOCfZbhitVcMiK4fFWyZDtVQXmM2glVYvmGGoqyePf3jzws6Mfk6dB71NfrdCiYDZFKSicECRNLZgQqwWr8AUrhFQblfdkkeZAOJyVtoQq0AiPKOfUyjloYABK0zapi7x-zLL6sNiCgF9pMhfeS3DvjE9fDLD8GhXU2Yjr48ziKEnqTETTk5pwcIQ7tFK5OK4atQ_tQW2apr-v_Qb0wQ5Dz26bty9N7h-owqPlBgf31eJWa5UVa0pAWoWj1SVK-FCSaswBYcFtSYz_JXuoX2LnrtGNsbj1djWYPS2sxjLlbXGesm-U1z_60vrKRNJ3IIXqB-xODP0vgD2UZadQxiF5wpWVQ_lJJeEz9JuDVDYM-PIfeQSmlsr44O7qnFprn8zWP-xzOw-Ir_LkEiMa4FqLafJTBLTqXgblvQYZAdkd41l4wc3lQr6CstWovSaHLXq09mEEZYkcx0A8FDqaHE9GFfCgpfpPGN0hA-xvyvUA9nf2x7N0SVRPqWS635nk8JZuRWPqzVuBF1Ri_TZhGOVGdM-Wpq-EUMNj44NghuIET3z2Xj5mWFkOmk2qdVqt0RSeWW8HWL7JUWrPShnMj2TPJdL-dekfO-1E4hoST5AX0xGmxbqztwlYVtuQ9TFwxhWrhw2vA8HiA__-ABp8c8-l9fs6zVZxNmnW1ipcxK1YZSxZoK-JiVsZpWaQsrlYlyyeCFkyYNc59UZJIdiQBAu84BE74OomTJM5maTJLoRfToihoGc_TDOeqepkxlBPkn4tpkCSl9xO9Di4Vbm-8UnGDA--pExn1QbNAB3zqbKP0ulSCHril7SSQr4Pz_wH1y2Iv">