Stub out shufflevector
[oota-llvm.git] / lib / CodeGen / SelectionDAG / SelectionDAGISel.cpp
index 96694da971a071d482b2a64ea263cbd0b41cfcf7..abdfc4afb609573a3b2db0a41de3c707872bbe48 100644 (file)
@@ -22,6 +22,7 @@
 #include "llvm/InlineAsm.h"
 #include "llvm/Instructions.h"
 #include "llvm/Intrinsics.h"
+#include "llvm/IntrinsicInst.h"
 #include "llvm/CodeGen/IntrinsicLowering.h"
 #include "llvm/CodeGen/MachineDebugInfo.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -53,8 +54,7 @@ static cl::opt<bool>
 ViewSchedDAGs("view-sched-dags", cl::Hidden,
           cl::desc("Pop up a window to show sched dags as they are processed"));
 #else
-static const bool ViewISelDAGs = 0;
-static const bool ViewSchedDAGs = 0;
+static const bool ViewISelDAGs = 0, ViewSchedDAGs = 0;
 #endif
 
 // Scheduling heuristics
@@ -171,28 +171,8 @@ namespace llvm {
       return RegMap->createVirtualRegister(TLI.getRegClassFor(VT));
     }
 
-    unsigned CreateRegForValue(const Value *V) {
-      MVT::ValueType VT = TLI.getValueType(V->getType());
-      // The common case is that we will only create one register for this
-      // value.  If we have that case, create and return the virtual register.
-      unsigned NV = TLI.getNumElements(VT);
-      if (NV == 1) {
-        // If we are promoting this value, pick the next largest supported type.
-        return MakeReg(TLI.getTypeToTransformTo(VT));
-      }
-
-      // If this value is represented with multiple target registers, make sure
-      // to create enough consecutive registers of the right (smaller) type.
-      unsigned NT = VT-1;  // Find the type to use.
-      while (TLI.getNumElements((MVT::ValueType)NT) != 1)
-        --NT;
-
-      unsigned R = MakeReg((MVT::ValueType)NT);
-      for (unsigned i = 1; i != NV; ++i)
-        MakeReg((MVT::ValueType)NT);
-      return R;
-    }
-
+    unsigned CreateRegForValue(const Value *V);
+    
     unsigned InitializeRegForValue(const Value *V) {
       unsigned &R = ValueMap[V];
       assert(R == 0 && "Already initialized this value register!");
@@ -202,22 +182,25 @@ namespace llvm {
 }
 
 /// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by
-/// PHI nodes or outside of the basic block that defines it.
+/// PHI nodes or outside of the basic block that defines it, or used by a 
+/// switch instruction, which may expand to multiple basic blocks.
 static bool isUsedOutsideOfDefiningBlock(Instruction *I) {
   if (isa<PHINode>(I)) return true;
   BasicBlock *BB = I->getParent();
   for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI)
-    if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI))
+    if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI) ||
+        isa<SwitchInst>(*UI))
       return true;
   return false;
 }
 
 /// isOnlyUsedInEntryBlock - If the specified argument is only used in the
-/// entry block, return true.
+/// entry block, return true.  This includes arguments used by switches, since
+/// the switch may expand into multiple basic blocks.
 static bool isOnlyUsedInEntryBlock(Argument *A) {
   BasicBlock *Entry = A->getParent()->begin();
   for (Value::use_iterator UI = A->use_begin(), E = A->use_end(); UI != E; ++UI)
-    if (cast<Instruction>(*UI)->getParent() != Entry)
+    if (cast<Instruction>(*UI)->getParent() != Entry || isa<SwitchInst>(*UI))
       return false;  // Use not in entry block.
   return true;
 }
@@ -280,8 +263,16 @@ FunctionLoweringInfo::FunctionLoweringInfo(TargetLowering &tli,
     for (BasicBlock::iterator I = BB->begin();
          (PN = dyn_cast<PHINode>(I)); ++I)
       if (!PN->use_empty()) {
-        unsigned NumElements =
-          TLI.getNumElements(TLI.getValueType(PN->getType()));
+        MVT::ValueType VT = TLI.getValueType(PN->getType());
+        unsigned NumElements;
+        if (VT != MVT::Vector)
+          NumElements = TLI.getNumElements(VT);
+        else {
+          MVT::ValueType VT1,VT2;
+          NumElements = 
+            TLI.getPackedTypeBreakdown(cast<PackedType>(PN->getType()),
+                                       VT1, VT2);
+        }
         unsigned PHIReg = ValueMap[PN];
         assert(PHIReg &&"PHI node does not have an assigned virtual register!");
         for (unsigned i = 0; i != NumElements; ++i)
@@ -290,7 +281,60 @@ FunctionLoweringInfo::FunctionLoweringInfo(TargetLowering &tli,
   }
 }
 
-
+/// CreateRegForValue - Allocate the appropriate number of virtual registers of
+/// the correctly promoted or expanded types.  Assign these registers
+/// consecutive vreg numbers and return the first assigned number.
+unsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) {
+  MVT::ValueType VT = TLI.getValueType(V->getType());
+  
+  // The number of multiples of registers that we need, to, e.g., split up
+  // a <2 x int64> -> 4 x i32 registers.
+  unsigned NumVectorRegs = 1;
+  
+  // If this is a packed type, figure out what type it will decompose into
+  // and how many of the elements it will use.
+  if (VT == MVT::Vector) {
+    const PackedType *PTy = cast<PackedType>(V->getType());
+    unsigned NumElts = PTy->getNumElements();
+    MVT::ValueType EltTy = TLI.getValueType(PTy->getElementType());
+    
+    // Divide the input until we get to a supported size.  This will always
+    // end with a scalar if the target doesn't support vectors.
+    while (NumElts > 1 && !TLI.isTypeLegal(getVectorType(EltTy, NumElts))) {
+      NumElts >>= 1;
+      NumVectorRegs <<= 1;
+    }
+    if (NumElts == 1)
+      VT = EltTy;
+    else
+      VT = getVectorType(EltTy, NumElts);
+  }
+  
+  // The common case is that we will only create one register for this
+  // value.  If we have that case, create and return the virtual register.
+  unsigned NV = TLI.getNumElements(VT);
+  if (NV == 1) {
+    // If we are promoting this value, pick the next largest supported type.
+    MVT::ValueType PromotedType = TLI.getTypeToTransformTo(VT);
+    unsigned Reg = MakeReg(PromotedType);
+    // If this is a vector of supported or promoted types (e.g. 4 x i16),
+    // create all of the registers.
+    for (unsigned i = 1; i != NumVectorRegs; ++i)
+      MakeReg(PromotedType);
+    return Reg;
+  }
+  
+  // If this value is represented with multiple target registers, make sure
+  // to create enough consecutive registers of the right (smaller) type.
+  unsigned NT = VT-1;  // Find the type to use.
+  while (TLI.getNumElements((MVT::ValueType)NT) != 1)
+    --NT;
+  
+  unsigned R = MakeReg((MVT::ValueType)NT);
+  for (unsigned i = 1; i != NV*NumVectorRegs; ++i)
+    MakeReg((MVT::ValueType)NT);
+  return R;
+}
 
 //===----------------------------------------------------------------------===//
 /// SelectionDAGLowering - This is the common target-independent lowering
@@ -309,6 +353,40 @@ class SelectionDAGLowering {
   /// analysis.
   std::vector<SDOperand> PendingLoads;
 
+  /// Case - A pair of values to record the Value for a switch case, and the
+  /// case's target basic block.  
+  typedef std::pair<Constant*, MachineBasicBlock*> Case;
+  typedef std::vector<Case>::iterator              CaseItr;
+  typedef std::pair<CaseItr, CaseItr>              CaseRange;
+
+  /// CaseRec - A struct with ctor used in lowering switches to a binary tree
+  /// of conditional branches.
+  struct CaseRec {
+    CaseRec(MachineBasicBlock *bb, Constant *lt, Constant *ge, CaseRange r) :
+    CaseBB(bb), LT(lt), GE(ge), Range(r) {}
+
+    /// CaseBB - The MBB in which to emit the compare and branch
+    MachineBasicBlock *CaseBB;
+    /// LT, GE - If nonzero, we know the current case value must be less-than or
+    /// greater-than-or-equal-to these Constants.
+    Constant *LT;
+    Constant *GE;
+    /// Range - A pair of iterators representing the range of case values to be
+    /// processed at this point in the binary search tree.
+    CaseRange Range;
+  };
+  
+  /// The comparison function for sorting Case values.
+  struct CaseCmp {
+    bool operator () (const Case& C1, const Case& C2) {
+      if (const ConstantUInt* U1 = dyn_cast<const ConstantUInt>(C1.first))
+        return U1->getValue() < cast<const ConstantUInt>(C2.first)->getValue();
+      
+      const ConstantSInt* S1 = dyn_cast<const ConstantSInt>(C1.first);
+      return S1->getValue() < cast<const ConstantSInt>(C2.first)->getValue();
+    }
+  };
+  
 public:
   // TLI - This is information that describes the available target features we
   // need for lowering.  This indicates when operations are unavailable,
@@ -317,6 +395,10 @@ public:
   SelectionDAG &DAG;
   const TargetData &TD;
 
+  /// SwitchCases - Vector of CaseBlock structures used to communicate
+  /// SwitchInst code generation information.
+  std::vector<SelectionDAGISel::CaseBlock> SwitchCases;
+  
   /// FuncInfo - Information about the function as a whole.
   ///
   FunctionLoweringInfo &FuncInfo;
@@ -362,115 +444,15 @@ public:
 
   void setCurrentBasicBlock(MachineBasicBlock *MBB) { CurMBB = MBB; }
 
+  SDOperand getLoadFrom(const Type *Ty, SDOperand Ptr,
+                        SDOperand SrcValue, SDOperand Root,
+                        bool isVolatile);
 
   SDOperand getIntPtrConstant(uint64_t Val) {
     return DAG.getConstant(Val, TLI.getPointerTy());
   }
 
-  SDOperand getValue(const Value *V) {
-    SDOperand &N = NodeMap[V];
-    if (N.Val) return N;
-
-    const Type *VTy = V->getType();
-    MVT::ValueType VT = TLI.getValueType(VTy);
-    if (Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V)))
-      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
-        visit(CE->getOpcode(), *CE);
-        assert(N.Val && "visit didn't populate the ValueMap!");
-        return N;
-      } else if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) {
-        return N = DAG.getGlobalAddress(GV, VT);
-      } else if (isa<ConstantPointerNull>(C)) {
-        return N = DAG.getConstant(0, TLI.getPointerTy());
-      } else if (isa<UndefValue>(C)) {
-        return N = DAG.getNode(ISD::UNDEF, VT);
-      } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
-        return N = DAG.getConstantFP(CFP->getValue(), VT);
-      } else if (const PackedType *PTy = dyn_cast<PackedType>(VTy)) {
-        unsigned NumElements = PTy->getNumElements();
-        MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
-        MVT::ValueType TVT = MVT::getVectorType(PVT, NumElements);
-        
-        // Now that we know the number and type of the elements, push a
-        // Constant or ConstantFP node onto the ops list for each element of
-        // the packed constant.
-        std::vector<SDOperand> Ops;
-        if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C)) {
-          if (MVT::isFloatingPoint(PVT)) {
-            for (unsigned i = 0; i != NumElements; ++i) {
-              const ConstantFP *El = cast<ConstantFP>(CP->getOperand(i));
-              Ops.push_back(DAG.getConstantFP(El->getValue(), PVT));
-            }
-          } else {
-            for (unsigned i = 0; i != NumElements; ++i) {
-              const ConstantIntegral *El = 
-                cast<ConstantIntegral>(CP->getOperand(i));
-              Ops.push_back(DAG.getConstant(El->getRawValue(), PVT));
-            }
-          }
-        } else {
-          assert(isa<ConstantAggregateZero>(C) && "Unknown packed constant!");
-          SDOperand Op;
-          if (MVT::isFloatingPoint(PVT))
-            Op = DAG.getConstantFP(0, PVT);
-          else
-            Op = DAG.getConstant(0, PVT);
-          Ops.assign(NumElements, Op);
-        }
-        
-        // Handle the case where we have a 1-element vector, in which
-        // case we want to immediately turn it into a scalar constant.
-        if (Ops.size() == 1) {
-          return N = Ops[0];
-        } else if (TVT != MVT::Other && TLI.isTypeLegal(TVT)) {
-          return N = DAG.getNode(ISD::ConstantVec, TVT, Ops);
-        } else {
-          // If the packed type isn't legal, then create a ConstantVec node with
-          // generic Vector type instead.
-          SDOperand Num = DAG.getConstant(NumElements, MVT::i32);
-          SDOperand Typ = DAG.getValueType(PVT);
-          Ops.insert(Ops.begin(), Typ);
-          Ops.insert(Ops.begin(), Num);
-          return N = DAG.getNode(ISD::VConstant, MVT::Vector, Ops);
-        }
-      } else {
-        // Canonicalize all constant ints to be unsigned.
-        return N = DAG.getConstant(cast<ConstantIntegral>(C)->getRawValue(),VT);
-      }
-
-    if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
-      std::map<const AllocaInst*, int>::iterator SI =
-        FuncInfo.StaticAllocaMap.find(AI);
-      if (SI != FuncInfo.StaticAllocaMap.end())
-        return DAG.getFrameIndex(SI->second, TLI.getPointerTy());
-    }
-
-    std::map<const Value*, unsigned>::const_iterator VMI =
-      FuncInfo.ValueMap.find(V);
-    assert(VMI != FuncInfo.ValueMap.end() && "Value not in map!");
-
-    unsigned InReg = VMI->second;
-   
-    // If this type is not legal, make it so now.
-    MVT::ValueType DestVT = TLI.getTypeToTransformTo(VT);
-    
-    N = DAG.getCopyFromReg(DAG.getEntryNode(), InReg, DestVT);
-    if (DestVT < VT) {
-      // Source must be expanded.  This input value is actually coming from the
-      // register pair VMI->second and VMI->second+1.
-      N = DAG.getNode(ISD::BUILD_PAIR, VT, N,
-                      DAG.getCopyFromReg(DAG.getEntryNode(), InReg+1, DestVT));
-    } else {
-      if (DestVT > VT) { // Promotion case
-        if (MVT::isFloatingPoint(VT))
-          N = DAG.getNode(ISD::FP_ROUND, VT, N);
-        else
-          N = DAG.getNode(ISD::TRUNCATE, VT, N);
-      }
-    }
-    
-    return N;
-  }
+  SDOperand getValue(const Value *V);
 
   const SDOperand &setValue(const Value *V, SDOperand NewN) {
     SDOperand &N = NodeMap[V];
@@ -483,20 +465,20 @@ public:
                                     bool OutReg, bool InReg,
                                     std::set<unsigned> &OutputRegs, 
                                     std::set<unsigned> &InputRegs);
-                                                
+
   // Terminator instructions.
   void visitRet(ReturnInst &I);
   void visitBr(BranchInst &I);
+  void visitSwitch(SwitchInst &I);
   void visitUnreachable(UnreachableInst &I) { /* noop */ }
 
+  // Helper for visitSwitch
+  void visitSwitchCase(SelectionDAGISel::CaseBlock &CB);
+  
   // These all get lowered before this pass.
-  void visitExtractElement(ExtractElementInst &I) { assert(0 && "TODO"); }
-  void visitInsertElement(InsertElementInst &I) { assert(0 && "TODO"); }
-  void visitSwitch(SwitchInst &I) { assert(0 && "TODO"); }
   void visitInvoke(InvokeInst &I) { assert(0 && "TODO"); }
   void visitUnwind(UnwindInst &I) { assert(0 && "TODO"); }
 
-  //
   void visitBinary(User &I, unsigned IntOp, unsigned FPOp, unsigned VecOp);
   void visitShift(User &I, unsigned Opcode);
   void visitAdd(User &I) { 
@@ -532,10 +514,13 @@ public:
   void visitSetLT(User &I) { visitSetCC(I, ISD::SETLT, ISD::SETULT); }
   void visitSetGT(User &I) { visitSetCC(I, ISD::SETGT, ISD::SETUGT); }
 
+  void visitExtractElement(User &I);
+  void visitInsertElement(User &I);
+  void visitShuffleVector(User &I) { assert(0 && "ShuffleVector not impl!"); }
+
   void visitGetElementPtr(User &I);
   void visitCast(User &I);
   void visitSelect(User &I);
-  //
 
   void visitMalloc(MallocInst &I);
   void visitFree(FreeInst &I);
@@ -546,6 +531,7 @@ public:
   void visitCall(CallInst &I);
   void visitInlineAsm(CallInst &I);
   const char *visitIntrinsicCall(CallInst &I, unsigned Intrinsic);
+  void visitTargetIntrinsic(CallInst &I, unsigned Intrinsic);
 
   void visitVAStart(CallInst &I);
   void visitVAArg(VAArgInst &I);
@@ -566,6 +552,153 @@ public:
 };
 } // end namespace llvm
 
+SDOperand SelectionDAGLowering::getValue(const Value *V) {
+  SDOperand &N = NodeMap[V];
+  if (N.Val) return N;
+  
+  const Type *VTy = V->getType();
+  MVT::ValueType VT = TLI.getValueType(VTy);
+  if (Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V))) {
+    if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
+      visit(CE->getOpcode(), *CE);
+      assert(N.Val && "visit didn't populate the ValueMap!");
+      return N;
+    } else if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) {
+      return N = DAG.getGlobalAddress(GV, VT);
+    } else if (isa<ConstantPointerNull>(C)) {
+      return N = DAG.getConstant(0, TLI.getPointerTy());
+    } else if (isa<UndefValue>(C)) {
+      if (!isa<PackedType>(VTy))
+        return N = DAG.getNode(ISD::UNDEF, VT);
+
+      // Create a VBUILD_VECTOR of undef nodes.
+      const PackedType *PTy = cast<PackedType>(VTy);
+      unsigned NumElements = PTy->getNumElements();
+      MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
+
+      std::vector<SDOperand> Ops;
+      Ops.assign(NumElements, DAG.getNode(ISD::UNDEF, PVT));
+      
+      // Create a VConstant node with generic Vector type.
+      Ops.push_back(DAG.getConstant(NumElements, MVT::i32));
+      Ops.push_back(DAG.getValueType(PVT));
+      return N = DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, Ops);
+    } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
+      return N = DAG.getConstantFP(CFP->getValue(), VT);
+    } else if (const PackedType *PTy = dyn_cast<PackedType>(VTy)) {
+      unsigned NumElements = PTy->getNumElements();
+      MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
+      
+      // Now that we know the number and type of the elements, push a
+      // Constant or ConstantFP node onto the ops list for each element of
+      // the packed constant.
+      std::vector<SDOperand> Ops;
+      if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C)) {
+        for (unsigned i = 0; i != NumElements; ++i)
+          Ops.push_back(getValue(CP->getOperand(i)));
+      } else {
+        assert(isa<ConstantAggregateZero>(C) && "Unknown packed constant!");
+        SDOperand Op;
+        if (MVT::isFloatingPoint(PVT))
+          Op = DAG.getConstantFP(0, PVT);
+        else
+          Op = DAG.getConstant(0, PVT);
+        Ops.assign(NumElements, Op);
+      }
+      
+      // Create a VBUILD_VECTOR node with generic Vector type.
+      Ops.push_back(DAG.getConstant(NumElements, MVT::i32));
+      Ops.push_back(DAG.getValueType(PVT));
+      return N = DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, Ops);
+    } else {
+      // Canonicalize all constant ints to be unsigned.
+      return N = DAG.getConstant(cast<ConstantIntegral>(C)->getRawValue(),VT);
+    }
+  }
+      
+  if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
+    std::map<const AllocaInst*, int>::iterator SI =
+    FuncInfo.StaticAllocaMap.find(AI);
+    if (SI != FuncInfo.StaticAllocaMap.end())
+      return DAG.getFrameIndex(SI->second, TLI.getPointerTy());
+  }
+      
+  std::map<const Value*, unsigned>::const_iterator VMI =
+      FuncInfo.ValueMap.find(V);
+  assert(VMI != FuncInfo.ValueMap.end() && "Value not in map!");
+  
+  unsigned InReg = VMI->second;
+  
+  // If this type is not legal, make it so now.
+  if (VT != MVT::Vector) {
+    MVT::ValueType DestVT = TLI.getTypeToTransformTo(VT);
+  
+    N = DAG.getCopyFromReg(DAG.getEntryNode(), InReg, DestVT);
+    if (DestVT < VT) {
+      // Source must be expanded.  This input value is actually coming from the
+      // register pair VMI->second and VMI->second+1.
+      N = DAG.getNode(ISD::BUILD_PAIR, VT, N,
+                      DAG.getCopyFromReg(DAG.getEntryNode(), InReg+1, DestVT));
+    } else if (DestVT > VT) { // Promotion case
+      if (MVT::isFloatingPoint(VT))
+        N = DAG.getNode(ISD::FP_ROUND, VT, N);
+      else
+        N = DAG.getNode(ISD::TRUNCATE, VT, N);
+    }
+  } else {
+    // Otherwise, if this is a vector, make it available as a generic vector
+    // here.
+    MVT::ValueType PTyElementVT, PTyLegalElementVT;
+    const PackedType *PTy = cast<PackedType>(VTy);
+    unsigned NE = TLI.getPackedTypeBreakdown(PTy, PTyElementVT,
+                                             PTyLegalElementVT);
+
+    // Build a VBUILD_VECTOR with the input registers.
+    std::vector<SDOperand> Ops;
+    if (PTyElementVT == PTyLegalElementVT) {
+      // If the value types are legal, just VBUILD the CopyFromReg nodes.
+      for (unsigned i = 0; i != NE; ++i)
+        Ops.push_back(DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, 
+                                         PTyElementVT));
+    } else if (PTyElementVT < PTyLegalElementVT) {
+      // If the register was promoted, use TRUNCATE of FP_ROUND as appropriate.
+      for (unsigned i = 0; i != NE; ++i) {
+        SDOperand Op = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, 
+                                          PTyElementVT);
+        if (MVT::isFloatingPoint(PTyElementVT))
+          Op = DAG.getNode(ISD::FP_ROUND, PTyElementVT, Op);
+        else
+          Op = DAG.getNode(ISD::TRUNCATE, PTyElementVT, Op);
+        Ops.push_back(Op);
+      }
+    } else {
+      // If the register was expanded, use BUILD_PAIR.
+      assert((NE & 1) == 0 && "Must expand into a multiple of 2 elements!");
+      for (unsigned i = 0; i != NE/2; ++i) {
+        SDOperand Op0 = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, 
+                                           PTyElementVT);
+        SDOperand Op1 = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, 
+                                           PTyElementVT);
+        Ops.push_back(DAG.getNode(ISD::BUILD_PAIR, VT, Op0, Op1));
+      }
+    }
+    
+    Ops.push_back(DAG.getConstant(NE, MVT::i32));
+    Ops.push_back(DAG.getValueType(PTyLegalElementVT));
+    N = DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, Ops);
+    
+    // Finally, use a VBIT_CONVERT to make this available as the appropriate
+    // vector type.
+    N = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, N, 
+                    DAG.getConstant(PTy->getNumElements(),
+                                    MVT::i32),
+                    DAG.getValueType(TLI.getValueType(PTy->getElementType())));
+  }
+  
+  return N;
+}
+
+
 void SelectionDAGLowering::visitRet(ReturnInst &I) {
   if (I.getNumOperands() == 0) {
     DAG.setRoot(DAG.getNode(ISD::RET, MVT::Other, getRoot()));
@@ -600,6 +733,7 @@ void SelectionDAGLowering::visitRet(ReturnInst &I) {
 void SelectionDAGLowering::visitBr(BranchInst &I) {
   // Update machine-CFG edges.
   MachineBasicBlock *Succ0MBB = FuncInfo.MBBMap[I.getSuccessor(0)];
+  CurMBB->addSuccessor(Succ0MBB);
 
   // Figure out which block is immediately after the current one.
   MachineBasicBlock *NextBlock = 0;
@@ -614,6 +748,7 @@ void SelectionDAGLowering::visitBr(BranchInst &I) {
                               DAG.getBasicBlock(Succ0MBB)));
   } else {
     MachineBasicBlock *Succ1MBB = FuncInfo.MBBMap[I.getSuccessor(1)];
+    CurMBB->addSuccessor(Succ1MBB);
 
     SDOperand Cond = getValue(I.getCondition());
     if (Succ1MBB == NextBlock) {
@@ -640,10 +775,165 @@ void SelectionDAGLowering::visitBr(BranchInst &I) {
         SDOperand True = DAG.getConstant(1, Cond.getValueType());
         Cond = DAG.getNode(ISD::XOR, Cond.getValueType(), Cond, True);
       }
-      Ops.push_back(Cond);
-      Ops.push_back(DAG.getBasicBlock(Succ0MBB));
-      Ops.push_back(DAG.getBasicBlock(Succ1MBB));
-      DAG.setRoot(DAG.getNode(ISD::BRCONDTWOWAY, MVT::Other, Ops));
+      SDOperand True = DAG.getNode(ISD::BRCOND, MVT::Other, getRoot(), Cond,
+                                   DAG.getBasicBlock(Succ0MBB));
+      DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, True, 
+                              DAG.getBasicBlock(Succ1MBB)));
+    }
+  }
+}
+
+/// visitSwitchCase - Emits the necessary code to represent a single node in
+/// the binary search tree resulting from lowering a switch instruction.
+void SelectionDAGLowering::visitSwitchCase(SelectionDAGISel::CaseBlock &CB) {
+  SDOperand SwitchOp = getValue(CB.SwitchV);
+  SDOperand CaseOp = getValue(CB.CaseC);
+  SDOperand Cond = DAG.getSetCC(MVT::i1, SwitchOp, CaseOp, CB.CC);
+  
+  // Set NextBlock to be the MBB immediately after the current one, if any.
+  // This is used to avoid emitting unnecessary branches to the next block.
+  MachineBasicBlock *NextBlock = 0;
+  MachineFunction::iterator BBI = CurMBB;
+  if (++BBI != CurMBB->getParent()->end())
+    NextBlock = BBI;
+  
+  // If the lhs block is the next block, invert the condition so that we can
+  // fall through to the lhs instead of the rhs block.
+  if (CB.LHSBB == NextBlock) {
+    std::swap(CB.LHSBB, CB.RHSBB);
+    SDOperand True = DAG.getConstant(1, Cond.getValueType());
+    Cond = DAG.getNode(ISD::XOR, Cond.getValueType(), Cond, True);
+  }
+  SDOperand BrCond = DAG.getNode(ISD::BRCOND, MVT::Other, getRoot(), Cond,
+                                 DAG.getBasicBlock(CB.LHSBB));
+  if (CB.RHSBB == NextBlock)
+    DAG.setRoot(BrCond);
+  else
+    DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, BrCond, 
+                            DAG.getBasicBlock(CB.RHSBB)));
+  // Update successor info
+  CurMBB->addSuccessor(CB.LHSBB);
+  CurMBB->addSuccessor(CB.RHSBB);
+}
+
+void SelectionDAGLowering::visitSwitch(SwitchInst &I) {
+  // Figure out which block is immediately after the current one.
+  MachineBasicBlock *NextBlock = 0;
+  MachineFunction::iterator BBI = CurMBB;
+  if (++BBI != CurMBB->getParent()->end())
+    NextBlock = BBI;
+  
+  // If there is only the default destination, branch to it if it is not the
+  // next basic block.  Otherwise, just fall through.
+  if (I.getNumOperands() == 2) {
+    // Update machine-CFG edges.
+    MachineBasicBlock *DefaultMBB = FuncInfo.MBBMap[I.getDefaultDest()];
+    // If this is not a fall-through branch, emit the branch.
+    if (DefaultMBB != NextBlock)
+      DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(),
+                              DAG.getBasicBlock(DefaultMBB)));
+    return;
+  }
+  
+  // If there are any non-default case statements, create a vector of Cases
+  // representing each one, and sort the vector so that we can efficiently
+  // create a binary search tree from them.
+  std::vector<Case> Cases;
+  for (unsigned i = 1; i < I.getNumSuccessors(); ++i) {
+    MachineBasicBlock *SMBB = FuncInfo.MBBMap[I.getSuccessor(i)];
+    Cases.push_back(Case(I.getSuccessorValue(i), SMBB));
+  }
+  std::sort(Cases.begin(), Cases.end(), CaseCmp());
+  
+  // Get the Value to be switched on and default basic blocks, which will be
+  // inserted into CaseBlock records, representing basic blocks in the binary
+  // search tree.
+  Value *SV = I.getOperand(0);
+  MachineBasicBlock *Default = FuncInfo.MBBMap[I.getDefaultDest()];
+  
+  // Get the current MachineFunction and LLVM basic block, for use in creating
+  // and inserting new MBBs during the creation of the binary search tree.
+  MachineFunction *CurMF = CurMBB->getParent();
+  const BasicBlock *LLVMBB = CurMBB->getBasicBlock();
+  
+  // Push the initial CaseRec onto the worklist
+  std::vector<CaseRec> CaseVec;
+  CaseVec.push_back(CaseRec(CurMBB,0,0,CaseRange(Cases.begin(),Cases.end())));
+  
+  while (!CaseVec.empty()) {
+    // Grab a record representing a case range to process off the worklist
+    CaseRec CR = CaseVec.back();
+    CaseVec.pop_back();
+    
+    // Size is the number of Cases represented by this range.  If Size is 1,
+    // then we are processing a leaf of the binary search tree.  Otherwise,
+    // we need to pick a pivot, and push left and right ranges onto the 
+    // worklist.
+    unsigned Size = CR.Range.second - CR.Range.first;
+    
+    if (Size == 1) {
+      // Create a CaseBlock record representing a conditional branch to
+      // the Case's target mbb if the value being switched on SV is equal
+      // to C.  Otherwise, branch to default.
+      Constant *C = CR.Range.first->first;
+      MachineBasicBlock *Target = CR.Range.first->second;
+      SelectionDAGISel::CaseBlock CB(ISD::SETEQ, SV, C, Target, Default, 
+                                     CR.CaseBB);
+      // If the MBB representing the leaf node is the current MBB, then just
+      // call visitSwitchCase to emit the code into the current block.
+      // Otherwise, push the CaseBlock onto the vector to be later processed
+      // by SDISel, and insert the node's MBB before the next MBB.
+      if (CR.CaseBB == CurMBB)
+        visitSwitchCase(CB);
+      else {
+        SwitchCases.push_back(CB);
+        CurMF->getBasicBlockList().insert(BBI, CR.CaseBB);
+      }
+    } else {
+      // split case range at pivot
+      CaseItr Pivot = CR.Range.first + (Size / 2);
+      CaseRange LHSR(CR.Range.first, Pivot);
+      CaseRange RHSR(Pivot, CR.Range.second);
+      Constant *C = Pivot->first;
+      MachineBasicBlock *RHSBB = 0, *LHSBB = 0;
+      // We know that we branch to the LHS if the Value being switched on is
+      // less than the Pivot value, C.  We use this to optimize our binary 
+      // tree a bit, by recognizing that if SV is greater than or equal to the
+      // LHS's Case Value, and that Case Value is exactly one less than the 
+      // Pivot's Value, then we can branch directly to the LHS's Target,
+      // rather than creating a leaf node for it.
+      if ((LHSR.second - LHSR.first) == 1 &&
+          LHSR.first->first == CR.GE &&
+          cast<ConstantIntegral>(C)->getRawValue() ==
+          (cast<ConstantIntegral>(CR.GE)->getRawValue() + 1ULL)) {
+        LHSBB = LHSR.first->second;
+      } else {
+        LHSBB = new MachineBasicBlock(LLVMBB);
+        CaseVec.push_back(CaseRec(LHSBB,C,CR.GE,LHSR));
+      }
+      // Similar to the optimization above, if the Value being switched on is
+      // known to be less than the Constant CR.LT, and the current Case Value
+      // is CR.LT - 1, then we can branch directly to the target block for
+      // the current Case Value, rather than emitting a RHS leaf node for it.
+      if ((RHSR.second - RHSR.first) == 1 && CR.LT &&
+          cast<ConstantIntegral>(RHSR.first->first)->getRawValue() ==
+          (cast<ConstantIntegral>(CR.LT)->getRawValue() - 1ULL)) {
+        RHSBB = RHSR.first->second;
+      } else {
+        RHSBB = new MachineBasicBlock(LLVMBB);
+        CaseVec.push_back(CaseRec(RHSBB,CR.LT,C,RHSR));
+      }
+      // Create a CaseBlock record representing a conditional branch to
+      // the LHS node if the value being switched on SV is less than C. 
+      // Otherwise, branch to LHS.
+      ISD::CondCode CC = C->getType()->isSigned() ? ISD::SETLT : ISD::SETULT;
+      SelectionDAGISel::CaseBlock CB(CC, SV, C, LHSBB, RHSBB, CR.CaseBB);
+      if (CR.CaseBB == CurMBB)
+        visitSwitchCase(CB);
+      else {
+        SwitchCases.push_back(CB);
+        CurMF->getBasicBlockList().insert(BBI, CR.CaseBB);
+      }
     }
   }
 }
@@ -673,27 +963,9 @@ void SelectionDAGLowering::visitBinary(User &I, unsigned IntOp, unsigned FPOp,
     setValue(&I, DAG.getNode(FPOp, Op1.getValueType(), Op1, Op2));
   } else {
     const PackedType *PTy = cast<PackedType>(Ty);
-    unsigned NumElements = PTy->getNumElements();
-    MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
-    MVT::ValueType TVT = MVT::getVectorType(PVT, NumElements);
-    
-    // Immediately scalarize packed types containing only one element, so that
-    // the Legalize pass does not have to deal with them.  Similarly, if the
-    // abstract vector is going to turn into one that the target natively
-    // supports, generate that type now so that Legalize doesn't have to deal
-    // with that either.  These steps ensure that Legalize only has to handle
-    // vector types in its Expand case.
-    unsigned Opc = MVT::isFloatingPoint(PVT) ? FPOp : IntOp;
-    if (NumElements == 1) {
-      setValue(&I, DAG.getNode(Opc, PVT, Op1, Op2));
-    } else if (TVT != MVT::Other &&
-               TLI.isTypeLegal(TVT) && TLI.isOperationLegal(Opc, TVT)) {
-      setValue(&I, DAG.getNode(Opc, TVT, Op1, Op2));
-    } else {
-      SDOperand Num = DAG.getConstant(NumElements, MVT::i32);
-      SDOperand Typ = DAG.getValueType(PVT);
-      setValue(&I, DAG.getNode(VecOp, MVT::Vector, Num, Typ, Op1, Op2));
-    }
+    SDOperand Num = DAG.getConstant(PTy->getNumElements(), MVT::i32);
+    SDOperand Typ = DAG.getValueType(TLI.getValueType(PTy->getElementType()));
+    setValue(&I, DAG.getNode(VecOp, MVT::Vector, Op1, Op2, Num, Typ));
   }
 }
 
@@ -726,46 +998,84 @@ void SelectionDAGLowering::visitSelect(User &I) {
 
 void SelectionDAGLowering::visitCast(User &I) {
   SDOperand N = getValue(I.getOperand(0));
-  MVT::ValueType SrcTy = TLI.getValueType(I.getOperand(0)->getType());
-  MVT::ValueType DestTy = TLI.getValueType(I.getType());
-
-  if (N.getValueType() == DestTy) {
+  MVT::ValueType SrcVT = N.getValueType();
+  MVT::ValueType DestVT = TLI.getValueType(I.getType());
+
+  if (DestVT == MVT::Vector) {
+    // This is a cast to a vector from something else.  This is always a bit
+    // convert.  Get information about the input vector.
+    const PackedType *DestTy = cast<PackedType>(I.getType());
+    MVT::ValueType EltVT = TLI.getValueType(DestTy->getElementType());
+    setValue(&I, DAG.getNode(ISD::VBIT_CONVERT, DestVT, N, 
+                             DAG.getConstant(DestTy->getNumElements(),MVT::i32),
+                             DAG.getValueType(EltVT)));
+  } else if (SrcVT == DestVT) {
     setValue(&I, N);  // noop cast.
-  } else if (DestTy == MVT::i1) {
+  } else if (DestVT == MVT::i1) {
     // Cast to bool is a comparison against zero, not truncation to zero.
-    SDOperand Zero = isInteger(SrcTy) ? DAG.getConstant(0, N.getValueType()) :
+    SDOperand Zero = isInteger(SrcVT) ? DAG.getConstant(0, N.getValueType()) :
                                        DAG.getConstantFP(0.0, N.getValueType());
     setValue(&I, DAG.getSetCC(MVT::i1, N, Zero, ISD::SETNE));
-  } else if (isInteger(SrcTy)) {
-    if (isInteger(DestTy)) {        // Int -> Int cast
-      if (DestTy < SrcTy)   // Truncating cast?
-        setValue(&I, DAG.getNode(ISD::TRUNCATE, DestTy, N));
+  } else if (isInteger(SrcVT)) {
+    if (isInteger(DestVT)) {        // Int -> Int cast
+      if (DestVT < SrcVT)   // Truncating cast?
+        setValue(&I, DAG.getNode(ISD::TRUNCATE, DestVT, N));
       else if (I.getOperand(0)->getType()->isSigned())
-        setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, DestTy, N));
+        setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, DestVT, N));
       else
-        setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, DestTy, N));
-    } else {                        // Int -> FP cast
+        setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, DestVT, N));
+    } else if (isFloatingPoint(DestVT)) {           // Int -> FP cast
       if (I.getOperand(0)->getType()->isSigned())
-        setValue(&I, DAG.getNode(ISD::SINT_TO_FP, DestTy, N));
+        setValue(&I, DAG.getNode(ISD::SINT_TO_FP, DestVT, N));
       else
-        setValue(&I, DAG.getNode(ISD::UINT_TO_FP, DestTy, N));
+        setValue(&I, DAG.getNode(ISD::UINT_TO_FP, DestVT, N));
+    } else {
+      assert(0 && "Unknown cast!");
     }
-  } else {
-    assert(isFloatingPoint(SrcTy) && "Unknown value type!");
-    if (isFloatingPoint(DestTy)) {  // FP -> FP cast
-      if (DestTy < SrcTy)   // Rounding cast?
-        setValue(&I, DAG.getNode(ISD::FP_ROUND, DestTy, N));
+  } else if (isFloatingPoint(SrcVT)) {
+    if (isFloatingPoint(DestVT)) {  // FP -> FP cast
+      if (DestVT < SrcVT)   // Rounding cast?
+        setValue(&I, DAG.getNode(ISD::FP_ROUND, DestVT, N));
       else
-        setValue(&I, DAG.getNode(ISD::FP_EXTEND, DestTy, N));
-    } else {                        // FP -> Int cast.
+        setValue(&I, DAG.getNode(ISD::FP_EXTEND, DestVT, N));
+    } else if (isInteger(DestVT)) {        // FP -> Int cast.
       if (I.getType()->isSigned())
-        setValue(&I, DAG.getNode(ISD::FP_TO_SINT, DestTy, N));
+        setValue(&I, DAG.getNode(ISD::FP_TO_SINT, DestVT, N));
       else
-        setValue(&I, DAG.getNode(ISD::FP_TO_UINT, DestTy, N));
+        setValue(&I, DAG.getNode(ISD::FP_TO_UINT, DestVT, N));
+    } else {
+      assert(0 && "Unknown cast!");
     }
+  } else {
+    assert(SrcVT == MVT::Vector && "Unknown cast!");
+    assert(DestVT != MVT::Vector && "Casts to vector already handled!");
+    // This is a cast from a vector to something else.  This is always a bit
+    // convert.  Get information about the input vector.
+    setValue(&I, DAG.getNode(ISD::VBIT_CONVERT, DestVT, N));
   }
 }
 
+void SelectionDAGLowering::visitInsertElement(User &I) {
+  SDOperand InVec = getValue(I.getOperand(0));
+  SDOperand InVal = getValue(I.getOperand(1));
+  SDOperand InIdx = DAG.getNode(ISD::ZERO_EXTEND, TLI.getPointerTy(),
+                                getValue(I.getOperand(2)));
+
+  SDOperand Num = *(InVec.Val->op_end()-2);
+  SDOperand Typ = *(InVec.Val->op_end()-1);
+  setValue(&I, DAG.getNode(ISD::VINSERT_VECTOR_ELT, MVT::Vector,
+                           InVec, InVal, InIdx, Num, Typ));
+}
+
+void SelectionDAGLowering::visitExtractElement(User &I) {
+  SDOperand InVec = getValue(I.getOperand(0));
+  SDOperand InIdx = DAG.getNode(ISD::ZERO_EXTEND, TLI.getPointerTy(),
+                                getValue(I.getOperand(1)));
+  SDOperand Typ = *(InVec.Val->op_end()-1);
+  setValue(&I, DAG.getNode(ISD::VEXTRACT_VECTOR_ELT,
+                           TLI.getValueType(I.getType()), InVec, InIdx));
+}
+
 void SelectionDAGLowering::visitGetElementPtr(User &I) {
   SDOperand N = getValue(I.getOperand(0));
   const Type *Ty = I.getOperand(0)->getType();
@@ -893,36 +1203,28 @@ void SelectionDAGLowering::visitLoad(LoadInst &I) {
     // Do not serialize non-volatile loads against each other.
     Root = DAG.getRoot();
   }
-  
-  const Type *Ty = I.getType();
+
+  setValue(&I, getLoadFrom(I.getType(), Ptr, DAG.getSrcValue(I.getOperand(0)),
+                           Root, I.isVolatile()));
+}
+
+SDOperand SelectionDAGLowering::getLoadFrom(const Type *Ty, SDOperand Ptr,
+                                            SDOperand SrcValue, SDOperand Root,
+                                            bool isVolatile) {
   SDOperand L;
-  
   if (const PackedType *PTy = dyn_cast<PackedType>(Ty)) {
-    unsigned NumElements = PTy->getNumElements();
     MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
-    MVT::ValueType TVT = MVT::getVectorType(PVT, NumElements);
-    
-    // Immediately scalarize packed types containing only one element, so that
-    // the Legalize pass does not have to deal with them.
-    if (NumElements == 1) {
-      L = DAG.getLoad(PVT, Root, Ptr, DAG.getSrcValue(I.getOperand(0)));
-    } else if (TVT != MVT::Other &&
-               TLI.isTypeLegal(TVT) && TLI.isOperationLegal(ISD::LOAD, TVT)) {
-      L = DAG.getLoad(TVT, Root, Ptr, DAG.getSrcValue(I.getOperand(0)));
-    } else {
-      L = DAG.getVecLoad(NumElements, PVT, Root, Ptr, 
-                         DAG.getSrcValue(I.getOperand(0)));
-    }
+    L = DAG.getVecLoad(PTy->getNumElements(), PVT, Root, Ptr, SrcValue);
   } else {
-    L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, 
-                    DAG.getSrcValue(I.getOperand(0)));
+    L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, SrcValue);
   }
-  setValue(&I, L);
 
-  if (I.isVolatile())
+  if (isVolatile)
     DAG.setRoot(L.getValue(1));
   else
     PendingLoads.push_back(L.getValue(1));
+  
+  return L;
 }
 
 
@@ -934,12 +1236,118 @@ void SelectionDAGLowering::visitStore(StoreInst &I) {
                           DAG.getSrcValue(I.getOperand(1))));
 }
 
+/// IntrinsicCannotAccessMemory - Return true if the specified intrinsic cannot
+/// access memory and has no other side effects at all.
+static bool IntrinsicCannotAccessMemory(unsigned IntrinsicID) {
+#define GET_NO_MEMORY_INTRINSICS
+#include "llvm/Intrinsics.gen"
+#undef GET_NO_MEMORY_INTRINSICS
+  return false;
+}
+
+// IntrinsicOnlyReadsMemory - Return true if the specified intrinsic doesn't
+// have any side-effects or if it only reads memory.
+static bool IntrinsicOnlyReadsMemory(unsigned IntrinsicID) {
+#define GET_SIDE_EFFECT_INFO
+#include "llvm/Intrinsics.gen"
+#undef GET_SIDE_EFFECT_INFO
+  return false;
+}
+
+/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
+/// node.
+void SelectionDAGLowering::visitTargetIntrinsic(CallInst &I, 
+                                                unsigned Intrinsic) {
+  bool HasChain = !IntrinsicCannotAccessMemory(Intrinsic);
+  bool OnlyLoad = HasChain && IntrinsicOnlyReadsMemory(Intrinsic);
+  
+  // Build the operand list.
+  std::vector<SDOperand> Ops;
+  if (HasChain) {  // If this intrinsic has side-effects, chainify it.
+    if (OnlyLoad) {
+      // We don't need to serialize loads against other loads.
+      Ops.push_back(DAG.getRoot());
+    } else { 
+      Ops.push_back(getRoot());
+    }
+  }
+  
+  // Add the intrinsic ID as an integer operand.
+  Ops.push_back(DAG.getConstant(Intrinsic, TLI.getPointerTy()));
+
+  // Add all operands of the call to the operand list.
+  for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) {
+    SDOperand Op = getValue(I.getOperand(i));
+    
+    // If this is a vector type, force it to the right packed type.
+    if (Op.getValueType() == MVT::Vector) {
+      const PackedType *OpTy = cast<PackedType>(I.getOperand(i)->getType());
+      MVT::ValueType EltVT = TLI.getValueType(OpTy->getElementType());
+      
+      MVT::ValueType VVT = MVT::getVectorType(EltVT, OpTy->getNumElements());
+      assert(VVT != MVT::Other && "Intrinsic uses a non-legal type?");
+      Op = DAG.getNode(ISD::VBIT_CONVERT, VVT, Op);
+    }
+    
+    assert(TLI.isTypeLegal(Op.getValueType()) &&
+           "Intrinsic uses a non-legal type?");
+    Ops.push_back(Op);
+  }
+
+  std::vector<MVT::ValueType> VTs;
+  if (I.getType() != Type::VoidTy) {
+    MVT::ValueType VT = TLI.getValueType(I.getType());
+    if (VT == MVT::Vector) {
+      const PackedType *DestTy = cast<PackedType>(I.getType());
+      MVT::ValueType EltVT = TLI.getValueType(DestTy->getElementType());
+      
+      VT = MVT::getVectorType(EltVT, DestTy->getNumElements());
+      assert(VT != MVT::Other && "Intrinsic uses a non-legal type?");
+    }
+    
+    assert(TLI.isTypeLegal(VT) && "Intrinsic uses a non-legal type?");
+    VTs.push_back(VT);
+  }
+  if (HasChain)
+    VTs.push_back(MVT::Other);
+
+  // Create the node.
+  SDOperand Result;
+  if (!HasChain)
+    Result = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, VTs, Ops);
+  else if (I.getType() != Type::VoidTy)
+    Result = DAG.getNode(ISD::INTRINSIC_W_CHAIN, VTs, Ops);
+  else
+    Result = DAG.getNode(ISD::INTRINSIC_VOID, VTs, Ops);
+
+  if (HasChain) {
+    SDOperand Chain = Result.getValue(Result.Val->getNumValues()-1);
+    if (OnlyLoad)
+      PendingLoads.push_back(Chain);
+    else
+      DAG.setRoot(Chain);
+  }
+  if (I.getType() != Type::VoidTy) {
+    if (const PackedType *PTy = dyn_cast<PackedType>(I.getType())) {
+      MVT::ValueType EVT = TLI.getValueType(PTy->getElementType());
+      Result = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, Result,
+                           DAG.getConstant(PTy->getNumElements(), MVT::i32),
+                           DAG.getValueType(EVT));
+    } 
+    setValue(&I, Result);
+  }
+}
+
 /// visitIntrinsicCall - Lower the call to the specified intrinsic function.  If
 /// we want to emit this as a call to a named external function, return the name
 /// otherwise lower it and return null.
 const char *
 SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
   switch (Intrinsic) {
+  default:
+    // By default, turn this into a target intrinsic node.
+    visitTargetIntrinsic(I, Intrinsic);
+    return 0;
   case Intrinsic::vastart:  visitVAStart(I); return 0;
   case Intrinsic::vaend:    visitVAEnd(I); return 0;
   case Intrinsic::vacopy:   visitVACopy(I); return 0;
@@ -966,44 +1374,89 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
     
   case Intrinsic::dbg_stoppoint: {
     MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo();
-    if (DebugInfo &&  DebugInfo->Verify(I.getOperand(4))) {
+    DbgStopPointInst &SPI = cast<DbgStopPointInst>(I);
+    if (DebugInfo && SPI.getContext() && DebugInfo->Verify(SPI.getContext())) {
       std::vector<SDOperand> Ops;
 
-      // Input Chain
       Ops.push_back(getRoot());
-      
-      // line number
-      Ops.push_back(getValue(I.getOperand(2)));
-     
-      // column
-      Ops.push_back(getValue(I.getOperand(3)));
+      Ops.push_back(getValue(SPI.getLineValue()));
+      Ops.push_back(getValue(SPI.getColumnValue()));
 
-      DebugInfoDesc *DD = DebugInfo->getDescFor(I.getOperand(4));
+      DebugInfoDesc *DD = DebugInfo->getDescFor(SPI.getContext());
       assert(DD && "Not a debug information descriptor");
-      CompileUnitDesc *CompileUnit = dyn_cast<CompileUnitDesc>(DD);
-      assert(CompileUnit && "Not a compile unit");
+      CompileUnitDesc *CompileUnit = cast<CompileUnitDesc>(DD);
+      
       Ops.push_back(DAG.getString(CompileUnit->getFileName()));
       Ops.push_back(DAG.getString(CompileUnit->getDirectory()));
       
-      if (Ops.size() == 5)  // Found filename/workingdir.
-        DAG.setRoot(DAG.getNode(ISD::LOCATION, MVT::Other, Ops));
+      DAG.setRoot(DAG.getNode(ISD::LOCATION, MVT::Other, Ops));
     }
-    
-    setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType())));
+
     return 0;
   }
-  case Intrinsic::dbg_region_start:
-    if (I.getType() != Type::VoidTy)
-      setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType())));
+  case Intrinsic::dbg_region_start: {
+    MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo();
+    DbgRegionStartInst &RSI = cast<DbgRegionStartInst>(I);
+    if (DebugInfo && RSI.getContext() && DebugInfo->Verify(RSI.getContext())) {
+      std::vector<SDOperand> Ops;
+
+      unsigned LabelID = DebugInfo->RecordRegionStart(RSI.getContext());
+      
+      Ops.push_back(getRoot());
+      Ops.push_back(DAG.getConstant(LabelID, MVT::i32));
+
+      DAG.setRoot(DAG.getNode(ISD::DEBUG_LABEL, MVT::Other, Ops));
+    }
+
     return 0;
-  case Intrinsic::dbg_region_end:
-    if (I.getType() != Type::VoidTy)
-      setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType())));
+  }
+  case Intrinsic::dbg_region_end: {
+    MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo();
+    DbgRegionEndInst &REI = cast<DbgRegionEndInst>(I);
+    if (DebugInfo && REI.getContext() && DebugInfo->Verify(REI.getContext())) {
+      std::vector<SDOperand> Ops;
+
+      unsigned LabelID = DebugInfo->RecordRegionEnd(REI.getContext());
+      
+      Ops.push_back(getRoot());
+      Ops.push_back(DAG.getConstant(LabelID, MVT::i32));
+
+      DAG.setRoot(DAG.getNode(ISD::DEBUG_LABEL, MVT::Other, Ops));
+    }
+
     return 0;
-  case Intrinsic::dbg_func_start:
-    if (I.getType() != Type::VoidTy)
-      setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType())));
+  }
+  case Intrinsic::dbg_func_start: {
+    MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo();
+    DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
+    if (DebugInfo && FSI.getSubprogram() &&
+        DebugInfo->Verify(FSI.getSubprogram())) {
+      std::vector<SDOperand> Ops;
+
+      unsigned LabelID = DebugInfo->RecordRegionStart(FSI.getSubprogram());
+      
+      Ops.push_back(getRoot());
+      Ops.push_back(DAG.getConstant(LabelID, MVT::i32));
+
+      DAG.setRoot(DAG.getNode(ISD::DEBUG_LABEL, MVT::Other, Ops));
+    }
+
     return 0;
+  }
+  case Intrinsic::dbg_declare: {
+    MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo();
+    DbgDeclareInst &DI = cast<DbgDeclareInst>(I);
+    if (DebugInfo && DI.getVariable() && DebugInfo->Verify(DI.getVariable())) {
+      std::vector<SDOperand> Ops;
+
+      SDOperand AddressOp  = getValue(DI.getAddress());
+      if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(AddressOp)) {
+        DebugInfo->RecordVariable(DI.getVariable(), FI->getIndex());
+      }
+    }
+
+    return 0;
+  }
     
   case Intrinsic::isunordered_f32:
   case Intrinsic::isunordered_f64:
@@ -1083,10 +1536,6 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
   case Intrinsic::prefetch:
     // FIXME: Currently discarding prefetches.
     return 0;
-  default:
-    std::cerr << I;
-    assert(0 && "This intrinsic is not implemented yet!");
-    return 0;
   }
 }
 
@@ -1243,21 +1692,30 @@ void RegsForValue::AddInlineAsmOperands(unsigned Code, SelectionDAG &DAG,
 static const TargetRegisterClass *
 isAllocatableRegister(unsigned Reg, MachineFunction &MF,
                       const TargetLowering &TLI, const MRegisterInfo *MRI) {
+  MVT::ValueType FoundVT = MVT::Other;
+  const TargetRegisterClass *FoundRC = 0;
   for (MRegisterInfo::regclass_iterator RCI = MRI->regclass_begin(),
        E = MRI->regclass_end(); RCI != E; ++RCI) {
+    MVT::ValueType ThisVT = MVT::Other;
+
     const TargetRegisterClass *RC = *RCI;
     // If none of the the value types for this register class are valid, we 
     // can't use it.  For example, 64-bit reg classes on 32-bit targets.
-    bool isLegal = false;
     for (TargetRegisterClass::vt_iterator I = RC->vt_begin(), E = RC->vt_end();
          I != E; ++I) {
       if (TLI.isTypeLegal(*I)) {
-        isLegal = true;
-        break;
+        // If we have already found this register in a different register class,
+        // choose the one with the largest VT specified.  For example, on
+        // PowerPC, we favor f64 register classes over f32.
+        if (FoundVT == MVT::Other || 
+            MVT::getSizeInBits(FoundVT) < MVT::getSizeInBits(*I)) {
+          ThisVT = *I;
+          break;
+        }
       }
     }
     
-    if (!isLegal) continue;
+    if (ThisVT == MVT::Other) continue;
     
     // NOTE: This isn't ideal.  In particular, this might allocate the
     // frame pointer in functions that need it (due to them not being taken
@@ -1265,10 +1723,15 @@ isAllocatableRegister(unsigned Reg, MachineFunction &MF,
     // yet).  This is a slight code pessimization, but should still work.
     for (TargetRegisterClass::iterator I = RC->allocation_order_begin(MF),
          E = RC->allocation_order_end(MF); I != E; ++I)
-      if (*I == Reg)
-        return RC;
+      if (*I == Reg) {
+        // We found a matching register class.  Keep looking at others in case
+        // we find one with larger registers that this physreg is also in.
+        FoundRC = RC;
+        FoundVT = ThisVT;
+        break;
+      }
   }
-  return 0;
+  return FoundRC;
 }    
 
 RegsForValue SelectionDAGLowering::
@@ -1941,7 +2404,7 @@ void SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) {
         if (G) {
           GlobalVariable *GV = dyn_cast<GlobalVariable>(G->getGlobal());
           if (GV) {
-            Str = GV->getStringValue();
+            Str = GV->getStringValue(false);
             if (!Str.empty()) {
               CopyFromStr = true;
               SrcOff += SrcDelta;
@@ -2205,6 +2668,48 @@ CopyValueToVirtualRegister(SelectionDAGLowering &SDL, Value *V, unsigned Reg) {
   SelectionDAG &DAG = SDL.DAG;
   if (SrcVT == DestVT) {
     return DAG.getCopyToReg(SDL.getRoot(), Reg, Op);
+  } else if (SrcVT == MVT::Vector) {
+    // Handle copies from generic vectors to registers.
+    MVT::ValueType PTyElementVT, PTyLegalElementVT;
+    unsigned NE = TLI.getPackedTypeBreakdown(cast<PackedType>(V->getType()),
+                                             PTyElementVT, PTyLegalElementVT);
+    
+    // Insert a VBIT_CONVERT of the input vector to a "N x PTyElementVT" 
+    // MVT::Vector type.
+    Op = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, Op,
+                     DAG.getConstant(NE, MVT::i32), 
+                     DAG.getValueType(PTyElementVT));
+
+    // Loop over all of the elements of the resultant vector,
+    // VEXTRACT_VECTOR_ELT'ing them, converting them to PTyLegalElementVT, then
+    // copying them into output registers.
+    std::vector<SDOperand> OutChains;
+    SDOperand Root = SDL.getRoot();
+    for (unsigned i = 0; i != NE; ++i) {
+      SDOperand Elt = DAG.getNode(ISD::VEXTRACT_VECTOR_ELT, PTyElementVT,
+                                  Op, DAG.getConstant(i, MVT::i32));
+      if (PTyElementVT == PTyLegalElementVT) {
+        // Elements are legal.
+        OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Elt));
+      } else if (PTyLegalElementVT > PTyElementVT) {
+        // Elements are promoted.
+        if (MVT::isFloatingPoint(PTyLegalElementVT))
+          Elt = DAG.getNode(ISD::FP_EXTEND, PTyLegalElementVT, Elt);
+        else
+          Elt = DAG.getNode(ISD::ANY_EXTEND, PTyLegalElementVT, Elt);
+        OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Elt));
+      } else {
+        // Elements are expanded.
+        // The src value is expanded into multiple registers.
+        SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, PTyLegalElementVT,
+                                   Elt, DAG.getConstant(0, MVT::i32));
+        SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, PTyLegalElementVT,
+                                   Elt, DAG.getConstant(1, MVT::i32));
+        OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Lo));
+        OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Hi));
+      }
+    }
+    return DAG.getNode(ISD::TokenFactor, MVT::Other, OutChains);
   } else if (SrcVT < DestVT) {
     // The src value is promoted to the register.
     if (MVT::isFloatingPoint(SrcVT))
@@ -2267,7 +2772,7 @@ LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL,
 
 void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
        std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
-                                    FunctionLoweringInfo &FuncInfo) {
+                                         FunctionLoweringInfo &FuncInfo) {
   SelectionDAGLowering SDL(DAG, TLI, FuncInfo);
 
   std::vector<SDOperand> UnorderedChains;
@@ -2283,7 +2788,7 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
   for (BasicBlock::iterator I = LLVMBB->begin(), E = --LLVMBB->end();
        I != E; ++I)
     SDL.visit(*I);
-
+  
   // Ensure that all instructions which are used outside of their defining
   // blocks are available as virtual registers.
   for (BasicBlock::iterator I = LLVMBB->begin(), E = LLVMBB->end(); I != E;++I)
@@ -2343,8 +2848,16 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
 
         // Remember that this register needs to added to the machine PHI node as
         // the input for this MBB.
-        unsigned NumElements =
-          TLI.getNumElements(TLI.getValueType(PN->getType()));
+        MVT::ValueType VT = TLI.getValueType(PN->getType());
+        unsigned NumElements;
+        if (VT != MVT::Vector)
+          NumElements = TLI.getNumElements(VT);
+        else {
+          MVT::ValueType VT1,VT2;
+          NumElements = 
+            TLI.getPackedTypeBreakdown(cast<PackedType>(PN->getType()),
+                                       VT1, VT2);
+        }
         for (unsigned i = 0, e = NumElements; i != e; ++i)
           PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i));
       }
@@ -2371,33 +2884,29 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
   // Lower the terminator after the copies are emitted.
   SDL.visit(*LLVMBB->getTerminator());
 
+  // Copy over any CaseBlock records that may now exist due to SwitchInst
+  // lowering.
+  SwitchCases.clear();
+  SwitchCases = SDL.SwitchCases;
+  
   // Make sure the root of the DAG is up-to-date.
   DAG.setRoot(SDL.getRoot());
 }
 
-void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF,
-                                        FunctionLoweringInfo &FuncInfo) {
-  SelectionDAG DAG(TLI, MF, getAnalysisToUpdate<MachineDebugInfo>());
-  CurDAG = &DAG;
-  std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
-
-  // First step, lower LLVM code to some DAG.  This DAG may use operations and
-  // types that are not supported by the target.
-  BuildSelectionDAG(DAG, LLVMBB, PHINodesToUpdate, FuncInfo);
-
+void SelectionDAGISel::CodeGenAndEmitDAG(SelectionDAG &DAG) {
   // Run the DAG combiner in pre-legalize mode.
   DAG.Combine(false);
   
   DEBUG(std::cerr << "Lowered selection DAG:\n");
   DEBUG(DAG.dump());
-
+  
   // Second step, hack on the DAG until it only uses operations and types that
   // the target supports.
   DAG.Legalize();
-
+  
   DEBUG(std::cerr << "Legalized selection DAG:\n");
   DEBUG(DAG.dump());
-
+  
   // Run the DAG combiner in post-legalize mode.
   DAG.Combine(true);
   
@@ -2406,26 +2915,66 @@ void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF,
   // Third, instruction select all of the operations to machine code, adding the
   // code to the MachineBasicBlock.
   InstructionSelectBasicBlock(DAG);
-
+  
   DEBUG(std::cerr << "Selected machine code:\n");
   DEBUG(BB->dump());
+}  
+
+void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF,
+                                        FunctionLoweringInfo &FuncInfo) {
+  std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
+  {
+    SelectionDAG DAG(TLI, MF, getAnalysisToUpdate<MachineDebugInfo>());
+    CurDAG = &DAG;
+  
+    // First step, lower LLVM code to some DAG.  This DAG may use operations and
+    // types that are not supported by the target.
+    BuildSelectionDAG(DAG, LLVMBB, PHINodesToUpdate, FuncInfo);
 
+    // Second step, emit the lowered DAG as machine code.
+    CodeGenAndEmitDAG(DAG);
+  }
+  
   // Next, now that we know what the last MBB the LLVM BB expanded is, update
   // PHI nodes in successors.
-  for (unsigned i = 0, e = PHINodesToUpdate.size(); i != e; ++i) {
-    MachineInstr *PHI = PHINodesToUpdate[i].first;
-    assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
-           "This is not a machine PHI node that we are updating!");
-    PHI->addRegOperand(PHINodesToUpdate[i].second);
-    PHI->addMachineBasicBlockOperand(BB);
+  if (SwitchCases.empty()) {
+    for (unsigned i = 0, e = PHINodesToUpdate.size(); i != e; ++i) {
+      MachineInstr *PHI = PHINodesToUpdate[i].first;
+      assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
+             "This is not a machine PHI node that we are updating!");
+      PHI->addRegOperand(PHINodesToUpdate[i].second);
+      PHI->addMachineBasicBlockOperand(BB);
+    }
+    return;
   }
-
-  // Finally, add the CFG edges from the last selected MBB to the successor
-  // MBBs.
-  TerminatorInst *TI = LLVMBB->getTerminator();
-  for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
-    MachineBasicBlock *Succ0MBB = FuncInfo.MBBMap[TI->getSuccessor(i)];
-    BB->addSuccessor(Succ0MBB);
+  
+  // If we generated any switch lowering information, build and codegen any
+  // additional DAGs necessary.
+  for(unsigned i = 0, e = SwitchCases.size(); i != e; ++i) {
+    SelectionDAG SDAG(TLI, MF, getAnalysisToUpdate<MachineDebugInfo>());
+    CurDAG = &SDAG;
+    SelectionDAGLowering SDL(SDAG, TLI, FuncInfo);
+    // Set the current basic block to the mbb we wish to insert the code into
+    BB = SwitchCases[i].ThisBB;
+    SDL.setCurrentBasicBlock(BB);
+    // Emit the code
+    SDL.visitSwitchCase(SwitchCases[i]);
+    SDAG.setRoot(SDL.getRoot());
+    CodeGenAndEmitDAG(SDAG);
+    // Iterate over the phi nodes, if there is a phi node in a successor of this
+    // block (for instance, the default block), then add a pair of operands to
+    // the phi node for this block, as if we were coming from the original
+    // BB before switch expansion.
+    for (unsigned pi = 0, pe = PHINodesToUpdate.size(); pi != pe; ++pi) {
+      MachineInstr *PHI = PHINodesToUpdate[pi].first;
+      MachineBasicBlock *PHIBB = PHI->getParent();
+      assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
+             "This is not a machine PHI node that we are updating!");
+      if (PHIBB == SwitchCases[i].LHSBB || PHIBB == SwitchCases[i].RHSBB) {
+        PHI->addRegOperand(PHINodesToUpdate[pi].second);
+        PHI->addMachineBasicBlockOperand(BB);
+      }
+    }
   }
 }