forked from OSchip/llvm-project
Use function attribute "stackrealign" to decide whether stack
realignment should be forced. With this commit, we can now force stack realignment when doing LTO and do so on a per-function basis. Also, add a new cl::opt option "stackrealign" to CommandFlags.h which is used to force stack realignment via llc's command line. Out-of-tree projects currently using -force-align-stack to force stack realignment should make changes to attach the attribute to the functions in the IR. Differential Revision: http://reviews.llvm.org/D11814 llvm-svn: 247450
This commit is contained in:
parent
660195a792
commit
bc497c93f5
|
@ -182,6 +182,11 @@ OverrideStackAlignment("stack-alignment",
|
||||||
cl::desc("Override default stack alignment"),
|
cl::desc("Override default stack alignment"),
|
||||||
cl::init(0));
|
cl::init(0));
|
||||||
|
|
||||||
|
cl::opt<bool>
|
||||||
|
StackRealign("stackrealign",
|
||||||
|
cl::desc("Force align the stack to the minimum alignment"),
|
||||||
|
cl::init(false));
|
||||||
|
|
||||||
cl::opt<std::string>
|
cl::opt<std::string>
|
||||||
TrapFuncName("trap-func", cl::Hidden,
|
TrapFuncName("trap-func", cl::Hidden,
|
||||||
cl::desc("Emit a call to trap function rather than a trap instruction"),
|
cl::desc("Emit a call to trap function rather than a trap instruction"),
|
||||||
|
@ -330,6 +335,10 @@ static inline void setFunctionAttributes(StringRef CPU, StringRef Features,
|
||||||
"disable-tail-calls",
|
"disable-tail-calls",
|
||||||
toStringRef(DisableTailCalls));
|
toStringRef(DisableTailCalls));
|
||||||
|
|
||||||
|
if (StackRealign)
|
||||||
|
NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex,
|
||||||
|
"stackrealign");
|
||||||
|
|
||||||
if (TrapFuncName.getNumOccurrences() > 0)
|
if (TrapFuncName.getNumOccurrences() > 0)
|
||||||
for (auto &B : F)
|
for (auto &B : F)
|
||||||
for (auto &I : B)
|
for (auto &I : B)
|
||||||
|
|
|
@ -35,8 +35,6 @@ class VirtRegMap;
|
||||||
class raw_ostream;
|
class raw_ostream;
|
||||||
class LiveRegMatrix;
|
class LiveRegMatrix;
|
||||||
|
|
||||||
extern cl::opt<bool> ForceStackAlign;
|
|
||||||
|
|
||||||
class TargetRegisterClass {
|
class TargetRegisterClass {
|
||||||
public:
|
public:
|
||||||
typedef const MCPhysReg* iterator;
|
typedef const MCPhysReg* iterator;
|
||||||
|
|
|
@ -24,14 +24,6 @@
|
||||||
|
|
||||||
#define DEBUG_TYPE "target-reg-info"
|
#define DEBUG_TYPE "target-reg-info"
|
||||||
|
|
||||||
namespace llvm {
|
|
||||||
cl::opt<bool>
|
|
||||||
ForceStackAlign("force-align-stack",
|
|
||||||
cl::desc("Force align the stack to the minimum alignment"
|
|
||||||
" needed for the function."),
|
|
||||||
cl::init(false), cl::Hidden);
|
|
||||||
} // end namespace llvm
|
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
|
TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
|
||||||
|
@ -321,7 +313,7 @@ bool TargetRegisterInfo::needsStackRealignment(
|
||||||
unsigned StackAlign = TFI->getStackAlignment();
|
unsigned StackAlign = TFI->getStackAlignment();
|
||||||
bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
|
bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
|
||||||
F->hasFnAttribute(Attribute::StackAlignment));
|
F->hasFnAttribute(Attribute::StackAlignment));
|
||||||
if (ForceStackAlign || requiresRealignment) {
|
if (MF.getFunction()->hasFnAttribute("stackrealign") || requiresRealignment) {
|
||||||
if (canRealignStack(MF))
|
if (canRealignStack(MF))
|
||||||
return true;
|
return true;
|
||||||
DEBUG(dbgs() << "Can't realign function's stack: " << F->getName() << "\n");
|
DEBUG(dbgs() << "Can't realign function's stack: " << F->getName() << "\n");
|
||||||
|
|
|
@ -499,7 +499,7 @@ uint64_t X86FrameLowering::calculateMaxStackAlign(const MachineFunction &MF) con
|
||||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||||
uint64_t MaxAlign = MFI->getMaxAlignment(); // Desired stack alignment.
|
uint64_t MaxAlign = MFI->getMaxAlignment(); // Desired stack alignment.
|
||||||
unsigned StackAlign = getStackAlignment();
|
unsigned StackAlign = getStackAlignment();
|
||||||
if (ForceStackAlign) {
|
if (MF.getFunction()->hasFnAttribute("stackrealign")) {
|
||||||
if (MFI->hasCalls())
|
if (MFI->hasCalls())
|
||||||
MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
|
MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
|
||||||
else if (MaxAlign < SlotSize)
|
else if (MaxAlign < SlotSize)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
; Check that stack alignment can be forced. Individual targets should test their
|
; Check that stack alignment can be forced. Individual targets should test their
|
||||||
; specific implementation details.
|
; specific implementation details.
|
||||||
|
|
||||||
; RUN: llc < %s -force-align-stack -stack-alignment=32 | FileCheck %s
|
; RUN: llc < %s -stackrealign -stack-alignment=32 | FileCheck %s
|
||||||
; CHECK-LABEL: @f
|
; CHECK-LABEL: @f
|
||||||
; CHECK-LABEL: @g
|
; CHECK-LABEL: @g
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
; RUN: llc < %s -mcpu=generic -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s
|
; RUN: llc < %s -mcpu=generic -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s
|
||||||
; RUN: llc < %s -mcpu=generic -force-align-stack -stack-alignment=32 -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s -check-prefix=FORCE-ALIGN
|
; RUN: llc < %s -mcpu=generic -stackrealign -stack-alignment=32 -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s -check-prefix=FORCE-ALIGN
|
||||||
; rdar://11496434
|
; rdar://11496434
|
||||||
|
|
||||||
; no VLAs or dynamic alignment
|
; no VLAs or dynamic alignment
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
; arbitrarily force alignment up to 32-bytes for i386 hoping that this will
|
; arbitrarily force alignment up to 32-bytes for i386 hoping that this will
|
||||||
; exceed any ABI provisions.
|
; exceed any ABI provisions.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mcpu=generic -force-align-stack -stack-alignment=32 | FileCheck %s
|
; RUN: llc < %s -mcpu=generic -stackrealign -stack-alignment=32 | FileCheck %s
|
||||||
|
|
||||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
|
||||||
target triple = "i386-unknown-linux-gnu"
|
target triple = "i386-unknown-linux-gnu"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; RUN: llc < %s -relocation-model=static -force-align-stack | FileCheck %s
|
; RUN: llc < %s -relocation-model=static -stackrealign | FileCheck %s
|
||||||
; Tests to make sure that we always align the stack out to the minimum needed -
|
; Tests to make sure that we always align the stack out to the minimum needed -
|
||||||
; in this case 16-bytes.
|
; in this case 16-bytes.
|
||||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; RUN: llc < %s -force-align-stack -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s
|
; RUN: llc < %s -stackrealign -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s
|
||||||
|
|
||||||
%struct.foo = type { [88 x i8] }
|
%struct.foo = type { [88 x i8] }
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
; RUN: llc < %s -mtriple=i686-windows | FileCheck %s -check-prefix=NORMAL
|
; RUN: llc < %s -mtriple=i686-windows | FileCheck %s -check-prefix=NORMAL
|
||||||
; RUN: llc < %s -mtriple=x86_64-windows | FileCheck %s -check-prefix=X64
|
; RUN: llc < %s -mtriple=x86_64-windows | FileCheck %s -check-prefix=X64
|
||||||
; RUN: llc < %s -mtriple=i686-windows -force-align-stack -stack-alignment=32 | FileCheck %s -check-prefix=ALIGNED
|
; RUN: llc < %s -mtriple=i686-windows -stackrealign -stack-alignment=32 | FileCheck %s -check-prefix=ALIGNED
|
||||||
|
|
||||||
%class.Class = type { i32 }
|
%class.Class = type { i32 }
|
||||||
%struct.s = type { i64 }
|
%struct.s = type { i64 }
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; RUN: llc < %s -force-align-stack -stack-alignment=32 -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s
|
; RUN: llc < %s -stackrealign -stack-alignment=32 -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s
|
||||||
; PR11468
|
; PR11468
|
||||||
|
|
||||||
define void @f(i64 %sz) uwtable {
|
define void @f(i64 %sz) uwtable {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; RUN: llc < %s -force-align-stack -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s
|
; RUN: llc < %s -stackrealign -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s
|
||||||
|
|
||||||
%struct.foo = type { [88 x i8] }
|
%struct.foo = type { [88 x i8] }
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stack-alignment=4 -relocation-model=pic < %s | FileCheck %s -check-prefix=UNALIGNED
|
; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stack-alignment=4 -relocation-model=pic < %s | FileCheck %s -check-prefix=UNALIGNED
|
||||||
; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stack-alignment=16 -relocation-model=pic < %s | FileCheck %s -check-prefix=ALIGNED
|
; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stack-alignment=16 -relocation-model=pic < %s | FileCheck %s -check-prefix=ALIGNED
|
||||||
; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stack-alignment=4 -force-align-stack -relocation-model=pic < %s | FileCheck %s -check-prefix=FORCEALIGNED
|
; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stack-alignment=4 -stackrealign -relocation-model=pic < %s | FileCheck %s -check-prefix=FORCEALIGNED
|
||||||
|
|
||||||
@arr = internal unnamed_addr global [32 x i32] zeroinitializer, align 16
|
@arr = internal unnamed_addr global [32 x i32] zeroinitializer, align 16
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
; RUN: llc -mtriple=x86_64-pc-linux -force-align-stack -stack-alignment=32 < %s | FileCheck %s
|
; RUN: llc -mtriple=x86_64-pc-linux -stackrealign -stack-alignment=32 < %s | FileCheck %s
|
||||||
; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -force-align-stack -stack-alignment=32 < %s | FileCheck -check-prefix=X32ABI %s
|
; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -stackrealign -stack-alignment=32 < %s | FileCheck -check-prefix=X32ABI %s
|
||||||
; This should run with NaCl as well ( -mtriple=x86_64-pc-nacl ) but currently doesn't due to PR22655
|
; This should run with NaCl as well ( -mtriple=x86_64-pc-nacl ) but currently doesn't due to PR22655
|
||||||
|
|
||||||
; Make sure the correct register gets set up as the base pointer
|
; Make sure the correct register gets set up as the base pointer
|
||||||
|
|
Loading…
Reference in New Issue