Commit 44901008 authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r182298:

------------------------------------------------------------------------
r182298 | jholewinski | 2013-05-20 09:42:18 -0700 (Mon, 20 May 2013) | 1 line

[NVPTX] Fix mis-use of CurrentFnSym in NVPTXAsmPrinter.  This was causing a symbol name error in the output PTX.
------------------------------------------------------------------------

llvm-svn: 182828
parent 57aa7f7e
Loading
Loading
Loading
Loading
+7 −9
Original line number Diff line number Diff line
@@ -702,7 +702,7 @@ void NVPTXAsmPrinter::emitDeclaration(const Function *F, raw_ostream &O) {
  else
    O << ".func ";
  printReturnValStr(F, O);
  O << *CurrentFnSym << "\n";
  O << *Mang->getSymbol(F) << "\n";
  emitFunctionParamList(F, O);
  O << ";\n";
}
@@ -812,7 +812,6 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
        continue;
      if (F->getIntrinsicID())
        continue;
      CurrentFnSym = Mang->getSymbol(F);
      emitDeclaration(F, O);
      continue;
    }
@@ -824,14 +823,12 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
          // The use is in the initialization of a global variable
          // that is a function pointer, so print a declaration
          // for the original function
          CurrentFnSym = Mang->getSymbol(F);
          emitDeclaration(F, O);
          break;
        }
        // Emit a declaration of this function if the function that
        // uses this constant expr has already been seen.
        if (useFuncSeen(C, seenMap)) {
          CurrentFnSym = Mang->getSymbol(F);
          emitDeclaration(F, O);
          break;
        }
@@ -851,7 +848,6 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
      // appearing in the module before the callee. so print out
      // a declaration for the callee.
      if (seenMap.find(caller) != seenMap.end()) {
        CurrentFnSym = Mang->getSymbol(F);
        emitDeclaration(F, O);
        break;
      }
@@ -1473,7 +1469,7 @@ void NVPTXAsmPrinter::printParamName(Function::const_arg_iterator I,
                                     int paramIndex, raw_ostream &O) {
  if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
      (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA))
    O << *CurrentFnSym << "_param_" << paramIndex;
    O << *Mang->getSymbol(I->getParent()) << "_param_" << paramIndex;
  else {
    std::string argName = I->getName();
    const char *p = argName.c_str();
@@ -1532,11 +1528,13 @@ void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) {
      if (llvm::isImage(*I)) {
        std::string sname = I->getName();
        if (llvm::isImageWriteOnly(*I))
          O << "\t.param .surfref " << *CurrentFnSym << "_param_" << paramIndex;
          O << "\t.param .surfref " << *Mang->getSymbol(F) << "_param_"
            << paramIndex;
        else // Default image is read_only
          O << "\t.param .texref " << *CurrentFnSym << "_param_" << paramIndex;
          O << "\t.param .texref " << *Mang->getSymbol(F) << "_param_"
            << paramIndex;
      } else // Should be llvm::isSampler(*I)
        O << "\t.param .samplerref " << *CurrentFnSym << "_param_"
        O << "\t.param .samplerref " << *Mang->getSymbol(F) << "_param_"
          << paramIndex;
      continue;
    }
+37 −0
Original line number Diff line number Diff line
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -drvcuda | FileCheck %s

; Function Attrs: nounwind
; CHECK: .entry foo
define void @foo(float* nocapture %a) #0 {
  %val = load float* %a
  %tan = tail call fastcc float @__nv_fast_tanf(float %val)
  store float %tan, float* %a
  ret void
}

; Function Attrs: nounwind readnone
declare float @llvm.nvvm.sin.approx.ftz.f(float) #1

; Function Attrs: nounwind readnone
declare float @llvm.nvvm.cos.approx.ftz.f(float) #1

; Function Attrs: nounwind readnone
declare float @llvm.nvvm.div.approx.ftz.f(float, float) #1

; Function Attrs: alwaysinline inlinehint nounwind readnone
; CHECK: .func (.param .b32 func_retval0) __nv_fast_tanf
define internal fastcc float @__nv_fast_tanf(float %a) #2 {
entry:
  %0 = tail call float @llvm.nvvm.sin.approx.ftz.f(float %a)
  %1 = tail call float @llvm.nvvm.cos.approx.ftz.f(float %a)
  %2 = tail call float @llvm.nvvm.div.approx.ftz.f(float %0, float %1)
  ret float %2
}

attributes #0 = { nounwind }
attributes #1 = { nounwind readnone }
attributes #2 = { alwaysinline inlinehint nounwind readnone }

!nvvm.annotations = !{!0}

!0 = metadata !{void (float*)* @foo, metadata !"kernel", i32 1}