From: Daniel Dunbar Date: Thu, 30 Jul 2009 17:37:43 +0000 (+0000) Subject: Twines: Don't allow implicit conversion from integers, this is too tricky. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9;p=oota-llvm.git Twines: Don't allow implicit conversion from integers, this is too tricky. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77605 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/Twine.h b/include/llvm/ADT/Twine.h index 30228123318..6c4905e643c 100644 --- a/include/llvm/ADT/Twine.h +++ b/include/llvm/ADT/Twine.h @@ -252,22 +252,22 @@ namespace llvm { } /// Construct a twine to print \arg Val as an unsigned decimal integer. - Twine(const uint32_t &Val) + explicit Twine(const uint32_t &Val) : LHS(&Val), LHSKind(UDec32Kind), RHSKind(EmptyKind) { } /// Construct a twine to print \arg Val as a signed decimal integer. - Twine(const int32_t &Val) + explicit Twine(const int32_t &Val) : LHS(&Val), LHSKind(SDec32Kind), RHSKind(EmptyKind) { } /// Construct a twine to print \arg Val as an unsigned decimal integer. - Twine(const uint64_t &Val) + explicit Twine(const uint64_t &Val) : LHS(&Val), LHSKind(UDec64Kind), RHSKind(EmptyKind) { } /// Construct a twine to print \arg Val as a signed decimal integer. - Twine(const int64_t &Val) + explicit Twine(const int64_t &Val) : LHS(&Val), LHSKind(SDec64Kind), RHSKind(EmptyKind) { } diff --git a/lib/Transforms/IPO/ArgumentPromotion.cpp b/lib/Transforms/IPO/ArgumentPromotion.cpp index c31e0ef35e9..69df49796ae 100644 --- a/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -764,9 +764,9 @@ Function *ArgPromotion::DoPromotion(Function *F, Idxs[1] = ConstantInt::get(Type::Int32Ty, i); Value *Idx = GetElementPtrInst::Create(TheAlloca, Idxs, Idxs+2, - TheAlloca->getName()+"."+i, + TheAlloca->getName()+"."+Twine(i), InsertPt); - I2->setName(I->getName()+"."+i); + I2->setName(I->getName()+"."+Twine(i)); new StoreInst(I2++, Idx, InsertPt); } diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 629edee0027..e0e5b60b0ef 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -494,7 +494,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const TargetData &TD, GlobalVariable *NGV = new GlobalVariable(Context, STy->getElementType(i), false, GlobalVariable::InternalLinkage, - In, GV->getName()+"."+i, + In, GV->getName()+"."+Twine(i), GV->isThreadLocal(), GV->getType()->getAddressSpace()); Globals.insert(GV, NGV); @@ -530,7 +530,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const TargetData &TD, GlobalVariable *NGV = new GlobalVariable(Context, STy->getElementType(), false, GlobalVariable::InternalLinkage, - In, GV->getName()+"."+i, + In, GV->getName()+"."+Twine(i), GV->isThreadLocal(), GV->getType()->getAddressSpace()); Globals.insert(GV, NGV); @@ -584,7 +584,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const TargetData &TD, for (unsigned i = 3, e = GEPI->getNumOperands(); i != e; ++i) Idxs.push_back(GEPI->getOperand(i)); NewPtr = GetElementPtrInst::Create(NewPtr, Idxs.begin(), Idxs.end(), - GEPI->getName()+"."+Val, GEPI); + GEPI->getName()+"."+Twine(Val),GEPI); } } GEP->replaceAllUsesWith(NewPtr); @@ -1152,7 +1152,7 @@ static Value *GetHeapSROAValue(Value *V, unsigned FieldNo, Result = new LoadInst(GetHeapSROAValue(LI->getOperand(0), FieldNo, InsertedScalarizedValues, PHIsToRewrite, Context), - LI->getName()+".f" + FieldNo, LI); + LI->getName()+".f"+Twine(FieldNo), LI); } else if (PHINode *PN = dyn_cast(V)) { // PN's type is pointer to struct. Make a new PHI of pointer to struct // field. @@ -1161,7 +1161,7 @@ static Value *GetHeapSROAValue(Value *V, unsigned FieldNo, Result = PHINode::Create(PointerType::getUnqual(ST->getElementType(FieldNo)), - PN->getName()+".f"+FieldNo, PN); + PN->getName()+".f"+Twine(FieldNo), PN); PHIsToRewrite.push_back(std::make_pair(PN, FieldNo)); } else { llvm_unreachable("Unknown usable value"); @@ -1287,12 +1287,12 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, MallocInst *MI, new GlobalVariable(*GV->getParent(), PFieldTy, false, GlobalValue::InternalLinkage, Context.getNullValue(PFieldTy), - GV->getName() + ".f" + FieldNo, GV, + GV->getName() + ".f" + Twine(FieldNo), GV, GV->isThreadLocal()); FieldGlobals.push_back(NGV); MallocInst *NMI = new MallocInst(FieldTy, MI->getArraySize(), - MI->getName() + ".f" + FieldNo,MI); + MI->getName() + ".f" + Twine(FieldNo), MI); FieldMallocs.push_back(NMI); new StoreInst(NMI, NGV, MI); } diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 6826494a5b2..7eec908ac58 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -335,7 +335,7 @@ void SROA::DoScalarReplacement(AllocationInst *AI, for (unsigned i = 0, e = ST->getNumContainedTypes(); i != e; ++i) { AllocaInst *NA = new AllocaInst(ST->getContainedType(i), 0, AI->getAlignment(), - AI->getName() + "." + i, AI); + AI->getName() + "." + Twine(i), AI); ElementAllocas.push_back(NA); WorkList.push_back(NA); // Add to worklist for recursive processing } @@ -345,7 +345,7 @@ void SROA::DoScalarReplacement(AllocationInst *AI, const Type *ElTy = AT->getElementType(); for (unsigned i = 0, e = AT->getNumElements(); i != e; ++i) { AllocaInst *NA = new AllocaInst(ElTy, 0, AI->getAlignment(), - AI->getName() + "." + i, AI); + AI->getName() + "." + Twine(i), AI); ElementAllocas.push_back(NA); WorkList.push_back(NA); // Add to worklist for recursive processing } @@ -776,7 +776,7 @@ void SROA::RewriteMemIntrinUserOfAlloca(MemIntrinsic *MI, Instruction *BCInst, if (OtherPtr) { Value *Idx[2] = { Zero, ConstantInt::get(Type::Int32Ty, i) }; OtherElt = GetElementPtrInst::Create(OtherPtr, Idx, Idx + 2, - OtherPtr->getNameStr()+"."+i, + OtherPtr->getNameStr()+"."+Twine(i), MI); uint64_t EltOffset; const PointerType *OtherPtrTy = cast(OtherPtr->getType()); diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index 7f8d2026e34..5645110db66 100644 --- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -867,7 +867,7 @@ bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo, // Create a PhiNode using the dereferenced type... and add the phi-node to the // BasicBlock. PN = PHINode::Create(Allocas[AllocaNo]->getAllocatedType(), - Allocas[AllocaNo]->getName() + "." + Version++, + Allocas[AllocaNo]->getName() + "." + Twine(Version++), BB->begin()); ++NumPHIInsert; PhiToAllocaMap[PN] = AllocaNo; diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index d00ff202ad0..45a1c8622aa 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -17,6 +17,32 @@ #include "Record.h" using namespace llvm; +static std::string FlattenVariants(const std::string &AsmString, + unsigned Index) { + StringRef Cur = AsmString; + std::string Res = ""; + + for (;;) { + std::pair Split = Cur.split('{'); + + Res += Split.first; + if (Split.second.empty()) + break; + + std::pair Inner = Cur.split('}'); + StringRef Selection = Inner.first; + for (unsigned i = 0; i != Index; ++i) + Selection = Selection.split('|').second; + Selection = Selection.split('|').first; + + Res += Selection; + + Cur = Inner.second; + } + + return Res; +} + void AsmMatcherEmitter::run(raw_ostream &OS) { CodeGenTarget Target; const std::vector &Registers = Target.getRegisters(); @@ -44,4 +70,29 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { } OS << " return true;\n"; OS << "}\n"; + + // Emit the function to match instructions. + std::vector NumberedInstructions; + Target.getInstructionsByEnumValue(NumberedInstructions); + + const std::map &Instructions = + Target.getInstructions(); + for (std::map::const_iterator + it = Instructions.begin(), ie = Instructions.end(); it != ie; ++it) { + const CodeGenInstruction &CGI = it->second; + + if (it->first != "SUB8rr") + continue; + + /* +def SUB8rr : I<0x28, MRMDestReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2), + "sub{b}\t{$src2, $dst|$dst, $src2}", + [(set GR8:$dst, (sub GR8:$src1, GR8:$src2)), + (implicit EFLAGS)]>; + */ + + outs() << it->first << " " + << FlattenVariants(CGI.AsmString, 0) + << "\n"; + } }