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; |