[PATCH] D65234: [CodeGen]: don't treat structures returned in registers as memory inputs

Alexander Potapenko via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 29 07:37:29 PDT 2019

glider marked 3 inline comments as done.
glider added inline comments.

Comment at: clang/test/CodeGen/PR42672.c:50
+  struct {
+    long long int v1, v2, v3, v4;
+  } str;
efriedma wrote:
> glider wrote:
> > The acceptable size actually depends on the target platform. Not sure we can test for all of them, and we'll probably need to restrict this test to e.g. x86
> The interesting case for a 32-byte struct would actually be something like `"=x"(str)`... which currently passes the clang frontend, since 32 is a legal size for that constraint (although it eventually fails in the backend).
Changing "=r" to "=X" indeed makes this particular test pass (there's nothing to fail in the backend, as we don't actually generate instructions that write to memory)
I'm however unsure adding a test for "=X" makes any difference, as our patch is irrelevant to this constraint.

Comment at: clang/test/CodeGen/PR42672.c:40
+    unsigned short first;
+    unsigned char second;
+  } str;
efriedma wrote:
> This isn't a three-byte struct; it's a four-byte struct where one of the bytes is only used for padding. 
You're right. Making this structure packed yields an error, which conforms to GCC behavior.
I've added a test for that as well.

  rG LLVM Github Monorepo



More information about the cfe-commits mailing list