[llvm] r331749 - [X86] Mark all byval parameters as aliased

Jeremy Morse via llvm-commits llvm-commits at lists.llvm.org
Tue May 8 02:18:01 PDT 2018


Author: jmorse
Date: Tue May  8 02:18:01 2018
New Revision: 331749

URL: http://llvm.org/viewvc/llvm-project?rev=331749&view=rev
Log:
[X86] Mark all byval parameters as aliased

This is a fix for PR30290: by marking all byval stack slots as being aliased,
the instruction scheduler is more conservative about rescheduling memory
accesses to such stack slots as an LLVM Value* might alias it. This fixes
errors such as in the patched test case, where reads and writes to a data
structure are illegally mixed.

This could be fixed better in the future with better analysis for the
instruction scheduler to know what Values alias what stack slots.

Differential Revision: https://reviews.llvm.org/D45022

Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
    llvm/trunk/test/CodeGen/X86/pr30290.ll

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=331749&r1=331748&r2=331749&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue May  8 02:18:01 2018
@@ -2839,7 +2839,11 @@ X86TargetLowering::LowerMemArgument(SDVa
   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);

Modified: llvm/trunk/test/CodeGen/X86/pr30290.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr30290.ll?rev=331749&r1=331748&r2=331749&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr30290.ll (original)
+++ llvm/trunk/test/CodeGen/X86/pr30290.ll Tue May  8 02:18:01 2018
@@ -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 @@ define void @foo(%struct.face* byval noc
 ; CHECK-NEXT:    .cfi_def_cfa_offset 48
 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,1,1]
 ; CHECK-NEXT:    vmovaps %xmm0, {{[0-9]+}}(%rsp)
-; CHECK-NEXT:    vmovups {{[0-9]+}}(%rsp), %xmm0
 ; CHECK-NEXT:    movl $1, {{[0-9]+}}(%rsp)
+; CHECK-NEXT:    vmovups {{[0-9]+}}(%rsp), %xmm0
 ; CHECK-NEXT:    vmovups %xmm0, {{[0-9]+}}(%rsp)
 ; CHECK-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0
 ; CHECK-NEXT:    vmovups %xmm0, (%rsp)




More information about the llvm-commits mailing list