[PATCH] D108887: [X86][MS] Fix the aligement mismatch of vector variable arguments on Win32

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 3 14:02:50 PDT 2021


mstorsjo added inline comments.


================
Comment at: llvm/lib/Target/X86/X86CallingConv.td:29-30
+    : CCIf<"State.isVarArg() && "
+           "State.getMachineFunction().getSubtarget().getTargetTriple()."
+           "isOSWindows()",
+           A>;
----------------
rnk wrote:
> mstorsjo wrote:
> > rnk wrote:
> > > pengfei wrote:
> > > > rnk wrote:
> > > > > Please check what mingw does in this case.
> > > > With this patch, mingw also uses 4 bytes alignment for both caller and callee.
> > > > But I'm not sure if it is the correct approach since I don't have a mingw environment to test.
> > > > @LiuChen3 fixed Linux 32 bits problem in D78564 by changing callee's alignment to the vector size. Not sure if we should fix in that way.
> > > @mstorsjo , do you mind checking what GCC does on Windows here? Mainly I'm looking out for the possibility that GCC passes such vectors indirectly when passed through varargs.
> > Sorry for the delay. I checked the testcase from Compiler Explorer with GCC targeting mingw (10.2), and I get this:
> > 
> > ```
> > __Z8testm128iz:
> >         pushl   %ebp
> >         movl    %esp, %ebp
> >         leal    27(%ebp), %eax
> >         andl    $-16, %eax
> >         vmovups (%eax), %xmm0
> >         vmovups %xmm0, _res1
> >         movl    8(%ebp), %eax
> >         popl    %ebp
> >         ret
> > [...]
> > __Z17testPastArgumentsv:
> >         pushl   %ebp
> >         movl    %esp, %ebp
> >         andl    $-16, %esp
> >         subl    $32, %esp
> >         vmovups _a, %xmm0
> >         vmovups %xmm0, 16(%esp)
> >         movl    $1, (%esp)
> >         call    __Z8testm128iz
> >         leave
> >         ret
> > ```
> > 
> > So based on that, I'd say that GCC consistently aligns them as a caller, and considers them aligned as a callee. So to be compatible, we'd need to do things the other way for mingw targets.
> > 
> > Then again, I guess such a thing could be considered a calling convention bug in GCC which might be fixable too (with a minor ABI break, but I guess such cases are rare in practice), and I'm not sure if they care about being calling convention compatible with MSVC regarding vector arguments either.
> > 
> No problem, I think this just means we should tweak this `isOSWindows` condition to `isWindowsMSVCEnvironment`.
> 
> How do I test mingw on compiler explorer? That would be handy for me.
I don't think compiler explorer has mingw GCC compilers unfortunately, so I just tested with a local cross compiler I happened to have around. (I have no idea why they don't provide that configuration there, especially as they have a MSVC-in-wine setup anyway.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D108887/new/

https://reviews.llvm.org/D108887



More information about the llvm-commits mailing list