From 433c8d950cb3a1fa0977355ce0367e8c763a3f13 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Tue, 8 Jun 2021 08:22:48 -0700 Subject: [PATCH] [IR] make -stack-alignment= into a module attr Similar to D102742, specifying the stack alignment via CodegenOpts means that this flag gets dropped during LTO, unless the command line is re-specified as a plugin opt. Instead, encode this information as a module level attribute so that we don't have to expose this llvm internal flag when linking the Linux kernel with LTO. Looks like external dependencies might need a fix: * https://github.com/llvm-hs/llvm-hs/issues/345 * https://github.com/halide/Halide/issues/6079 Link: https://github.com/ClangBuiltLinux/linux/issues/1377 Reviewed By: tejohnson Differential Revision: https://reviews.llvm.org/D103048 --- clang/lib/CodeGen/BackendUtil.cpp | 1 - clang/lib/CodeGen/CodeGenModule.cpp | 2 + clang/test/CodeGen/stackrealign-main.c | 3 ++ llvm/include/llvm/IR/Module.h | 4 ++ llvm/include/llvm/Target/TargetOptions.h | 3 -- llvm/lib/CodeGen/CommandFlags.cpp | 7 --- llvm/lib/IR/Module.cpp | 11 ++++ llvm/lib/Target/X86/X86TargetMachine.cpp | 4 +- llvm/test/CodeGen/Generic/ForceStackAlign.ll | 5 +- .../CodeGen/X86/base-pointer-and-cmpxchg.ll | 10 ++-- .../CodeGen/X86/base-pointer-and-mwaitx.ll | 15 ++++-- .../X86/dynamic-allocas-VLAs-stack-align.ll | 46 ++++++++++++++++ llvm/test/CodeGen/X86/dynamic-allocas-VLAs.ll | 42 --------------- .../CodeGen/X86/force-align-stack-alloca.ll | 5 +- llvm/test/CodeGen/X86/hipe-cc.ll | 5 +- llvm/test/CodeGen/X86/hipe-cc64.ll | 4 +- .../test/CodeGen/X86/movtopush-stack-align.ll | 52 +++++++++++++++++++ llvm/test/CodeGen/X86/movtopush.ll | 45 ---------------- llvm/test/CodeGen/X86/pr11468.ll | 5 +- .../CodeGen/X86/unaligned-spill-folding.ll | 15 ++++-- llvm/test/CodeGen/X86/x86-64-baseptr.ll | 6 ++- .../CodeGen/X86/x86-64-xmm-spill-unaligned.ll | 4 +- llvm/test/Linker/stack-alignment.ll | 15 ++++++ 23 files changed, 189 insertions(+), 120 deletions(-) create mode 100644 llvm/test/CodeGen/X86/dynamic-allocas-VLAs-stack-align.ll create mode 100644 llvm/test/CodeGen/X86/movtopush-stack-align.ll create mode 100644 llvm/test/Linker/stack-alignment.ll diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index ca1067dbb79f..ad63ef63e5b1 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -530,7 +530,6 @@ static bool initTargetOptions(DiagnosticsEngine &Diags, Options.NoNaNsFPMath = LangOpts.NoHonorNaNs; Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS; Options.UnsafeFPMath = LangOpts.UnsafeFPMath; - Options.StackAlignmentOverride = CodeGenOpts.StackAlignment; Options.BBSections = llvm::StringSwitch(CodeGenOpts.BBSections) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 1f23ce7de52b..c93339a211f3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -785,6 +785,8 @@ void CodeGenModule::Release() { if (getCodeGenOpts().StackProtectorGuardOffset != INT_MAX) getModule().setStackProtectorGuardOffset( getCodeGenOpts().StackProtectorGuardOffset); + if (getCodeGenOpts().StackAlignment) + getModule().setOverrideStackAlignment(getCodeGenOpts().StackAlignment); getTargetCodeGenInfo().emitTargetMetadata(*this, MangledDeclNames); diff --git a/clang/test/CodeGen/stackrealign-main.c b/clang/test/CodeGen/stackrealign-main.c index bb1f473493be..29c3031c07ed 100644 --- a/clang/test/CodeGen/stackrealign-main.c +++ b/clang/test/CodeGen/stackrealign-main.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - -mstack-alignment=64 %s | FileCheck %s +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s --check-prefix=DEFAULT // CHECK-LABEL: define{{.*}} void @other() // CHECK: [[OTHER:#[0-9]+]] @@ -17,3 +18,5 @@ int main(int argc, char **argv) { // CHECK-NOT: "stackrealign" // CHECK: } // CHECK: attributes [[MAIN]] = { noinline nounwind optnone {{.*}}"stackrealign"{{.*}} } +// CHECK: !{i32 1, !"override-stack-alignment", i32 64} +// DEFAULT-NOT: "override-stack-alignment" diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 68e26c064538..81e29d9b86e8 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -909,6 +909,10 @@ public: int getStackProtectorGuardOffset() const; void setStackProtectorGuardOffset(int Offset); + /// Get/set the stack alignment overridden from the default. + unsigned getOverrideStackAlignment() const; + void setOverrideStackAlignment(unsigned Align); + /// @name Utility functions for querying and setting the build SDK version /// @{ diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h index 3b2290ab9ec5..5a9059626918 100644 --- a/llvm/include/llvm/Target/TargetOptions.h +++ b/llvm/include/llvm/Target/TargetOptions.h @@ -201,9 +201,6 @@ namespace llvm { /// as their parent function, etc.), using an alternate ABI if necessary. unsigned GuaranteedTailCallOpt : 1; - /// StackAlignmentOverride - Override default stack alignment for target. - unsigned StackAlignmentOverride = 0; - /// StackSymbolOrdering - When true, this will allow CodeGen to order /// the local stack symbols (for code size, code locality, or any other /// heuristics). When false, the local symbols are left in whatever order diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp index a7f6ca4c69f0..f3cba6225107 100644 --- a/llvm/lib/CodeGen/CommandFlags.cpp +++ b/llvm/lib/CodeGen/CommandFlags.cpp @@ -69,7 +69,6 @@ CGOPT(bool, DontPlaceZerosInBSS) CGOPT(bool, EnableGuaranteedTailCallOpt) CGOPT(bool, DisableTailCalls) CGOPT(bool, StackSymbolOrdering) -CGOPT(unsigned, OverrideStackAlignment) CGOPT(bool, StackRealign) CGOPT(std::string, TrapFuncName) CGOPT(bool, UseCtors) @@ -305,11 +304,6 @@ codegen::RegisterCodeGenFlags::RegisterCodeGenFlags() { cl::init(true)); CGBINDOPT(StackSymbolOrdering); - static cl::opt OverrideStackAlignment( - "stack-alignment", cl::desc("Override default stack alignment"), - cl::init(0)); - CGBINDOPT(OverrideStackAlignment); - static cl::opt StackRealign( "stackrealign", cl::desc("Force align the stack to the minimum alignment"), @@ -508,7 +502,6 @@ codegen::InitTargetOptionsFromCodeGenFlags(const Triple &TheTriple) { Options.EnableAIXExtendedAltivecABI = getEnableAIXExtendedAltivecABI(); Options.NoZerosInBSS = getDontPlaceZerosInBSS(); Options.GuaranteedTailCallOpt = getEnableGuaranteedTailCallOpt(); - Options.StackAlignmentOverride = getOverrideStackAlignment(); Options.StackSymbolOrdering = getStackSymbolOrdering(); Options.UseInitArray = !getUseCtors(); Options.RelaxELFRelocations = getRelaxELFRelocations(); diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index eae4e69e76f7..9b955500b618 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -721,6 +721,17 @@ void Module::setStackProtectorGuardOffset(int Offset) { addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-offset", Offset); } +unsigned Module::getOverrideStackAlignment() const { + Metadata *MD = getModuleFlag("override-stack-alignment"); + if (auto *CI = mdconst::dyn_extract_or_null(MD)) + return CI->getZExtValue(); + return 0; +} + +void Module::setOverrideStackAlignment(unsigned Align) { + addModuleFlag(ModFlagBehavior::Error, "override-stack-alignment", Align); +} + void Module::setSDKVersion(const VersionTuple &V) { SmallVector Entries; Entries.push_back(V.getMajor()); diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp index cb69169259c1..ee8cff3e008b 100644 --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -314,8 +314,8 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const { resetTargetOptions(F); I = std::make_unique( TargetTriple, CPU, TuneCPU, FS, *this, - MaybeAlign(Options.StackAlignmentOverride), PreferVectorWidthOverride, - RequiredVectorWidth); + MaybeAlign(F.getParent()->getOverrideStackAlignment()), + PreferVectorWidthOverride, RequiredVectorWidth); } return I.get(); } diff --git a/llvm/test/CodeGen/Generic/ForceStackAlign.ll b/llvm/test/CodeGen/Generic/ForceStackAlign.ll index 7eed8321308c..ece31d211ca3 100644 --- a/llvm/test/CodeGen/Generic/ForceStackAlign.ll +++ b/llvm/test/CodeGen/Generic/ForceStackAlign.ll @@ -1,7 +1,7 @@ ; Check that stack alignment can be forced. Individual targets should test their ; specific implementation details. -; RUN: llc < %s -stackrealign -stack-alignment=32 | FileCheck %s +; RUN: llc < %s -stackrealign | FileCheck %s ; CHECK-LABEL: @f ; CHECK-LABEL: @g @@ -25,3 +25,6 @@ if.then: } declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i1) nounwind + +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/base-pointer-and-cmpxchg.ll b/llvm/test/CodeGen/X86/base-pointer-and-cmpxchg.ll index a79509b039ac..ce694581a1d6 100644 --- a/llvm/test/CodeGen/X86/base-pointer-and-cmpxchg.ll +++ b/llvm/test/CodeGen/X86/base-pointer-and-cmpxchg.ll @@ -1,7 +1,7 @@ -; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+cx16 -x86-use-base-pointer=true -stackrealign -stack-alignment=32 %s -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE --check-prefix=USE_BASE_64 %s -; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+cx16 -x86-use-base-pointer=false -stackrealign -stack-alignment=32 %s -o - | FileCheck --check-prefix=CHECK --check-prefix=DONT_USE_BASE %s -; RUN: llc -mtriple=x86_64-linux-gnux32 -mattr=+cx16 -x86-use-base-pointer=true -stackrealign -stack-alignment=32 %s -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE --check-prefix=USE_BASE_32 %s -; RUN: llc -mtriple=x86_64-linux-gnux32 -mattr=+cx16 -x86-use-base-pointer=false -stackrealign -stack-alignment=32 %s -o - | FileCheck --check-prefix=CHECK --check-prefix=DONT_USE_BASE %s +; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+cx16 -x86-use-base-pointer=true -stackrealign %s -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE --check-prefix=USE_BASE_64 %s +; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+cx16 -x86-use-base-pointer=false -stackrealign %s -o - | FileCheck --check-prefix=CHECK --check-prefix=DONT_USE_BASE %s +; RUN: llc -mtriple=x86_64-linux-gnux32 -mattr=+cx16 -x86-use-base-pointer=true -stackrealign %s -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE --check-prefix=USE_BASE_32 %s +; RUN: llc -mtriple=x86_64-linux-gnux32 -mattr=+cx16 -x86-use-base-pointer=false -stackrealign %s -o - | FileCheck --check-prefix=CHECK --check-prefix=DONT_USE_BASE %s ; This function uses dynamic allocated stack to force the use ; of a frame pointer. @@ -49,3 +49,5 @@ tail call void asm sideeffect "nop", "~{rax},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp}, store i32 %n, i32* %idx ret i1 %res } +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/base-pointer-and-mwaitx.ll b/llvm/test/CodeGen/X86/base-pointer-and-mwaitx.ll index 55fd730375e2..a66f1a1d0980 100644 --- a/llvm/test/CodeGen/X86/base-pointer-and-mwaitx.ll +++ b/llvm/test/CodeGen/X86/base-pointer-and-mwaitx.ll @@ -1,7 +1,11 @@ -; RUN: llc -mtriple=x86_64-pc-linux-gnu -mattr=+mwaitx -x86-use-base-pointer=true -stackrealign -stack-alignment=32 %s -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE_64 %s -; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -mattr=+mwaitx -x86-use-base-pointer=true -stackrealign -stack-alignment=32 %s -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE_32 %s -; RUN: llc -mtriple=x86_64-pc-linux-gnu -mattr=+mwaitx -x86-use-base-pointer=true %s -o - | FileCheck --check-prefix=CHECK --check-prefix=NO_BASE_64 %s -; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -mattr=+mwaitx -x86-use-base-pointer=true %s -o - | FileCheck --check-prefix=CHECK --check-prefix=NO_BASE_32 %s +; RUN: split-file %s %t +; RUN: cat %t/main.ll %t/_align32.ll > %t/align32.ll +; RUN: llc -mtriple=x86_64-pc-linux-gnu -mattr=+mwaitx -x86-use-base-pointer=true -stackrealign %t/align32.ll -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE_64 %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -mattr=+mwaitx -x86-use-base-pointer=true -stackrealign %t/align32.ll -o - | FileCheck --check-prefix=CHECK --check-prefix=USE_BASE_32 %s +; RUN: llc -mtriple=x86_64-pc-linux-gnu -mattr=+mwaitx -x86-use-base-pointer=true %t/main.ll -o - | FileCheck --check-prefix=CHECK --check-prefix=NO_BASE_64 %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -mattr=+mwaitx -x86-use-base-pointer=true %t/main.ll -o - | FileCheck --check-prefix=CHECK --check-prefix=NO_BASE_32 %s + +;--- main.ll ; This test checks that we save and restore the base pointer (ebx or rbx) in the ; presence of the mwaitx intrinsic which requires to use ebx for one of its @@ -208,3 +212,6 @@ if.end: ; NO_BASE_32-NEXT: {{.+$}} declare void @llvm.x86.mwaitx(i32, i32, i32) nounwind +;--- _align32.ll +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/dynamic-allocas-VLAs-stack-align.ll b/llvm/test/CodeGen/X86/dynamic-allocas-VLAs-stack-align.ll new file mode 100644 index 000000000000..2299cf604f9f --- /dev/null +++ b/llvm/test/CodeGen/X86/dynamic-allocas-VLAs-stack-align.ll @@ -0,0 +1,46 @@ +; RUN: llc < %s -stack-symbol-ordering=0 -mcpu=generic -stackrealign -mattr=+avx -mtriple=x86_64-apple-darwin10 | FileCheck %s +; rdar://11496434 +declare void @t1_helper(i32*) +declare void @t3_helper(i32*, i32*) + +; Test when forcing stack alignment +define i32 @t8() nounwind uwtable { +entry: + %a = alloca i32, align 4 + call void @t1_helper(i32* %a) nounwind + %0 = load i32, i32* %a, align 4 + %add = add nsw i32 %0, 13 + ret i32 %add + +; CHECK: _t8 +; CHECK: movq %rsp, %rbp +; CHECK: andq $-32, %rsp +; CHECK-NEXT: subq $32, %rsp +; CHECK: movq %rbp, %rsp +; CHECK: popq %rbp +} + +; VLAs +define i32 @t9(i64 %sz) nounwind uwtable { +entry: + %a = alloca i32, align 4 + %vla = alloca i32, i64 %sz, align 16 + call void @t3_helper(i32* %a, i32* %vla) nounwind + %0 = load i32, i32* %a, align 4 + %add = add nsw i32 %0, 13 + ret i32 %add + +; CHECK: _t9 +; CHECK: pushq %rbp +; CHECK: movq %rsp, %rbp +; CHECK: pushq %rbx +; CHECK: andq $-32, %rsp +; CHECK: subq $32, %rsp +; CHECK: movq %rsp, %rbx + +; CHECK: leaq -8(%rbp), %rsp +; CHECK: popq %rbx +; CHECK: popq %rbp +} +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/dynamic-allocas-VLAs.ll b/llvm/test/CodeGen/X86/dynamic-allocas-VLAs.ll index cf5e2f7537cb..8f5427cbe2c1 100644 --- a/llvm/test/CodeGen/X86/dynamic-allocas-VLAs.ll +++ b/llvm/test/CodeGen/X86/dynamic-allocas-VLAs.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -stack-symbol-ordering=0 -mcpu=generic -mattr=+avx -mtriple=x86_64-apple-darwin10 | FileCheck %s -; RUN: llc < %s -stack-symbol-ordering=0 -mcpu=generic -stackrealign -stack-alignment=32 -mattr=+avx -mtriple=x86_64-apple-darwin10 | FileCheck %s -check-prefix=FORCE-ALIGN ; rdar://11496434 ; no VLAs or dynamic alignment @@ -184,44 +183,3 @@ declare i8* @llvm.stacksave() nounwind declare void @bar(i32, i32*, %struct.struct_t* byval(%struct.struct_t) align 8) declare void @llvm.stackrestore(i8*) nounwind - - -; Test when forcing stack alignment -define i32 @t8() nounwind uwtable { -entry: - %a = alloca i32, align 4 - call void @t1_helper(i32* %a) nounwind - %0 = load i32, i32* %a, align 4 - %add = add nsw i32 %0, 13 - ret i32 %add - -; FORCE-ALIGN: _t8 -; FORCE-ALIGN: movq %rsp, %rbp -; FORCE-ALIGN: andq $-32, %rsp -; FORCE-ALIGN-NEXT: subq $32, %rsp -; FORCE-ALIGN: movq %rbp, %rsp -; FORCE-ALIGN: popq %rbp -} - -; VLAs -define i32 @t9(i64 %sz) nounwind uwtable { -entry: - %a = alloca i32, align 4 - %vla = alloca i32, i64 %sz, align 16 - call void @t3_helper(i32* %a, i32* %vla) nounwind - %0 = load i32, i32* %a, align 4 - %add = add nsw i32 %0, 13 - ret i32 %add - -; FORCE-ALIGN: _t9 -; FORCE-ALIGN: pushq %rbp -; FORCE-ALIGN: movq %rsp, %rbp -; FORCE-ALIGN: pushq %rbx -; FORCE-ALIGN: andq $-32, %rsp -; FORCE-ALIGN: subq $32, %rsp -; FORCE-ALIGN: movq %rsp, %rbx - -; FORCE-ALIGN: leaq -8(%rbp), %rsp -; FORCE-ALIGN: popq %rbx -; FORCE-ALIGN: popq %rbp -} diff --git a/llvm/test/CodeGen/X86/force-align-stack-alloca.ll b/llvm/test/CodeGen/X86/force-align-stack-alloca.ll index e9f38e9af62d..9d81dff9ad29 100644 --- a/llvm/test/CodeGen/X86/force-align-stack-alloca.ll +++ b/llvm/test/CodeGen/X86/force-align-stack-alloca.ll @@ -3,7 +3,7 @@ ; arbitrarily force alignment up to 32-bytes for i386 hoping that this will ; exceed any ABI provisions. ; -; RUN: llc < %s -mcpu=generic -stackrealign -stack-alignment=32 | FileCheck %s +; RUN: llc < %s -mcpu=generic -stackrealign | 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 triple = "i386-unknown-linux-gnu" @@ -74,3 +74,6 @@ if.then: } declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i1) nounwind + +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/hipe-cc.ll b/llvm/test/CodeGen/X86/hipe-cc.ll index 96a61effaee8..15d00ad56b46 100644 --- a/llvm/test/CodeGen/X86/hipe-cc.ll +++ b/llvm/test/CodeGen/X86/hipe-cc.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -stack-symbol-ordering=0 -tailcallopt -code-model=medium -stack-alignment=4 -mtriple=i686-linux-gnu -mcpu=pentium | FileCheck %s +; RUN: llc < %s -stack-symbol-ordering=0 -tailcallopt -code-model=medium -mtriple=i686-linux-gnu -mcpu=pentium | FileCheck %s ; Check the HiPE calling convention works (x86-32) @@ -89,3 +89,6 @@ define cc 11 { i32, i32, i32 } @tailcaller(i32 %hp, i32 %p) nounwind { @clos = external dso_local constant i32 declare cc 11 void @bar(i32, i32, i32, i32, i32) declare cc 11 { i32, i32, i32 } @tailcallee(i32, i32, i32, i32, i32, i32) + +!llvm.module.flags = !{!3} +!3 = !{i32 2, !"override-stack-alignment", i32 4} diff --git a/llvm/test/CodeGen/X86/hipe-cc64.ll b/llvm/test/CodeGen/X86/hipe-cc64.ll index 1758b4cee924..3e25d7966155 100644 --- a/llvm/test/CodeGen/X86/hipe-cc64.ll +++ b/llvm/test/CodeGen/X86/hipe-cc64.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -stack-symbol-ordering=0 -tailcallopt -relocation-model=static -code-model=medium -stack-alignment=8 -mtriple=x86_64-linux-gnu -mcpu=opteron | FileCheck %s +; RUN: llc < %s -stack-symbol-ordering=0 -tailcallopt -relocation-model=static -code-model=medium -mtriple=x86_64-linux-gnu -mcpu=opteron | FileCheck %s ; Check the HiPE calling convention works (x86-64) @@ -100,3 +100,5 @@ define cc 11 { i64, i64, i64 } @tailcaller(i64 %hp, i64 %p) #0 { @clos = external constant i64 declare cc 11 void @bar(i64, i64, i64, i64, i64, i64) declare cc 11 { i64, i64, i64 } @tailcallee(i64, i64, i64, i64, i64, i64, i64) +!llvm.module.flags = !{!3} +!3 = !{i32 2, !"override-stack-alignment", i32 8} diff --git a/llvm/test/CodeGen/X86/movtopush-stack-align.ll b/llvm/test/CodeGen/X86/movtopush-stack-align.ll new file mode 100644 index 000000000000..1924a5715daf --- /dev/null +++ b/llvm/test/CodeGen/X86/movtopush-stack-align.ll @@ -0,0 +1,52 @@ +; RUN: llc < %s -mtriple=i686-windows -stackrealign | FileCheck %s + +declare void @good(i32 %a, i32 %b, i32 %c, i32 %d) +declare void @oneparam(i32 %a) +declare void @eightparams(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) + +; When there is no reserved call frame, check that additional alignment +; is added when the pushes don't add up to the required alignment. +; CHECK-LABEL: test5: +; CHECK: subl $16, %esp +; CHECK-NEXT: pushl $4 +; CHECK-NEXT: pushl $3 +; CHECK-NEXT: pushl $2 +; CHECK-NEXT: pushl $1 +; CHECK-NEXT: call +define void @test5(i32 %k) { +entry: + %a = alloca i32, i32 %k + call void @good(i32 1, i32 2, i32 3, i32 4) + ret void +} + +; When the alignment adds up, do the transformation +; CHECK-LABEL: test5b: +; CHECK: pushl $8 +; CHECK-NEXT: pushl $7 +; CHECK-NEXT: pushl $6 +; CHECK-NEXT: pushl $5 +; CHECK-NEXT: pushl $4 +; CHECK-NEXT: pushl $3 +; CHECK-NEXT: pushl $2 +; CHECK-NEXT: pushl $1 +; CHECK-NEXT: call +define void @test5b() optsize { +entry: + call void @eightparams(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8) + ret void +} + +; When having to compensate for the alignment isn't worth it, +; don't use pushes. +; CHECK-LABEL: test5c: +; CHECK: movl $1, (%esp) +; CHECK-NEXT: call +define void @test5c() optsize { +entry: + call void @oneparam(i32 1) + ret void +} + +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/movtopush.ll b/llvm/test/CodeGen/X86/movtopush.ll index f693b75f81c4..2d632a2ac640 100644 --- a/llvm/test/CodeGen/X86/movtopush.ll +++ b/llvm/test/CodeGen/X86/movtopush.ll @@ -1,7 +1,6 @@ ; RUN: llc < %s -mtriple=i686-windows | FileCheck %s -check-prefix=NORMAL ; RUN: llc < %s -mtriple=i686-windows -no-x86-call-frame-opt | FileCheck %s -check-prefix=NOPUSH ; RUN: llc < %s -mtriple=x86_64-windows | FileCheck %s -check-prefix=X64 -; RUN: llc < %s -mtriple=i686-windows -stackrealign -stack-alignment=32 | FileCheck %s -check-prefix=ALIGNED ; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s -check-prefix=LINUX %class.Class = type { i32 } @@ -125,50 +124,6 @@ entry: ret void } -; When there is no reserved call frame, check that additional alignment -; is added when the pushes don't add up to the required alignment. -; ALIGNED-LABEL: test5: -; ALIGNED: subl $16, %esp -; ALIGNED-NEXT: pushl $4 -; ALIGNED-NEXT: pushl $3 -; ALIGNED-NEXT: pushl $2 -; ALIGNED-NEXT: pushl $1 -; ALIGNED-NEXT: call -define void @test5(i32 %k) { -entry: - %a = alloca i32, i32 %k - call void @good(i32 1, i32 2, i32 3, i32 4) - ret void -} - -; When the alignment adds up, do the transformation -; ALIGNED-LABEL: test5b: -; ALIGNED: pushl $8 -; ALIGNED-NEXT: pushl $7 -; ALIGNED-NEXT: pushl $6 -; ALIGNED-NEXT: pushl $5 -; ALIGNED-NEXT: pushl $4 -; ALIGNED-NEXT: pushl $3 -; ALIGNED-NEXT: pushl $2 -; ALIGNED-NEXT: pushl $1 -; ALIGNED-NEXT: call -define void @test5b() optsize { -entry: - call void @eightparams(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8) - ret void -} - -; When having to compensate for the alignment isn't worth it, -; don't use pushes. -; ALIGNED-LABEL: test5c: -; ALIGNED: movl $1, (%esp) -; ALIGNED-NEXT: call -define void @test5c() optsize { -entry: - call void @oneparam(i32 1) - ret void -} - ; Check that pushing the addresses of globals (Or generally, things that ; aren't exactly immediates) isn't broken. ; Fixes PR21878. diff --git a/llvm/test/CodeGen/X86/pr11468.ll b/llvm/test/CodeGen/X86/pr11468.ll index c2bc370ed042..0df031bb9d87 100644 --- a/llvm/test/CodeGen/X86/pr11468.ll +++ b/llvm/test/CodeGen/X86/pr11468.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -stackrealign -stack-alignment=32 -mattr=+avx -mtriple=x86_64-apple-darwin10 | FileCheck %s +; RUN: llc < %s -stackrealign -mattr=+avx -mtriple=x86_64-apple-darwin10 | FileCheck %s ; PR11468 define void @f(i64 %sz) uwtable { @@ -29,5 +29,6 @@ entry: ; CHECK: popq %rbp } +!llvm.module.flags = !{!1} !0 = !{i32 125} - +!1 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/unaligned-spill-folding.ll b/llvm/test/CodeGen/X86/unaligned-spill-folding.ll index 935c0b967f9e..8fa080dd661b 100644 --- a/llvm/test/CodeGen/X86/unaligned-spill-folding.ll +++ b/llvm/test/CodeGen/X86/unaligned-spill-folding.ll @@ -1,7 +1,11 @@ -; 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=4 -stackrealign -relocation-model=pic < %s | FileCheck %s -check-prefix=FORCEALIGNED +; RUN: split-file %s %t +; RUN: cat %t/main.ll %t/align4.ll > %t/a2.ll +; RUN: cat %t/main.ll %t/align16.ll > %t/b2.ll +; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -relocation-model=pic < %t/a2.ll | FileCheck %s -check-prefix=UNALIGNED +; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -relocation-model=pic < %t/b2.ll | FileCheck %s -check-prefix=ALIGNED +; RUN: llc -mtriple=i386-unknown-freebsd -mcpu=core2 -stackrealign -relocation-model=pic < %t/a2.ll | FileCheck %s -check-prefix=FORCEALIGNED +;--- main.ll @arr = internal unnamed_addr global [32 x i32] zeroinitializer, align 16 ; PR12250 @@ -47,3 +51,8 @@ middle.block: ; FORCEALIGNED: movdqa {{.*}} # 16-byte Spill ; FORCEALIGNED: paddd {{.*}} # 16-byte Folded Reload } +!llvm.module.flags = !{!0} +;--- align4.ll +!0 = !{i32 2, !"override-stack-alignment", i32 4} +;--- align16.ll +!0 = !{i32 2, !"override-stack-alignment", i32 16} diff --git a/llvm/test/CodeGen/X86/x86-64-baseptr.ll b/llvm/test/CodeGen/X86/x86-64-baseptr.ll index 590a739644d2..c0e84a20faad 100644 --- a/llvm/test/CodeGen/X86/x86-64-baseptr.ll +++ b/llvm/test/CodeGen/X86/x86-64-baseptr.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -mtriple=x86_64-pc-linux -stackrealign -stack-alignment=32 < %s | FileCheck %s -; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -stackrealign -stack-alignment=32 < %s | FileCheck -check-prefix=X32ABI %s +; RUN: llc -mtriple=x86_64-pc-linux -stackrealign < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -stackrealign < %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 @@ -65,3 +65,5 @@ entry: } attributes #0 = { nounwind "frame-pointer"="all"} +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 32} diff --git a/llvm/test/CodeGen/X86/x86-64-xmm-spill-unaligned.ll b/llvm/test/CodeGen/X86/x86-64-xmm-spill-unaligned.ll index a724fe870cd4..595afec6100b 100644 --- a/llvm/test/CodeGen/X86/x86-64-xmm-spill-unaligned.ll +++ b/llvm/test/CodeGen/X86/x86-64-xmm-spill-unaligned.ll @@ -2,7 +2,7 @@ ; elements (here: XMM spills) are accessed using instructions that tolerate ; unaligned access. ; -; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=x86-64 -mattr=+sse,+sse-unaligned-mem -stack-alignment=8 --frame-pointer=all < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=x86-64 -mattr=+sse,+sse-unaligned-mem --frame-pointer=all < %s | FileCheck %s define dso_local preserve_allcc void @func() #0 { ; CHECK-LABEL: func: @@ -13,3 +13,5 @@ define dso_local preserve_allcc void @func() #0 { } attributes #0 = { nounwind } +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"override-stack-alignment", i32 8} diff --git a/llvm/test/Linker/stack-alignment.ll b/llvm/test/Linker/stack-alignment.ll new file mode 100644 index 000000000000..bc729fb06ffe --- /dev/null +++ b/llvm/test/Linker/stack-alignment.ll @@ -0,0 +1,15 @@ +; RUN: split-file %s %t +; RUN: llvm-link %t/main.ll %t/8.ll +; RUN: not llvm-link %t/main.ll %t/16.ll 2>&1 | FileCheck --check-prefix=CHECK-16 %s + +;--- main.ll +; NONE: error: linking module flags 'override-stack-alignment': IDs have conflicting values +; CHECK-16: error: linking module flags 'override-stack-alignment': IDs have conflicting values +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"override-stack-alignment", i32 8} +;--- 8.ll +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"override-stack-alignment", i32 8} +;--- 16.ll +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"override-stack-alignment", i32 16}