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

Tom Stellard tom at stellard.net
Mon Nov 3 12:07:45 PST 2014


On Mon, Nov 03, 2014 at 09:09:03AM -0800, Reid Kleckner wrote:
> I think so, sorry about that. I wasn't careful enough here.
> 

No problem, I've re-committed these two patches as r221173.

-Tom

> On Mon, Nov 3, 2014 at 9:03 AM, Tom Stellard <tom at stellard.net> wrote:
> 
> > On Fri, Oct 31, 2014 at 04:48:08PM -0700, Reid Kleckner wrote:
> > > I reverted this in r221020, I see at least one bot also have this link
> > > error:
> > >
> > http://lab.llvm.org:8011/builders/clang-native-arm-lnt/builds/8946/steps/compile/logs/stdio
> > >
> >
> > Is r221004 not a correct fix for this error?  It added IPO to the list of
> > libraries required by R600.
> >
> > -Tom
> >
> > > On Fri, Oct 31, 2014 at 3:13 PM, Reid Kleckner <rnk at google.com> wrote:
> > >
> > > > This include from lib/Target/R600:
> > > > #include "llvm/Transforms/Utils/Cloning.h"
> > > >
> > > > You probably want to figure something else out.
> > > >
> > > > On Fri, Oct 31, 2014 at 2:39 PM, Duncan P. N. Exon Smith <
> > > > dexonsmith at apple.com> wrote:
> > > >
> > > >> 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/libLLV!
> > > >>  MMSP430CodeGen.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/libLLVMXCoreA!
> > > >>  smPrinter.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/libLLVMP!
> > > >>  rofileData.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
> > > >>
> > > >>
> > > >> _______________________________________________
> > > >> llvm-commits mailing list
> > > >> llvm-commits at cs.uiuc.edu
> > > >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> > > >>
> > > >
> > > >
> >
> > > _______________________________________________
> > > 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