diff options
-rw-r--r-- | llvm/lib/CodeGen/MachineOutliner.cpp | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/machine-outliner.ll | 12 |
2 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp index 4b65d971a78..00856361db0 100644 --- a/llvm/lib/CodeGen/MachineOutliner.cpp +++ b/llvm/lib/CodeGen/MachineOutliner.cpp @@ -1202,6 +1202,14 @@ MachineOutliner::createOutlinedFunction(Module &M, const OutlinedFunction &OF, F->addFnAttr(Attribute::OptimizeForSize); F->addFnAttr(Attribute::MinSize); + // Include target features from an arbitrary candidate for the outlined + // function. This makes sure the outlined function knows what kinds of + // instructions are going into it. This is fine, since all parent functions + // must necessarily support the instructions that are in the outlined region. + const Function &ParentFn = OF.Candidates.front()->getMF()->getFunction(); + if (ParentFn.hasFnAttribute("target-features")) + F->addFnAttr(ParentFn.getFnAttribute("target-features")); + BasicBlock *EntryBB = BasicBlock::Create(C, "entry", F); IRBuilder<> Builder(EntryBB); Builder.CreateRetVoid(); diff --git a/llvm/test/CodeGen/AArch64/machine-outliner.ll b/llvm/test/CodeGen/AArch64/machine-outliner.ll index 9d922c27f88..19be14d8d39 100644 --- a/llvm/test/CodeGen/AArch64/machine-outliner.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner.ll @@ -1,6 +1,16 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple=aarch64-apple-darwin < %s | FileCheck %s ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple=aarch64-apple-darwin -mcpu=cortex-a53 -enable-misched=false < %s | FileCheck %s ; RUN: llc -verify-machineinstrs -enable-machine-outliner -enable-linkonceodr-outlining -mtriple=aarch64-apple-darwin < %s | FileCheck %s -check-prefix=ODR +; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple=aarch64-apple-darwin -stop-after=machine-outliner < %s | FileCheck %s -check-prefix=TARGET_FEATURES + +; Make sure that we inherit target features from functions and make sure we have +; the right function attributes. +; TARGET_FEATURES: define internal void @OUTLINED_FUNCTION_{{[0-9]+}}() +; TARGET_FEATURES-SAME: #[[ATTR_NUM:[0-9]+]] +; TARGET_FEATURES-DAG: attributes #[[ATTR_NUM]] = { +; TARGET_FEATURES-SAME: minsize +; TARGET_FEATURES-SAME: optsize +; TARGET_FEATURES-SAME: "target-features"="+sse" define linkonce_odr void @fish() #0 { ; CHECK-LABEL: _fish: @@ -95,4 +105,4 @@ define void @dog() #0 { ; CHECK-NEXT: str w8, [sp, #8] ; CHECK-NEXT: ret -attributes #0 = { noredzone "target-cpu"="cyclone" } +attributes #0 = { noredzone "target-cpu"="cyclone" "target-features"="+sse" } |