[llvm] r205997 - Move the segmented stack switch to a function attribute
Rafael EspĂndola
rafael.espindola at gmail.com
Sun Apr 27 08:03:49 PDT 2014
nice :-)
On 10 April 2014 18:58, Reid Kleckner <reid at kleckner.net> wrote:
> Author: rnk
> Date: Thu Apr 10 17:58:43 2014
> New Revision: 205997
>
> URL: http://llvm.org/viewvc/llvm-project?rev=205997&view=rev
> Log:
> Move the segmented stack switch to a function attribute
>
> This removes the -segmented-stacks command line flag in favor of a
> per-function "split-stack" attribute.
>
> Patch by Luqman Aden and Alex Crichton!
>
> Modified:
> llvm/trunk/docs/SegmentedStacks.rst
> llvm/trunk/include/llvm/CodeGen/CommandFlags.h
> llvm/trunk/include/llvm/CodeGen/MachineFunction.h
> llvm/trunk/include/llvm/Target/TargetOptions.h
> llvm/trunk/lib/CodeGen/MachineFunction.cpp
> llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
> llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
> llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> llvm/trunk/test/CodeGen/ARM/debug-segmented-stacks.ll
> llvm/trunk/test/CodeGen/ARM/segmented-stacks-dynamic.ll
> llvm/trunk/test/CodeGen/ARM/segmented-stacks.ll
> llvm/trunk/test/CodeGen/Thumb/segmented-stacks-dynamic.ll
> llvm/trunk/test/CodeGen/Thumb/segmented-stacks.ll
> llvm/trunk/test/CodeGen/Thumb2/segmented-stacks.ll
> llvm/trunk/test/CodeGen/X86/segmented-stacks-dynamic.ll
> llvm/trunk/test/CodeGen/X86/segmented-stacks.ll
>
> Modified: llvm/trunk/docs/SegmentedStacks.rst
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/SegmentedStacks.rst?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/docs/SegmentedStacks.rst (original)
> +++ llvm/trunk/docs/SegmentedStacks.rst Thu Apr 10 17:58:43 2014
> @@ -13,9 +13,8 @@ monolithic chunk (of some worst case siz
> done by allocating stack blocks (henceforth called *stacklets*) and linking them
> into a doubly linked list. The function prologue is responsible for checking if
> the current stacklet has enough space for the function to execute; and if not,
> -call into the libgcc runtime to allocate more stack space. When using ``llc``,
> -segmented stacks can be enabled by adding ``-segmented-stacks`` to the command
> -line.
> +call into the libgcc runtime to allocate more stack space. Segmented stacks are
> +enabled with the ``"split-stack"`` attribute on LLVM functions.
>
> The runtime functionality is `already there in libgcc
> <http://gcc.gnu.org/wiki/SplitStacks>`_.
>
> Modified: llvm/trunk/include/llvm/CodeGen/CommandFlags.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/CommandFlags.h?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h Thu Apr 10 17:58:43 2014
> @@ -190,11 +190,6 @@ EnablePIE("enable-pie",
> cl::init(false));
>
> cl::opt<bool>
> -SegmentedStacks("segmented-stacks",
> - cl::desc("Use segmented stacks if possible."),
> - cl::init(false));
> -
> -cl::opt<bool>
> UseInitArray("use-init-array",
> cl::desc("Use .init_array instead of .ctors."),
> cl::init(false));
> @@ -229,7 +224,6 @@ static inline TargetOptions InitTargetOp
> Options.StackAlignmentOverride = OverrideStackAlignment;
> Options.TrapFuncName = TrapFuncName;
> Options.PositionIndependentExecutable = EnablePIE;
> - Options.EnableSegmentedStacks = SegmentedStacks;
> Options.UseInitArray = UseInitArray;
> return Options;
> }
>
> Modified: llvm/trunk/include/llvm/CodeGen/MachineFunction.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFunction.h?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/MachineFunction.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/MachineFunction.h Thu Apr 10 17:58:43 2014
> @@ -259,6 +259,9 @@ public:
> return MBBNumbering[N];
> }
>
> + /// Should we be emitting segmented stack stuff for the function
> + bool shouldSplitStack();
> +
> /// getNumBlockIDs - Return the number of MBB ID's allocated.
> ///
> unsigned getNumBlockIDs() const { return (unsigned)MBBNumbering.size(); }
>
> Modified: llvm/trunk/include/llvm/Target/TargetOptions.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetOptions.h?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetOptions.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetOptions.h Thu Apr 10 17:58:43 2014
> @@ -49,7 +49,7 @@ namespace llvm {
> JITEmitDebugInfoToDisk(false), GuaranteedTailCallOpt(false),
> DisableTailCalls(false), StackAlignmentOverride(0),
> EnableFastISel(false), PositionIndependentExecutable(false),
> - EnableSegmentedStacks(false), UseInitArray(false),
> + UseInitArray(false),
> DisableIntegratedAS(false), CompressDebugSections(false),
> TrapFuncName(""), FloatABIType(FloatABI::Default),
> AllowFPOpFusion(FPOpFusion::Standard) {}
> @@ -152,8 +152,6 @@ namespace llvm {
> /// if the relocation model is anything other than PIC.
> unsigned PositionIndependentExecutable : 1;
>
> - unsigned EnableSegmentedStacks : 1;
> -
> /// UseInitArray - Use .init_array instead of .ctors for static
> /// constructors.
> unsigned UseInitArray : 1;
> @@ -217,7 +215,6 @@ inline bool operator==(const TargetOptio
> ARE_EQUAL(StackAlignmentOverride) &&
> ARE_EQUAL(EnableFastISel) &&
> ARE_EQUAL(PositionIndependentExecutable) &&
> - ARE_EQUAL(EnableSegmentedStacks) &&
> ARE_EQUAL(UseInitArray) &&
> ARE_EQUAL(TrapFuncName) &&
> ARE_EQUAL(FloatABIType) &&
>
> Modified: llvm/trunk/lib/CodeGen/MachineFunction.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunction.cpp?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Thu Apr 10 17:58:43 2014
> @@ -123,6 +123,11 @@ getOrCreateJumpTableInfo(unsigned EntryK
> return JumpTableInfo;
> }
>
> +/// Should we be emitting segmented stack stuff for the function
> +bool MachineFunction::shouldSplitStack() {
> + return getFunction()->hasFnAttribute("split-stack");
> +}
> +
> /// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
> /// recomputes them. This guarantees that the MBB numbers are sequential,
> /// dense, and match the ordering of the blocks within the function. If a
>
> Modified: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp Thu Apr 10 17:58:43 2014
> @@ -680,7 +680,7 @@ void PEI::insertPrologEpilogCode(Machine
> // we've been asked for it. This, when linked with a runtime with support
> // for segmented stacks (libgcc is one), will result in allocating stack
> // space in small chunks instead of one large contiguous block.
> - if (Fn.getTarget().Options.EnableSegmentedStacks)
> + if (Fn.shouldSplitStack())
> TFI.adjustForSegmentedStacks(Fn);
>
> // Emit additional code that is required to explicitly handle the stack in
>
> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Thu Apr 10 17:58:43 2014
> @@ -140,7 +140,6 @@ void LTOCodeGenerator::setTargetOptions(
> Options.StackAlignmentOverride = options.StackAlignmentOverride;
> Options.TrapFuncName = options.TrapFuncName;
> Options.PositionIndependentExecutable = options.PositionIndependentExecutable;
> - Options.EnableSegmentedStacks = options.EnableSegmentedStacks;
> Options.UseInitArray = options.UseInitArray;
> }
>
>
> Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Thu Apr 10 17:58:43 2014
> @@ -446,7 +446,7 @@ void X86FrameLowering::emitPrologue(Mach
> !MFI->adjustsStack() && // No calls.
> !IsWin64 && // Win64 has no Red Zone
> !usesTheStack(MF) && // Don't push and pop.
> - !MF.getTarget().Options.EnableSegmentedStacks) { // Regular stack
> + !MF.shouldSplitStack()) { // Regular stack
> uint64_t MinSize = X86FI->getCalleeSavedFrameSize();
> if (HasFP) MinSize += SlotSize;
> StackSize = std::max(MinSize, StackSize > 128 ? StackSize - 128 : 0);
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Apr 10 17:58:43 2014
> @@ -635,15 +635,8 @@ void X86TargetLowering::resetOperationAc
> setOperationAction(ISD::STACKSAVE, MVT::Other, Expand);
> setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
>
> - if (Subtarget->isOSWindows() && !Subtarget->isTargetMacho())
> - setOperationAction(ISD::DYNAMIC_STACKALLOC, Subtarget->is64Bit() ?
> - MVT::i64 : MVT::i32, Custom);
> - else if (TM.Options.EnableSegmentedStacks)
> - setOperationAction(ISD::DYNAMIC_STACKALLOC, Subtarget->is64Bit() ?
> - MVT::i64 : MVT::i32, Custom);
> - else
> - setOperationAction(ISD::DYNAMIC_STACKALLOC, Subtarget->is64Bit() ?
> - MVT::i64 : MVT::i32, Expand);
> + setOperationAction(ISD::DYNAMIC_STACKALLOC, Subtarget->is64Bit() ?
> + MVT::i64 : MVT::i32, Custom);
>
> if (!TM.Options.UseSoftFloat && X86ScalarSSEf64) {
> // f32 and f64 use SSE.
> @@ -11102,12 +11095,49 @@ SDValue X86TargetLowering::LowerBRCOND(S
> SDValue
> X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
> SelectionDAG &DAG) const {
> - assert((Subtarget->isOSWindows() ||
> - getTargetMachine().Options.EnableSegmentedStacks) &&
> - "This should be used only on Windows targets or when segmented stacks "
> - "are being used");
> - assert(!Subtarget->isTargetMacho() && "Not implemented");
> - SDLoc dl(Op);
> + MachineFunction &MF = DAG.getMachineFunction();
> + bool SplitStack = MF.shouldSplitStack();
> + bool Lower = (Subtarget->isOSWindows() && !Subtarget->isTargetMacho()) ||
> + SplitStack;
> + SDLoc dl(Op);
> +
> + if (!Lower) {
> + const TargetLowering &TLI = DAG.getTargetLoweringInfo();
> + SDNode* Node = Op.getNode();
> +
> + unsigned SPReg = TLI.getStackPointerRegisterToSaveRestore();
> + assert(SPReg && "Target cannot require DYNAMIC_STACKALLOC expansion and"
> + " not tell us which reg is the stack pointer!");
> + EVT VT = Node->getValueType(0);
> + SDValue Tmp1 = SDValue(Node, 0);
> + SDValue Tmp2 = SDValue(Node, 1);
> + SDValue Tmp3 = Node->getOperand(2);
> + SDValue Chain = Tmp1.getOperand(0);
> +
> + // Chain the dynamic stack allocation so that it doesn't modify the stack
> + // pointer when other instructions are using the stack.
> + Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, true),
> + SDLoc(Node));
> +
> + SDValue Size = Tmp2.getOperand(1);
> + SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
> + Chain = SP.getValue(1);
> + unsigned Align = cast<ConstantSDNode>(Tmp3)->getZExtValue();
> + const TargetFrameLowering &TFI = *getTargetMachine().getFrameLowering();
> + unsigned StackAlign = TFI.getStackAlignment();
> + Tmp1 = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value
> + if (Align > StackAlign)
> + Tmp1 = DAG.getNode(ISD::AND, dl, VT, Tmp1,
> + DAG.getConstant(-(uint64_t)Align, VT));
> + Chain = DAG.getCopyToReg(Chain, dl, SPReg, Tmp1); // Output chain
> +
> + Tmp2 = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, true),
> + DAG.getIntPtrConstant(0, true), SDValue(),
> + SDLoc(Node));
> +
> + SDValue Ops[2] = { Tmp1, Tmp2 };
> + return DAG.getMergeValues(Ops, 2, dl);
> + }
>
> // Get the inputs.
> SDValue Chain = Op.getOperand(0);
> @@ -11118,8 +11148,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALL
> bool Is64Bit = Subtarget->is64Bit();
> EVT SPTy = Is64Bit ? MVT::i64 : MVT::i32;
>
> - if (getTargetMachine().Options.EnableSegmentedStacks) {
> - MachineFunction &MF = DAG.getMachineFunction();
> + if (SplitStack) {
> MachineRegisterInfo &MRI = MF.getRegInfo();
>
> if (Is64Bit) {
> @@ -15796,7 +15825,7 @@ X86TargetLowering::EmitLoweredSegAlloca(
> MachineFunction *MF = BB->getParent();
> const BasicBlock *LLVM_BB = BB->getBasicBlock();
>
> - assert(getTargetMachine().Options.EnableSegmentedStacks);
> + assert(MF->shouldSplitStack());
>
> unsigned TlsReg = Is64Bit ? X86::FS : X86::GS;
> unsigned TlsOffset = Is64Bit ? 0x70 : 0x30;
>
> Modified: llvm/trunk/test/CodeGen/ARM/debug-segmented-stacks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-segmented-stacks.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/debug-segmented-stacks.ll (original)
> +++ llvm/trunk/test/CodeGen/ARM/debug-segmented-stacks.ll Thu Apr 10 17:58:43 2014
> @@ -1,11 +1,11 @@
> -; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs -filetype=asm | FileCheck %s -check-prefix=ARM-linux
> -; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -verify-machineinstrs -filetype=asm | FileCheck %s -check-prefix=ARM-linux
> +; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj
>
> !llvm.dbg.cu = !{!0}
> !llvm.module.flags = !{!9, !10}
> !llvm.ident = !{!11}
>
> -define void @test_basic() {
> +define void @test_basic() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -78,3 +78,5 @@ define void @test_basic() {
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/ARM/segmented-stacks-dynamic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/segmented-stacks-dynamic.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/segmented-stacks-dynamic.ll (original)
> +++ llvm/trunk/test/CodeGen/ARM/segmented-stacks-dynamic.ll Thu Apr 10 17:58:43 2014
> @@ -1,12 +1,12 @@
> -; RUN: llc < %s -mtriple=arm-linux-androideabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android
> -; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux
> -; RUN: llc < %s -mtriple=arm-linux-androideabi -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mtriple=arm-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android
> +; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux
> +; RUN: llc < %s -mtriple=arm-linux-androideabi -filetype=obj
> +; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define i32 @test_basic(i32 %l) {
> +define i32 @test_basic(i32 %l) #0 {
> %mem = alloca i32, i32 %l
> call void @dummy_use (i32* %mem, i32 %l)
> %terminate = icmp eq i32 %l, 0
> @@ -60,3 +60,5 @@ false:
> ; ARM-android: pop {r4, r5}
>
> }
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/ARM/segmented-stacks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/segmented-stacks.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/segmented-stacks.ll (original)
> +++ llvm/trunk/test/CodeGen/ARM/segmented-stacks.ll Thu Apr 10 17:58:43 2014
> @@ -1,15 +1,15 @@
> -; RUN: llc < %s -mtriple=arm-linux-androideabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android
> -; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux
> +; RUN: llc < %s -mtriple=arm-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android
> +; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux
>
> ; We used to crash with filetype=obj
> -; RUN: llc < %s -mtriple=arm-linux-androideabi -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mtriple=arm-linux-androideabi -filetype=obj
> +; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj
>
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define void @test_basic() {
> +define void @test_basic() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -54,7 +54,7 @@ define void @test_basic() {
>
> }
>
> -define i32 @test_nested(i32 * nest %closure, i32 %other) {
> +define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
> %addend = load i32 * %closure
> %result = add i32 %other, %addend
> ret i32 %result
> @@ -99,7 +99,7 @@ define i32 @test_nested(i32 * nest %clos
>
> }
>
> -define void @test_large() {
> +define void @test_large() #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 0)
> ret void
> @@ -144,7 +144,7 @@ define void @test_large() {
>
> }
>
> -define fastcc void @test_fastcc() {
> +define fastcc void @test_fastcc() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -189,7 +189,7 @@ define fastcc void @test_fastcc() {
>
> }
>
> -define fastcc void @test_fastcc_large() {
> +define fastcc void @test_fastcc_large() #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 0)
> ret void
> @@ -233,3 +233,5 @@ define fastcc void @test_fastcc_large()
> ; ARM-android: pop {r4, r5}
>
> }
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/Thumb/segmented-stacks-dynamic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/segmented-stacks-dynamic.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Thumb/segmented-stacks-dynamic.ll (original)
> +++ llvm/trunk/test/CodeGen/Thumb/segmented-stacks-dynamic.ll Thu Apr 10 17:58:43 2014
> @@ -1,12 +1,12 @@
> -; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux
> -; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
> -; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux
> +; RUN: llc < %s -mtriple=thumb-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
> +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -filetype=obj
> +; RUN: llc < %s -mtriple=thumb-linux-androideabi -filetype=obj
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define i32 @test_basic(i32 %l) {
> +define i32 @test_basic(i32 %l) #0 {
> %mem = alloca i32, i32 %l
> call void @dummy_use (i32* %mem, i32 %l)
> %terminate = icmp eq i32 %l, 0
> @@ -61,3 +61,5 @@ false:
> ; Thumb-android: pop {r4, r5}
>
> }
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/Thumb/segmented-stacks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/segmented-stacks.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Thumb/segmented-stacks.ll (original)
> +++ llvm/trunk/test/CodeGen/Thumb/segmented-stacks.ll Thu Apr 10 17:58:43 2014
> @@ -1,13 +1,13 @@
> -; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
> -; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux
> -; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mtriple=thumb-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
> +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux
> +; RUN: llc < %s -mtriple=thumb-linux-androideabi -filetype=obj
> +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -filetype=obj
>
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define void @test_basic() {
> +define void @test_basic() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -54,7 +54,7 @@ define void @test_basic() {
>
> }
>
> -define i32 @test_nested(i32 * nest %closure, i32 %other) {
> +define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
> %addend = load i32 * %closure
> %result = add i32 %other, %addend
> ret i32 %result
> @@ -101,7 +101,7 @@ define i32 @test_nested(i32 * nest %clos
>
> }
>
> -define void @test_large() {
> +define void @test_large() #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 0)
> ret void
> @@ -150,7 +150,7 @@ define void @test_large() {
>
> }
>
> -define fastcc void @test_fastcc() {
> +define fastcc void @test_fastcc() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -197,7 +197,7 @@ define fastcc void @test_fastcc() {
>
> }
>
> -define fastcc void @test_fastcc_large() {
> +define fastcc void @test_fastcc_large() #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 0)
> ret void
> @@ -245,3 +245,5 @@ define fastcc void @test_fastcc_large()
> ; Thumb-linux: pop {r4, r5}
>
> }
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/Thumb2/segmented-stacks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/segmented-stacks.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Thumb2/segmented-stacks.ll (original)
> +++ llvm/trunk/test/CodeGen/Thumb2/segmented-stacks.ll Thu Apr 10 17:58:43 2014
> @@ -1,11 +1,11 @@
> -; RUN: llc < %s -mtriple=thumb-linux-androideabi -march=thumb -mcpu=arm1156t2-s -mattr=+thumb2 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
> -; RUN: llc < %s -mtriple=thumb-linux-androideabi -march=thumb -mcpu=arm1156t2-s -mattr=+thumb2 -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mtriple=thumb-linux-androideabi -march=thumb -mcpu=arm1156t2-s -mattr=+thumb2 -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
> +; RUN: llc < %s -mtriple=thumb-linux-androideabi -march=thumb -mcpu=arm1156t2-s -mattr=+thumb2 -filetype=obj
>
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define void @test_basic() {
> +define void @test_basic() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -30,3 +30,5 @@ define void @test_basic() {
> ; Thumb-android: pop {r4, r5}
>
> }
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/X86/segmented-stacks-dynamic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/segmented-stacks-dynamic.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/segmented-stacks-dynamic.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/segmented-stacks-dynamic.ll Thu Apr 10 17:58:43 2014
> @@ -1,12 +1,12 @@
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -verify-machineinstrs | FileCheck %s -check-prefix=X64
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj
>
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define i32 @test_basic(i32 %l) {
> +define i32 @test_basic(i32 %l) #0 {
> %mem = alloca i32, i32 %l
> call void @dummy_use (i32* %mem, i32 %l)
> %terminate = icmp eq i32 %l, 0
> @@ -62,3 +62,5 @@ false:
> ; X64: movq %rax, %rdi
>
> }
> +
> +attributes #0 = { "split-stack" }
>
> Modified: llvm/trunk/test/CodeGen/X86/segmented-stacks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/segmented-stacks.ll?rev=205997&r1=205996&r2=205997&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/segmented-stacks.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/segmented-stacks.ll Thu Apr 10 17:58:43 2014
> @@ -1,23 +1,23 @@
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Darwin
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-MinGW
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X32-Darwin
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X64-MinGW
>
> ; We used to crash with filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -segmented-stacks -filetype=obj
> -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -segmented-stacks -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -filetype=obj
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -filetype=obj
>
> -; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-solaris -segmented-stacks 2> %t.log
> +; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-solaris 2> %t.log
> ; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-Solaris
> -; RUN: not llc < %s -mcpu=generic -mtriple=i686-freebsd -segmented-stacks 2> %t.log
> +; RUN: not llc < %s -mcpu=generic -mtriple=i686-freebsd 2> %t.log
> ; RUN: FileCheck %s -input-file=%t.log -check-prefix=X32-FreeBSD
>
> ; X64-Solaris: Segmented stacks not supported on this platform
> @@ -26,7 +26,7 @@
> ; Just to prevent the alloca from being optimized away
> declare void @dummy_use(i32*, i32)
>
> -define void @test_basic() {
> +define void @test_basic() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -104,7 +104,7 @@ define void @test_basic() {
>
> }
>
> -define i32 @test_nested(i32 * nest %closure, i32 %other) {
> +define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
> %addend = load i32 * %closure
> %result = add i32 %other, %addend
> ret i32 %result
> @@ -177,7 +177,7 @@ define i32 @test_nested(i32 * nest %clos
>
> }
>
> -define void @test_large() {
> +define void @test_large() #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 0)
> ret void
> @@ -249,7 +249,7 @@ define void @test_large() {
>
> }
>
> -define fastcc void @test_fastcc() {
> +define fastcc void @test_fastcc() #0 {
> %mem = alloca i32, i32 10
> call void @dummy_use (i32* %mem, i32 10)
> ret void
> @@ -327,7 +327,7 @@ define fastcc void @test_fastcc() {
>
> }
>
> -define fastcc void @test_fastcc_large() {
> +define fastcc void @test_fastcc_large() #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 0)
> ret void
> @@ -412,7 +412,7 @@ define fastcc void @test_fastcc_large()
>
> }
>
> -define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) {
> +define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) #0 {
> %mem = alloca i32, i32 10000
> call void @dummy_use (i32* %mem, i32 %a)
> ret void
> @@ -434,3 +434,5 @@ define fastcc void @test_fastcc_large_wi
> ; X32-Darwin-NEXT: ret
>
> }
> +
> +attributes #0 = { "split-stack" }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list