Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -2839,7 +2839,11 @@ if (Flags.isByVal()) { unsigned Bytes = Flags.getByValSize(); if (Bytes == 0) Bytes = 1; // Don't create zero-sized stack objects. - int FI = MFI.CreateFixedObject(Bytes, VA.getLocMemOffset(), isImmutable); + + // FIXME: For now, all byval parameter objects are marked as aliasing. This + // can be improved with deeper analysis. + int FI = MFI.CreateFixedObject(Bytes, VA.getLocMemOffset(), isImmutable, + /*isAliased=*/true); // Adjust SP offset of interrupt parameter. if (CallConv == CallingConv::X86_INTR) { MFI.setObjectOffset(FI, Offset); Index: test/CodeGen/X86/pr30290.ll =================================================================== --- test/CodeGen/X86/pr30290.ll +++ test/CodeGen/X86/pr30290.ll @@ -5,10 +5,6 @@ ; When broken, five "1" constants are written into the byval %struct.face, ; but the subsequent byval read of that struct (call to bar) gets re-ordered ; before those writes, illegally. -; -; FIXME: the output shown below is the broken output of llc, "movl $1" is -; scheduled after the copy between byval arguments starts. This will be fixed -; with the patch in review D45022. source_filename = "test.c" target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" @@ -26,8 +22,8 @@ ; CHECK-NEXT: .cfi_def_cfa_offset 48 ; CHECK-NEXT: vmovaps {{.*#+}} xmm0 = [1,1,1,1] ; CHECK-NEXT: vmovaps %xmm0, {{[0-9]+}}(%rsp) +; CHECK-NEXT: movl $1, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovups {{[0-9]+}}(%rsp), %xmm0 -; CHECK-NEXT: movl $1, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovups %xmm0, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovaps {{[0-9]+}}(%rsp), %xmm0 ; CHECK-NEXT: vmovups %xmm0, (%rsp)