| Index: lib/Target/NVPTX/NVPTXAsmPrinter.cpp
|
| diff --git a/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
|
| index 229e4e5980dfe1edb983e8a46b0e98487dfe6b57..ce5d78afa33275f6ed62be4581b17443f453670d 100644
|
| --- a/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
|
| +++ b/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
|
| @@ -68,12 +68,11 @@ InterleaveSrc("nvptx-emit-src", cl::ZeroOrMore,
|
| namespace {
|
| /// DiscoverDependentGlobals - Return a set of GlobalVariables on which \p V
|
| /// depends.
|
| -void DiscoverDependentGlobals(const Value *V,
|
| - DenseSet<const GlobalVariable *> &Globals) {
|
| - if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
|
| +void DiscoverDependentGlobals(Value *V, DenseSet<GlobalVariable *> &Globals) {
|
| + if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
|
| Globals.insert(GV);
|
| else {
|
| - if (const User *U = dyn_cast<User>(V)) {
|
| + if (User *U = dyn_cast<User>(V)) {
|
| for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) {
|
| DiscoverDependentGlobals(U->getOperand(i), Globals);
|
| }
|
| @@ -85,9 +84,8 @@ void DiscoverDependentGlobals(const Value *V,
|
| /// instances to be emitted, but only after any dependents have been added
|
| /// first.
|
| void VisitGlobalVariableForEmission(
|
| - const GlobalVariable *GV, SmallVectorImpl<const GlobalVariable *> &Order,
|
| - DenseSet<const GlobalVariable *> &Visited,
|
| - DenseSet<const GlobalVariable *> &Visiting) {
|
| + GlobalVariable *GV, SmallVectorImpl<GlobalVariable *> &Order,
|
| + DenseSet<GlobalVariable *> &Visited, DenseSet<GlobalVariable *> &Visiting) {
|
| // Have we already visited this one?
|
| if (Visited.count(GV))
|
| return;
|
| @@ -100,12 +98,12 @@ void VisitGlobalVariableForEmission(
|
| Visiting.insert(GV);
|
|
|
| // Make sure we visit all dependents first
|
| - DenseSet<const GlobalVariable *> Others;
|
| + DenseSet<GlobalVariable *> Others;
|
| for (unsigned i = 0, e = GV->getNumOperands(); i != e; ++i)
|
| DiscoverDependentGlobals(GV->getOperand(i), Others);
|
|
|
| - for (DenseSet<const GlobalVariable *>::iterator I = Others.begin(),
|
| - E = Others.end();
|
| + for (DenseSet<GlobalVariable *>::iterator I = Others.begin(),
|
| + E = Others.end();
|
| I != E; ++I)
|
| VisitGlobalVariableForEmission(*I, Order, Visited, Visiting);
|
|
|
| @@ -407,11 +405,6 @@ void NVPTXAsmPrinter::EmitFunctionEntryLabel() {
|
| SmallString<128> Str;
|
| raw_svector_ostream O(Str);
|
|
|
| - if (!GlobalsEmitted) {
|
| - emitGlobals(*MF->getFunction()->getParent());
|
| - GlobalsEmitted = true;
|
| - }
|
| -
|
| // Set up
|
| MRI = &MF->getRegInfo();
|
| F = MF->getFunction();
|
| @@ -702,7 +695,7 @@ void NVPTXAsmPrinter::emitDeclaration(const Function *F, raw_ostream &O) {
|
| else
|
| O << ".func ";
|
| printReturnValStr(F, O);
|
| - O << *Mang->getSymbol(F) << "\n";
|
| + O << *CurrentFnSym << "\n";
|
| emitFunctionParamList(F, O);
|
| O << ";\n";
|
| }
|
| @@ -802,7 +795,7 @@ static bool useFuncSeen(const Constant *C,
|
| return false;
|
| }
|
|
|
| -void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
|
| +void NVPTXAsmPrinter::emitDeclarations(Module &M, raw_ostream &O) {
|
| llvm::DenseMap<const Function *, bool> seenMap;
|
| for (Module::const_iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) {
|
| const Function *F = FI;
|
| @@ -812,6 +805,7 @@ void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
|
| continue;
|
| if (F->getIntrinsicID())
|
| continue;
|
| + CurrentFnSym = Mang->getSymbol(F);
|
| emitDeclaration(F, O);
|
| continue;
|
| }
|
| @@ -823,12 +817,14 @@ 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;
|
| }
|
| @@ -848,6 +844,7 @@ 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;
|
| }
|
| @@ -924,12 +921,6 @@ bool NVPTXAsmPrinter::doInitialization(Module &M) {
|
| if (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA)
|
| recordAndEmitFilenames(M);
|
|
|
| - GlobalsEmitted = false;
|
| -
|
| - return false; // success
|
| -}
|
| -
|
| -void NVPTXAsmPrinter::emitGlobals(const Module &M) {
|
| SmallString<128> Str2;
|
| raw_svector_ostream OS2(Str2);
|
|
|
| @@ -940,13 +931,13 @@ void NVPTXAsmPrinter::emitGlobals(const Module &M) {
|
| // global variable in order, and ensure that we emit it *after* its dependent
|
| // globals. We use a little extra memory maintaining both a set and a list to
|
| // have fast searches while maintaining a strict ordering.
|
| - SmallVector<const GlobalVariable *, 8> Globals;
|
| - DenseSet<const GlobalVariable *> GVVisited;
|
| - DenseSet<const GlobalVariable *> GVVisiting;
|
| + SmallVector<GlobalVariable *, 8> Globals;
|
| + DenseSet<GlobalVariable *> GVVisited;
|
| + DenseSet<GlobalVariable *> GVVisiting;
|
|
|
| // Visit each global variable, in order
|
| - for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
|
| - I != E; ++I)
|
| + for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E;
|
| + ++I)
|
| VisitGlobalVariableForEmission(I, Globals, GVVisited, GVVisiting);
|
|
|
| assert(GVVisited.size() == M.getGlobalList().size() &&
|
| @@ -960,6 +951,7 @@ void NVPTXAsmPrinter::emitGlobals(const Module &M) {
|
| OS2 << '\n';
|
|
|
| OutStreamer.EmitRawText(OS2.str());
|
| + return false; // success
|
| }
|
|
|
| void NVPTXAsmPrinter::emitHeader(Module &M, raw_ostream &O) {
|
| @@ -997,14 +989,6 @@ void NVPTXAsmPrinter::emitHeader(Module &M, raw_ostream &O) {
|
| }
|
|
|
| bool NVPTXAsmPrinter::doFinalization(Module &M) {
|
| -
|
| - // If we did not emit any functions, then the global declarations have not
|
| - // yet been emitted.
|
| - if (!GlobalsEmitted) {
|
| - emitGlobals(M);
|
| - GlobalsEmitted = true;
|
| - }
|
| -
|
| // XXX Temproarily remove global variables so that doFinalization() will not
|
| // emit them again (global variables are emitted at beginning).
|
|
|
| @@ -1079,8 +1063,7 @@ void NVPTXAsmPrinter::emitLinkageDirective(const GlobalValue *V,
|
| }
|
| }
|
|
|
| -void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
|
| - raw_ostream &O,
|
| +void NVPTXAsmPrinter::printModuleLevelGV(GlobalVariable *GVar, raw_ostream &O,
|
| bool processDemoted) {
|
|
|
| // Skip meta data
|
| @@ -1124,10 +1107,10 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
|
| if (llvm::isSampler(*GVar)) {
|
| O << ".global .samplerref " << llvm::getSamplerName(*GVar);
|
|
|
| - const Constant *Initializer = NULL;
|
| + Constant *Initializer = NULL;
|
| if (GVar->hasInitializer())
|
| Initializer = GVar->getInitializer();
|
| - const ConstantInt *CI = NULL;
|
| + ConstantInt *CI = NULL;
|
| if (Initializer)
|
| CI = dyn_cast<ConstantInt>(Initializer);
|
| if (CI) {
|
| @@ -1200,7 +1183,7 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
|
| if (localDecls.find(demotedFunc) != localDecls.end())
|
| localDecls[demotedFunc].push_back(GVar);
|
| else {
|
| - std::vector<const GlobalVariable *> temp;
|
| + std::vector<GlobalVariable *> temp;
|
| temp.push_back(GVar);
|
| localDecls[demotedFunc] = temp;
|
| }
|
| @@ -1216,11 +1199,7 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
|
|
|
| if (ETy->isPrimitiveType() || ETy->isIntegerTy() || isa<PointerType>(ETy)) {
|
| O << " .";
|
| - // Special case: ABI requires that we use .u8 for predicates
|
| - if (ETy->isIntegerTy(1))
|
| - O << "u8";
|
| - else
|
| - O << getPTXFundamentalTypeStr(ETy, false);
|
| + O << getPTXFundamentalTypeStr(ETy, false);
|
| O << " ";
|
| O << *Mang->getSymbol(GVar);
|
|
|
| @@ -1230,7 +1209,7 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
|
| (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST_NOT_GEN) ||
|
| (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST)) &&
|
| GVar->hasInitializer()) {
|
| - const Constant *Initializer = GVar->getInitializer();
|
| + Constant *Initializer = GVar->getInitializer();
|
| if (!Initializer->isNullValue()) {
|
| O << " = ";
|
| printScalarConstant(Initializer, O);
|
| @@ -1254,7 +1233,7 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
|
| (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST_NOT_GEN) ||
|
| (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST)) &&
|
| GVar->hasInitializer()) {
|
| - const Constant *Initializer = GVar->getInitializer();
|
| + Constant *Initializer = GVar->getInitializer();
|
| if (!isa<UndefValue>(Initializer) && !Initializer->isNullValue()) {
|
| AggBuffer aggBuffer(ElementSize, O, *this);
|
| bufferAggregateConstant(Initializer, &aggBuffer);
|
| @@ -1304,7 +1283,7 @@ void NVPTXAsmPrinter::emitDemotedVars(const Function *f, raw_ostream &O) {
|
| if (localDecls.find(f) == localDecls.end())
|
| return;
|
|
|
| - std::vector<const GlobalVariable *> &gvars = localDecls[f];
|
| + std::vector<GlobalVariable *> &gvars = localDecls[f];
|
|
|
| for (unsigned i = 0, e = gvars.size(); i != e; ++i) {
|
| O << "\t// demoted variable\n\t";
|
| @@ -1469,7 +1448,7 @@ void NVPTXAsmPrinter::printParamName(Function::const_arg_iterator I,
|
| int paramIndex, raw_ostream &O) {
|
| if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
|
| (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA))
|
| - O << *Mang->getSymbol(I->getParent()) << "_param_" << paramIndex;
|
| + O << *CurrentFnSym << "_param_" << paramIndex;
|
| else {
|
| std::string argName = I->getName();
|
| const char *p = argName.c_str();
|
| @@ -1528,13 +1507,11 @@ 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 " << *Mang->getSymbol(F) << "_param_"
|
| - << paramIndex;
|
| + O << "\t.param .surfref " << *CurrentFnSym << "_param_" << paramIndex;
|
| else // Default image is read_only
|
| - O << "\t.param .texref " << *Mang->getSymbol(F) << "_param_"
|
| - << paramIndex;
|
| + O << "\t.param .texref " << *CurrentFnSym << "_param_" << paramIndex;
|
| } else // Should be llvm::isSampler(*I)
|
| - O << "\t.param .samplerref " << *Mang->getSymbol(F) << "_param_"
|
| + O << "\t.param .samplerref " << *CurrentFnSym << "_param_"
|
| << paramIndex;
|
| continue;
|
| }
|
| @@ -1587,13 +1564,7 @@ void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) {
|
| }
|
|
|
| // non-pointer scalar to kernel func
|
| - O << "\t.param .";
|
| - // Special case: predicate operands become .u8 types
|
| - if (Ty->isIntegerTy(1))
|
| - O << "u8";
|
| - else
|
| - O << getPTXFundamentalTypeStr(Ty);
|
| - O << " ";
|
| + O << "\t.param ." << getPTXFundamentalTypeStr(Ty) << " ";
|
| printParamName(I, paramIndex, O);
|
| continue;
|
| }
|
| @@ -1780,12 +1751,12 @@ void NVPTXAsmPrinter::printFPConstant(const ConstantFP *Fp, raw_ostream &O) {
|
| O << utohexstr(API.getZExtValue());
|
| }
|
|
|
| -void NVPTXAsmPrinter::printScalarConstant(const Constant *CPV, raw_ostream &O) {
|
| - if (const ConstantInt *CI = dyn_cast<ConstantInt>(CPV)) {
|
| +void NVPTXAsmPrinter::printScalarConstant(Constant *CPV, raw_ostream &O) {
|
| + if (ConstantInt *CI = dyn_cast<ConstantInt>(CPV)) {
|
| O << CI->getValue();
|
| return;
|
| }
|
| - if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CPV)) {
|
| + if (ConstantFP *CFP = dyn_cast<ConstantFP>(CPV)) {
|
| printFPConstant(CFP, O);
|
| return;
|
| }
|
| @@ -1793,13 +1764,13 @@ void NVPTXAsmPrinter::printScalarConstant(const Constant *CPV, raw_ostream &O) {
|
| O << "0";
|
| return;
|
| }
|
| - if (const GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
|
| + if (GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
|
| O << *Mang->getSymbol(GVar);
|
| return;
|
| }
|
| - if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| - const Value *v = Cexpr->stripPointerCasts();
|
| - if (const GlobalValue *GVar = dyn_cast<GlobalValue>(v)) {
|
| + if (ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| + Value *v = Cexpr->stripPointerCasts();
|
| + if (GlobalValue *GVar = dyn_cast<GlobalValue>(v)) {
|
| O << *Mang->getSymbol(GVar);
|
| return;
|
| } else {
|
| @@ -1810,7 +1781,7 @@ void NVPTXAsmPrinter::printScalarConstant(const Constant *CPV, raw_ostream &O) {
|
| llvm_unreachable("Not scalar type found in printScalarConstant()");
|
| }
|
|
|
| -void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
|
| +void NVPTXAsmPrinter::bufferLEByte(Constant *CPV, int Bytes,
|
| AggBuffer *aggBuffer) {
|
|
|
| const DataLayout *TD = TM.getDataLayout();
|
| @@ -1838,13 +1809,13 @@ void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
|
| ptr = (unsigned char *)&int16;
|
| aggBuffer->addBytes(ptr, 2, Bytes);
|
| } else if (ETy == Type::getInt32Ty(CPV->getContext())) {
|
| - if (const ConstantInt *constInt = dyn_cast<ConstantInt>(CPV)) {
|
| + if (ConstantInt *constInt = dyn_cast<ConstantInt>(CPV)) {
|
| int int32 = (int)(constInt->getZExtValue());
|
| ptr = (unsigned char *)&int32;
|
| aggBuffer->addBytes(ptr, 4, Bytes);
|
| break;
|
| - } else if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| - if (const ConstantInt *constInt = dyn_cast<ConstantInt>(
|
| + } else if (ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| + if (ConstantInt *constInt = dyn_cast<ConstantInt>(
|
| ConstantFoldConstantExpression(Cexpr, TD))) {
|
| int int32 = (int)(constInt->getZExtValue());
|
| ptr = (unsigned char *)&int32;
|
| @@ -1860,13 +1831,13 @@ void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
|
| }
|
| llvm_unreachable("unsupported integer const type");
|
| } else if (ETy == Type::getInt64Ty(CPV->getContext())) {
|
| - if (const ConstantInt *constInt = dyn_cast<ConstantInt>(CPV)) {
|
| + if (ConstantInt *constInt = dyn_cast<ConstantInt>(CPV)) {
|
| long long int64 = (long long)(constInt->getZExtValue());
|
| ptr = (unsigned char *)&int64;
|
| aggBuffer->addBytes(ptr, 8, Bytes);
|
| break;
|
| - } else if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| - if (const ConstantInt *constInt = dyn_cast<ConstantInt>(
|
| + } else if (ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| + if (ConstantInt *constInt = dyn_cast<ConstantInt>(
|
| ConstantFoldConstantExpression(Cexpr, TD))) {
|
| long long int64 = (long long)(constInt->getZExtValue());
|
| ptr = (unsigned char *)&int64;
|
| @@ -1887,7 +1858,7 @@ void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
|
| }
|
| case Type::FloatTyID:
|
| case Type::DoubleTyID: {
|
| - const ConstantFP *CFP = dyn_cast<ConstantFP>(CPV);
|
| + ConstantFP *CFP = dyn_cast<ConstantFP>(CPV);
|
| const Type *Ty = CFP->getType();
|
| if (Ty == Type::getFloatTy(CPV->getContext())) {
|
| float float32 = (float) CFP->getValueAPF().convertToFloat();
|
| @@ -1903,10 +1874,10 @@ void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
|
| break;
|
| }
|
| case Type::PointerTyID: {
|
| - if (const GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
|
| + if (GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
|
| aggBuffer->addSymbol(GVar);
|
| - } else if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| - const Value *v = Cexpr->stripPointerCasts();
|
| + } else if (ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
|
| + Value *v = Cexpr->stripPointerCasts();
|
| aggBuffer->addSymbol(v);
|
| }
|
| unsigned int s = TD->getTypeAllocSize(CPV->getType());
|
| @@ -1935,7 +1906,7 @@ void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
|
| }
|
| }
|
|
|
| -void NVPTXAsmPrinter::bufferAggregateConstant(const Constant *CPV,
|
| +void NVPTXAsmPrinter::bufferAggregateConstant(Constant *CPV,
|
| AggBuffer *aggBuffer) {
|
| const DataLayout *TD = TM.getDataLayout();
|
| int Bytes;
|
|
|