[PATCH] D98689: [X86] [split-stack] Add an option to allocate extra space for stack split functions

Chuanqi Xu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 16 04:33:00 PDT 2021


ChuanqiXu updated this revision to Diff 330938.
ChuanqiXu added a comment.

fix unit-tests.


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

https://reviews.llvm.org/D98689

Files:
  llvm/lib/Target/X86/X86FrameLowering.cpp
  llvm/test/CodeGen/X86/split-stack-extra-space.ll


Index: llvm/test/CodeGen/X86/split-stack-extra-space.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/split-stack-extra-space.ll
@@ -0,0 +1,42 @@
+; RUN: llc -extra-space-for-more-stack-expansion=100 < %s | FileCheck %s
+source_filename = "/disk2/workspace.xuchuanqi/alibaba-llvm-11.x-for-work/clang/test/CodeGen/split-stacks.c"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK: movabsq	$108, %r10
+; CHECK: movabsq	$0, %r11
+; CHECK: callq	__morestack
+
+; CHECK: movabsq	$124, %r10
+; CHECK: movabsq	$0, %r11
+; CHECK: callq	__morestack
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @foo() #0 {
+entry:
+  ret i32 0
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @nosplit() #1 {
+entry:
+  ret i32 0
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @main() #0 {
+entry:
+  %retval = alloca i32, align 4
+  store i32 0, i32* %retval, align 4
+  %call = call i32 @foo()
+  ret i32 %call
+}
+
+attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "split-stack" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 11.1.0 (git at gitlab.alibaba-inc.com:clang-llvm/alibaba-llvm-project.git 74aa28fe18b93f7a68bd02d039a60e858d016d7e)"}
\ No newline at end of file
Index: llvm/lib/Target/X86/X86FrameLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86FrameLowering.cpp
+++ llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -40,6 +40,11 @@
 STATISTIC(NumFrameExtraProbe,
           "Number of extra stack probes generated in prologue");
 
+static llvm::cl::opt<unsigned> ExtraSpaceForMoreStackExpansion(
+    "extra-space-for-more-stack-expansion", llvm::cl::Hidden,
+    llvm::cl::desc("allocate extra space for morestack expansion"),
+    llvm::cl::init(0));
+
 using namespace llvm;
 
 X86FrameLowering::X86FrameLowering(const X86Subtarget &STI,
@@ -2647,8 +2652,6 @@
   assert(!MF.getRegInfo().isLiveIn(ScratchReg) &&
          "Scratch register is live-in");
 
-  if (MF.getFunction().isVarArg())
-    report_fatal_error("Segmented stacks do not support vararg functions.");
   if (!STI.isTargetLinux() && !STI.isTargetDarwin() && !STI.isTargetWin32() &&
       !STI.isTargetWin64() && !STI.isTargetFreeBSD() &&
       !STI.isTargetDragonFly())
@@ -2659,6 +2662,12 @@
   // prologue.
   StackSize = MFI.getStackSize();
 
+  if (ExtraSpaceForMoreStackExpansion.getNumOccurrences())
+    StackSize += ExtraSpaceForMoreStackExpansion;
+  else if (MF.getFunction().isVarArg())
+    report_fatal_error("Segmented stacks do not support vararg functions if "
+                       "user don't specify extra spaces for split stacks.");
+
   // Do not generate a prologue for leaf functions with a stack of size zero.
   // For non-leaf functions we have to allow for the possibility that the
   // callis to a non-split function, as in PR37807. This function could also


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98689.330938.patch
Type: text/x-patch
Size: 4088 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210316/8fded30c/attachment.bin>


More information about the llvm-commits mailing list