Implement new helper methods for creating two-index GEP instructions
[oota-llvm.git] / lib / VMCore / Instruction.cpp
index b009c01eecb7cae95c16657e458b950949cad58f..1350f05b9b10f37d44f354b5a36bf093ad39e874 100644 (file)
 #include "Support/LeakDetector.h"
 using namespace llvm;
 
-Instruction::Instruction(const Type *ty, unsigned it, const std::string &Name,
-                         Instruction *InsertBefore)
-  : User(ty, Value::InstructionVal, Name) {
-  Parent = 0;
-  iType = it;
-
+void Instruction::init()
+{
   // Make sure that we get added to a basicblock
   LeakDetector::addGarbageObject(this);
+}
+
+Instruction::Instruction(const Type *ty, unsigned it, const std::string &Name,
+                         Instruction *InsertBefore)
+  : User(ty, Value::InstructionVal + it, Name), Parent(0) {
+  init();
 
   // If requested, insert this instruction into a basic block...
   if (InsertBefore) {
@@ -34,6 +36,20 @@ Instruction::Instruction(const Type *ty, unsigned it, const std::string &Name,
   }
 }
 
+Instruction::Instruction(const Type *ty, unsigned it, const std::string &Name,
+                         BasicBlock *InsertAtEnd)
+  : User(ty, Value::InstructionVal + it, Name), Parent(0) {
+  init();
+
+  // append this instruction into the basic block
+  assert(InsertAtEnd && "Basic block to append to may not be NULL!");
+  InsertAtEnd->getInstList().push_back(this);
+}
+
+void Instruction::setOpcode(unsigned opc) {
+  setValueType(Value::InstructionVal + opc);
+}
+
 void Instruction::setParent(BasicBlock *P) {
   if (getParent()) {
     if (!P) LeakDetector::addGarbageObject(this);
@@ -97,6 +113,7 @@ const char *Instruction::getOpcodeName(unsigned OpCode) {
   // Other instructions...
   case PHI:     return "phi";
   case Cast:    return "cast";
+  case Select:  return "select";
   case Call:    return "call";
   case Shl:     return "shl";
   case Shr:     return "shr";