[NVPTX] Fix mis-use of CurrentFnSym in NVPTXAsmPrinter. This was causing a symbol name error in the output PTX.
llvm-svn: 182298
This commit is contained in:
		
							parent
							
								
									18f3a1ffe6
								
							
						
					
					
						commit
						4c47d87ba6
					
				| 
						 | 
					@ -702,7 +702,7 @@ void NVPTXAsmPrinter::emitDeclaration(const Function *F, raw_ostream &O) {
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    O << ".func ";
 | 
					    O << ".func ";
 | 
				
			||||||
  printReturnValStr(F, O);
 | 
					  printReturnValStr(F, O);
 | 
				
			||||||
  O << *CurrentFnSym << "\n";
 | 
					  O << *Mang->getSymbol(F) << "\n";
 | 
				
			||||||
  emitFunctionParamList(F, O);
 | 
					  emitFunctionParamList(F, O);
 | 
				
			||||||
  O << ";\n";
 | 
					  O << ";\n";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -812,7 +812,6 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
      if (F->getIntrinsicID())
 | 
					      if (F->getIntrinsicID())
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
      CurrentFnSym = Mang->getSymbol(F);
 | 
					 | 
				
			||||||
      emitDeclaration(F, O);
 | 
					      emitDeclaration(F, O);
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -824,14 +823,12 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
 | 
				
			||||||
          // The use is in the initialization of a global variable
 | 
					          // The use is in the initialization of a global variable
 | 
				
			||||||
          // that is a function pointer, so print a declaration
 | 
					          // that is a function pointer, so print a declaration
 | 
				
			||||||
          // for the original function
 | 
					          // for the original function
 | 
				
			||||||
          CurrentFnSym = Mang->getSymbol(F);
 | 
					 | 
				
			||||||
          emitDeclaration(F, O);
 | 
					          emitDeclaration(F, O);
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Emit a declaration of this function if the function that
 | 
					        // Emit a declaration of this function if the function that
 | 
				
			||||||
        // uses this constant expr has already been seen.
 | 
					        // uses this constant expr has already been seen.
 | 
				
			||||||
        if (useFuncSeen(C, seenMap)) {
 | 
					        if (useFuncSeen(C, seenMap)) {
 | 
				
			||||||
          CurrentFnSym = Mang->getSymbol(F);
 | 
					 | 
				
			||||||
          emitDeclaration(F, O);
 | 
					          emitDeclaration(F, O);
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -851,7 +848,6 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
 | 
				
			||||||
      // appearing in the module before the callee. so print out
 | 
					      // appearing in the module before the callee. so print out
 | 
				
			||||||
      // a declaration for the callee.
 | 
					      // a declaration for the callee.
 | 
				
			||||||
      if (seenMap.find(caller) != seenMap.end()) {
 | 
					      if (seenMap.find(caller) != seenMap.end()) {
 | 
				
			||||||
        CurrentFnSym = Mang->getSymbol(F);
 | 
					 | 
				
			||||||
        emitDeclaration(F, O);
 | 
					        emitDeclaration(F, O);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -1473,7 +1469,7 @@ void NVPTXAsmPrinter::printParamName(Function::const_arg_iterator I,
 | 
				
			||||||
                                     int paramIndex, raw_ostream &O) {
 | 
					                                     int paramIndex, raw_ostream &O) {
 | 
				
			||||||
  if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
 | 
					  if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
 | 
				
			||||||
      (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA))
 | 
					      (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA))
 | 
				
			||||||
    O << *CurrentFnSym << "_param_" << paramIndex;
 | 
					    O << *Mang->getSymbol(I->getParent()) << "_param_" << paramIndex;
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
    std::string argName = I->getName();
 | 
					    std::string argName = I->getName();
 | 
				
			||||||
    const char *p = argName.c_str();
 | 
					    const char *p = argName.c_str();
 | 
				
			||||||
| 
						 | 
					@ -1532,11 +1528,13 @@ void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) {
 | 
				
			||||||
      if (llvm::isImage(*I)) {
 | 
					      if (llvm::isImage(*I)) {
 | 
				
			||||||
        std::string sname = I->getName();
 | 
					        std::string sname = I->getName();
 | 
				
			||||||
        if (llvm::isImageWriteOnly(*I))
 | 
					        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
 | 
					        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)
 | 
					      } else // Should be llvm::isSampler(*I)
 | 
				
			||||||
        O << "\t.param .samplerref " << *CurrentFnSym << "_param_"
 | 
					        O << "\t.param .samplerref " << *Mang->getSymbol(F) << "_param_"
 | 
				
			||||||
          << paramIndex;
 | 
					          << paramIndex;
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					; 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}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue