OSDN Git Service

Twines: Don't allow implicit conversion from integers, this is too tricky.
authorDaniel Dunbar <daniel@zuster.org>
Thu, 30 Jul 2009 17:37:43 +0000 (17:37 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 30 Jul 2009 17:37:43 +0000 (17:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77605 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/Twine.h
lib/Transforms/IPO/ArgumentPromotion.cpp
lib/Transforms/IPO/GlobalOpt.cpp
lib/Transforms/Scalar/ScalarReplAggregates.cpp
lib/Transforms/Utils/PromoteMemoryToRegister.cpp
utils/TableGen/AsmMatcherEmitter.cpp

index 3022812..6c4905e 100644 (file)
@@ -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) {
     }
 
index c31e0ef..69df497 100644 (file)
@@ -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);
       }
 
index 629edee..e0e5b60 100644 (file)
@@ -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<PHINode>(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);
   }
index 6826494..7eec908 100644 (file)
@@ -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<PointerType>(OtherPtr->getType());
index 7f8d202..5645110 100644 (file)
@@ -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;
index d00ff20..45a1c86 100644 (file)
 #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<StringRef, StringRef> Split = Cur.split('{');
+
+    Res += Split.first;
+    if (Split.second.empty())
+      break;
+
+    std::pair<StringRef, StringRef> 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<CodeGenRegister> &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<const CodeGenInstruction*> NumberedInstructions;
+  Target.getInstructionsByEnumValue(NumberedInstructions);
+
+  const std::map<std::string, CodeGenInstruction> &Instructions =
+    Target.getInstructions();
+  for (std::map<std::string, CodeGenInstruction>::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";
+  }
 }