[llvm] r220996 - R600: Make sure to inline all internal functions

Duncan P. N. Exon Smith dexonsmith at apple.com
Fri Oct 31 14:39:23 PDT 2014


llc (among others) won't link for me in cmake, even after r220998.

[862/869] Linking CXX executable bin/llc
FAILED: : && /usr/bin/clang++   -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -std=c++11 -fcolor-diagnostics -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names  tools/llc/CMakeFiles/llc.dir/llc.cpp.o  -o bin/llc lib/libLLVMAArch64CodeGen.a lib/libLLVMAArch64AsmPrinter.a lib/libLLVMAArch64AsmParser.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Disassembler.a lib/libLLVMARMCodeGen.a lib/libLLVMARMAsmPrinter.a lib/libLLVMARMAsmParser.a lib/libLLVMARMDesc.a lib/libLLVMARMInfo.a lib/libLLVMARMDisassembler.a lib/libLLVMCppBackendCodeGen.a lib/libLLVMCppBackendInfo.a lib/libLLVMHexagonCodeGen.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMHexagonDisassembler.a lib/libLLVMMipsCodeGen.a lib/libLLVMMipsAsmPrinter.a lib/libLLVMMipsAsmParser.a lib/libLLVMMipsDesc.a lib/libLLVMMipsInfo.a lib/libLLVMMipsDisassembler.a lib/libLLVMMSP430CodeGen.a lib/libLLVMMSP430AsmPrinter.a lib/libLLVMMSP430Desc.a lib/libLLVMMSP430Info.a lib/libLLVMNVPTXCodeGen.a lib/libLLVMNVPTXAsmPrinter.a lib/libLLVMNVPTXDesc.a lib/libLLVMNVPTXInfo.a lib/libLLVMPowerPCCodeGen.a lib/libLLVMPowerPCAsmPrinter.a lib/libLLVMPowerPCAsmParser.a lib/libLLVMPowerPCDesc.a lib/libLLVMPowerPCInfo.a lib/libLLVMPowerPCDisassembler.a lib/libLLVMR600CodeGen.a lib/libLLVMR600AsmPrinter.a lib/libLLVMR600Desc.a lib/libLLVMR600Info.a lib/libLLVMSparcCodeGen.a lib/libLLVMSparcAsmPrinter.a lib/libLLVMSparcAsmParser.a lib/libLLVMSparcDesc.a lib/libLLVMSparcInfo.a lib/libLLVMSparcDisassembler.a lib/libLLVMSystemZCodeGen.a lib/libLLVMSystemZAsmPrinter.a lib/libLLVMSystemZAsmParser.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZInfo.a lib/libLLVMSystemZDisassembler.a lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMX86Disassembler.a lib/libLLVMXCoreCodeGen.a lib/libLLVMXCoreAsmPrinter.a lib/libLLVMXCoreDesc.a lib/libLLVMXCoreInfo.a lib/libLLVMXCoreDisassembler.a lib/libLLVMAsmPrinter.a lib/libLLVMCodeGen.a lib/libLLVMCore.a lib/libLLVMIRReader.a lib/libLLVMMC.a lib/libLLVMScalarOpts.a lib/libLLVMSelectionDAG.a lib/libLLVMSupport.a lib/libLLVMTarget.a lib/libLLVMAArch64AsmPrinter.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Utils.a lib/libLLVMARMDesc.a lib/libLLVMARMAsmPrinter.a lib/libLLVMARMInfo.a lib/libLLVMHexagonInfo.a lib/libLLVMMipsAsmPrinter.a lib/libLLVMMipsInfo.a lib/libLLVMMSP430AsmPrinter.a lib/libLLVMNVPTXAsmPrinter.a lib/libLLVMPowerPCAsmPrinter.a lib/libLLVMPowerPCInfo.a lib/libLLVMR600AsmPrinter.a lib/libLLVMSparcAsmPrinter.a lib/libLLVMSparcInfo.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZAsmPrinter.a lib/libLLVMSystemZInfo.a lib/libLLVMX86CodeGen.a lib/libLLVMX86Desc.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86Utils.a lib/libLLVMX86Info.a lib/libLLVMXCoreAsmPrinter.a lib/libLLVMAsmPrinter.a lib/libLLVMSelectionDAG.a lib/libLLVMCodeGen.a lib/libLLVMScalarOpts.a lib/libLLVMInstCombine.a lib/libLLVMProfileData.a lib/libLLVMObject.a lib/libLLVMMCParser.a lib/libLLVMTransformUtils.a lib/libLLVMipa.a lib/libLLVMAnalysis.a lib/libLLVMTarget.a lib/libLLVMXCoreInfo.a lib/libLLVMMCDisassembler.a lib/libLLVMMC.a lib/libLLVMAsmParser.a lib/libLLVMBitReader.a lib/libLLVMCore.a lib/libLLVMSupport.a -lcurses -lpthread -lz && :
Undefined symbols for architecture x86_64:
  "llvm::createBarrierNoopPass()", referenced from:
      (anonymous namespace)::AMDGPUPassConfig::addIRPasses() in libLLVMR600CodeGen.a(AMDGPUTargetMachine.cpp.o)
  "llvm::createAlwaysInlinerPass()", referenced from:
      (anonymous namespace)::AMDGPUPassConfig::addIRPasses() in libLLVMR600CodeGen.a(AMDGPUTargetMachine.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Can you have a look?

> On 2014-Oct-31, at 13:52, Tom Stellard <thomas.stellard at amd.com> wrote:
> 
> Author: tstellar
> Date: Fri Oct 31 15:52:02 2014
> New Revision: 220996
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=220996&view=rev
> Log:
> R600: Make sure to inline all internal functions
> 
> Function calls aren't supported yet.
> 
> Added:
>    llvm/trunk/lib/Target/R600/AMDGPUAlwaysInlinePass.cpp
>    llvm/trunk/test/CodeGen/R600/inline-calls.ll
> Modified:
>    llvm/trunk/lib/Target/R600/AMDGPU.h
>    llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp
>    llvm/trunk/test/CodeGen/R600/call.ll
> 
> Modified: llvm/trunk/lib/Target/R600/AMDGPU.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPU.h?rev=220996&r1=220995&r2=220996&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/AMDGPU.h (original)
> +++ llvm/trunk/lib/Target/R600/AMDGPU.h Fri Oct 31 15:52:02 2014
> @@ -57,6 +57,7 @@ extern char &SILoadStoreOptimizerID;
> FunctionPass *createAMDGPUPromoteAlloca(const AMDGPUSubtarget &ST);
> Pass *createAMDGPUStructurizeCFGPass();
> FunctionPass *createAMDGPUISelDag(TargetMachine &tm);
> +ModulePass *createAMDGPUAlwaysInlinePass();
> 
> /// \brief Creates an AMDGPU-specific Target Transformation Info pass.
> ImmutablePass *
> 
> Added: llvm/trunk/lib/Target/R600/AMDGPUAlwaysInlinePass.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUAlwaysInlinePass.cpp?rev=220996&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/AMDGPUAlwaysInlinePass.cpp (added)
> +++ llvm/trunk/lib/Target/R600/AMDGPUAlwaysInlinePass.cpp Fri Oct 31 15:52:02 2014
> @@ -0,0 +1,66 @@
> +//===-- AMDGPUAlwaysInlinePass.cpp - Promote Allocas ----------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +/// \file
> +/// This pass marks all internal functions as always_inline and creates
> +/// duplicates of all other functions a marks the duplicates as always_inline.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "AMDGPU.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/Transforms/Utils/Cloning.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +class AMDGPUAlwaysInline : public ModulePass {
> +
> +  static char ID;
> +
> +public:
> +  AMDGPUAlwaysInline() : ModulePass(ID) { }
> +  bool runOnModule(Module &M) override;
> +  const char *getPassName() const override { return "AMDGPU Always Inline Pass"; }
> +};
> +
> +} // End anonymous namespace
> +
> +char AMDGPUAlwaysInline::ID = 0;
> +
> +bool AMDGPUAlwaysInline::runOnModule(Module &M) {
> +
> +  std::vector<Function*> FuncsToClone;
> +  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
> +    Function &F = *I;
> +    if (!F.hasLocalLinkage() && !F.isDeclaration() && !F.use_empty())
> +      FuncsToClone.push_back(&F);
> +  }
> +
> +  for (Function *F : FuncsToClone) {
> +    ValueToValueMapTy VMap;
> +    Function *NewFunc = CloneFunction(F, VMap, false);
> +    NewFunc->setLinkage(GlobalValue::InternalLinkage);
> +    F->getParent()->getFunctionList().push_back(NewFunc);
> +    F->replaceAllUsesWith(NewFunc);
> +  }
> +
> +  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
> +    Function &F = *I;
> +    if (F.hasLocalLinkage()) {
> +      F.addFnAttr(Attribute::AlwaysInline);
> +    }
> +  }
> +  return false;
> +}
> +
> +ModulePass *llvm::createAMDGPUAlwaysInlinePass() {
> +  return new AMDGPUAlwaysInline();
> +}
> 
> Modified: llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp?rev=220996&r1=220995&r2=220996&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp Fri Oct 31 15:52:02 2014
> @@ -80,6 +80,7 @@ public:
>     return nullptr;
>   }
> 
> +  void addIRPasses() override;
>   void addCodeGenPrepare() override;
>   bool addPreISel() override;
>   bool addInstSelector() override;
> @@ -106,6 +107,19 @@ void AMDGPUTargetMachine::addAnalysisPas
>   PM.add(createAMDGPUTargetTransformInfoPass(this));
> }
> 
> +void AMDGPUPassConfig::addIRPasses() {
> +  // Function calls are not supported, so make sure we inline everything.
> +  addPass(createAMDGPUAlwaysInlinePass());
> +  addPass(createAlwaysInlinerPass());
> +  // We need to add the barrier noop pass, otherwise adding the function
> +  // inlining pass will cause all of the PassConfigs passes to be run
> +  // one function at a time, which means if we have a nodule with two
> +  // functions, then we will generate code for the first function
> +  // without ever running any passes on the second.
> +  addPass(createBarrierNoopPass());
> +  TargetPassConfig::addIRPasses();
> +}
> +
> void AMDGPUPassConfig::addCodeGenPrepare() {
>   const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
>   if (ST.isPromoteAllocaEnabled()) {
> 
> Modified: llvm/trunk/test/CodeGen/R600/call.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/R600/call.ll?rev=220996&r1=220995&r2=220996&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/R600/call.ll (original)
> +++ llvm/trunk/test/CodeGen/R600/call.ll Fri Oct 31 15:52:02 2014
> @@ -1,7 +1,7 @@
> ; RUN: not llc -march=r600 -mcpu=SI -verify-machineinstrs< %s 2>&1 | FileCheck %s
> ; RUN: not llc -march=r600 -mcpu=cypress < %s 2>&1 | FileCheck %s
> 
> -; CHECK: error: unsupported call to function defined_function in test_call
> +; CHECK: error: unsupported call to function external_function in test_call_external
> 
> 
> declare i32 @external_function(i32) nounwind
> 
> Added: llvm/trunk/test/CodeGen/R600/inline-calls.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/R600/inline-calls.ll?rev=220996&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/R600/inline-calls.ll (added)
> +++ llvm/trunk/test/CodeGen/R600/inline-calls.ll Fri Oct 31 15:52:02 2014
> @@ -0,0 +1,24 @@
> +; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck  %s
> +; RUN: llc -march=r600 -mcpu=redwood -verify-machineinstrs < %s | FileCheck %s
> +
> +; CHECK-NOT: {{^}}func:
> +define internal fastcc i32 @func(i32 %a) {
> +entry:
> +  %tmp0 = add i32 %a, 1
> +  ret i32 %tmp0
> +}
> +
> +; CHECK: {{^}}kernel:
> +define void @kernel(i32 addrspace(1)* %out) {
> +entry:
> +  %tmp0 = call i32 @func(i32 1)
> +  store i32 %tmp0, i32 addrspace(1)* %out
> +  ret void
> +}
> +
> +; CHECK: {{^}}kernel2:
> +define void @kernel2(i32 addrspace(1)* %out) {
> +entry:
> +  call void @kernel(i32 addrspace(1)* %out)
> +  ret void
> +}
> 
> 
> _______________________________________________
> 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