Index: include/llvm/Intrinsics.td
===================================================================
--- include/llvm/Intrinsics.td	(revision 3710)
+++ include/llvm/Intrinsics.td	(working copy)
@@ -439,10 +439,10 @@
 // Target-specific intrinsics
 //===----------------------------------------------------------------------===//
 
-include "llvm/IntrinsicsPowerPC.td"
+//include "llvm/IntrinsicsPowerPC.td"
 include "llvm/IntrinsicsX86.td"
-include "llvm/IntrinsicsARM.td"
-include "llvm/IntrinsicsCellSPU.td"
-include "llvm/IntrinsicsAlpha.td"
-include "llvm/IntrinsicsXCore.td"
-include "llvm/IntrinsicsPTX.td"
+//include "llvm/IntrinsicsARM.td"
+//include "llvm/IntrinsicsCellSPU.td"
+//include "llvm/IntrinsicsAlpha.td"
+//include "llvm/IntrinsicsXCore.td"
+//include "llvm/IntrinsicsPTX.td"
Index: lib/Analysis/BasicAliasAnalysis.cpp
===================================================================
--- lib/Analysis/BasicAliasAnalysis.cpp	(revision 3710)
+++ lib/Analysis/BasicAliasAnalysis.cpp	(working copy)
@@ -785,27 +785,27 @@
         return NoModRef;
       break;
     }
-    case Intrinsic::arm_neon_vld1: {
-      // LLVM's vld1 and vst1 intrinsics currently only support a single
-      // vector register.
-      uint64_t Size =
-        TD ? TD->getTypeStoreSize(II->getType()) : UnknownSize;
-      if (isNoAlias(Location(II->getArgOperand(0), Size,
-                             II->getMetadata(LLVMContext::MD_tbaa)),
-                    Loc))
-        return NoModRef;
-      break;
+    //case Intrinsic::arm_neon_vld1: {
+    //  // LLVM's vld1 and vst1 intrinsics currently only support a single
+    //  // vector register.
+    //  uint64_t Size =
+    //    TD ? TD->getTypeStoreSize(II->getType()) : UnknownSize;
+    //  if (isNoAlias(Location(II->getArgOperand(0), Size,
+    //                         II->getMetadata(LLVMContext::MD_tbaa)),
+    //                Loc))
+    //    return NoModRef;
+    //  break;
+    //}
+    //case Intrinsic::arm_neon_vst1: {
+    //  uint64_t Size =
+    //    TD ? TD->getTypeStoreSize(II->getArgOperand(1)->getType()) : UnknownSize;
+    //  if (isNoAlias(Location(II->getArgOperand(0), Size,
+    //                         II->getMetadata(LLVMContext::MD_tbaa)),
+    //                Loc))
+    //    return NoModRef;
+    //  break;
+    //}
     }
-    case Intrinsic::arm_neon_vst1: {
-      uint64_t Size =
-        TD ? TD->getTypeStoreSize(II->getArgOperand(1)->getType()) : UnknownSize;
-      if (isNoAlias(Location(II->getArgOperand(0), Size,
-                             II->getMetadata(LLVMContext::MD_tbaa)),
-                    Loc))
-        return NoModRef;
-      break;
-    }
-    }
 
   // We can bound the aliasing properties of memset_pattern16 just as we can
   // for memcpy/memset.  This is particularly important because the 
Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCalls.cpp	(revision 3710)
+++ lib/Transforms/InstCombine/InstCombineCalls.cpp	(working copy)
@@ -544,25 +544,25 @@
       }
     }
     break;
-  case Intrinsic::ppc_altivec_lvx:
-  case Intrinsic::ppc_altivec_lvxl:
-    // Turn PPC lvx -> load if the pointer is known aligned.
-    if (getOrEnforceKnownAlignment(II->getArgOperand(0), 16, TD) >= 16) {
-      Value *Ptr = Builder->CreateBitCast(II->getArgOperand(0),
-                                         PointerType::getUnqual(II->getType()));
-      return new LoadInst(Ptr);
-    }
-    break;
-  case Intrinsic::ppc_altivec_stvx:
-  case Intrinsic::ppc_altivec_stvxl:
-    // Turn stvx -> store if the pointer is known aligned.
-    if (getOrEnforceKnownAlignment(II->getArgOperand(1), 16, TD) >= 16) {
-      Type *OpPtrTy = 
-        PointerType::getUnqual(II->getArgOperand(0)->getType());
-      Value *Ptr = Builder->CreateBitCast(II->getArgOperand(1), OpPtrTy);
-      return new StoreInst(II->getArgOperand(0), Ptr);
-    }
-    break;
+  //case Intrinsic::ppc_altivec_lvx:
+  //case Intrinsic::ppc_altivec_lvxl:
+  //  // Turn PPC lvx -> load if the pointer is known aligned.
+  //  if (getOrEnforceKnownAlignment(II->getArgOperand(0), 16, TD) >= 16) {
+  //    Value *Ptr = Builder->CreateBitCast(II->getArgOperand(0),
+  //                                       PointerType::getUnqual(II->getType()));
+  //    return new LoadInst(Ptr);
+  //  }
+  //  break;
+  //case Intrinsic::ppc_altivec_stvx:
+  //case Intrinsic::ppc_altivec_stvxl:
+  //  // Turn stvx -> store if the pointer is known aligned.
+  //  if (getOrEnforceKnownAlignment(II->getArgOperand(1), 16, TD) >= 16) {
+  //    Type *OpPtrTy = 
+  //      PointerType::getUnqual(II->getArgOperand(0)->getType());
+  //    Value *Ptr = Builder->CreateBitCast(II->getArgOperand(1), OpPtrTy);
+  //    return new StoreInst(II->getArgOperand(0), Ptr);
+  //  }
+  //  break;
   case Intrinsic::x86_sse_storeu_ps:
   case Intrinsic::x86_sse2_storeu_pd:
   case Intrinsic::x86_sse2_storeu_dq:
@@ -619,79 +619,79 @@
     break;
   }
 
-  case Intrinsic::ppc_altivec_vperm:
-    // Turn vperm(V1,V2,mask) -> shuffle(V1,V2,mask) if mask is a constant.
-    if (ConstantVector *Mask = dyn_cast<ConstantVector>(II->getArgOperand(2))) {
-      assert(Mask->getNumOperands() == 16 && "Bad type for intrinsic!");
-      
-      // Check that all of the elements are integer constants or undefs.
-      bool AllEltsOk = true;
-      for (unsigned i = 0; i != 16; ++i) {
-        if (!isa<ConstantInt>(Mask->getOperand(i)) && 
-            !isa<UndefValue>(Mask->getOperand(i))) {
-          AllEltsOk = false;
-          break;
-        }
-      }
-      
-      if (AllEltsOk) {
-        // Cast the input vectors to byte vectors.
-        Value *Op0 = Builder->CreateBitCast(II->getArgOperand(0),
-                                            Mask->getType());
-        Value *Op1 = Builder->CreateBitCast(II->getArgOperand(1),
-                                            Mask->getType());
-        Value *Result = UndefValue::get(Op0->getType());
-        
-        // Only extract each element once.
-        Value *ExtractedElts[32];
-        memset(ExtractedElts, 0, sizeof(ExtractedElts));
-        
-        for (unsigned i = 0; i != 16; ++i) {
-          if (isa<UndefValue>(Mask->getOperand(i)))
-            continue;
-          unsigned Idx=cast<ConstantInt>(Mask->getOperand(i))->getZExtValue();
-          Idx &= 31;  // Match the hardware behavior.
-          
-          if (ExtractedElts[Idx] == 0) {
-            ExtractedElts[Idx] = 
-              Builder->CreateExtractElement(Idx < 16 ? Op0 : Op1,
-                                            Builder->getInt32(Idx&15));
-          }
-        
-          // Insert this value into the result vector.
-          Result = Builder->CreateInsertElement(Result, ExtractedElts[Idx],
-                                                Builder->getInt32(i));
-        }
-        return CastInst::Create(Instruction::BitCast, Result, CI.getType());
-      }
-    }
-    break;
+  //case Intrinsic::ppc_altivec_vperm:
+  //  // Turn vperm(V1,V2,mask) -> shuffle(V1,V2,mask) if mask is a constant.
+  //  if (ConstantVector *Mask = dyn_cast<ConstantVector>(II->getArgOperand(2))) {
+  //    assert(Mask->getNumOperands() == 16 && "Bad type for intrinsic!");
+  //    
+  //    // Check that all of the elements are integer constants or undefs.
+  //    bool AllEltsOk = true;
+  //    for (unsigned i = 0; i != 16; ++i) {
+  //      if (!isa<ConstantInt>(Mask->getOperand(i)) && 
+  //          !isa<UndefValue>(Mask->getOperand(i))) {
+  //        AllEltsOk = false;
+  //        break;
+  //      }
+  //    }
+  //    
+  //    if (AllEltsOk) {
+  //      // Cast the input vectors to byte vectors.
+  //      Value *Op0 = Builder->CreateBitCast(II->getArgOperand(0),
+  //                                          Mask->getType());
+  //      Value *Op1 = Builder->CreateBitCast(II->getArgOperand(1),
+  //                                          Mask->getType());
+  //      Value *Result = UndefValue::get(Op0->getType());
+  //      
+  //      // Only extract each element once.
+  //      Value *ExtractedElts[32];
+  //      memset(ExtractedElts, 0, sizeof(ExtractedElts));
+  //      
+  //      for (unsigned i = 0; i != 16; ++i) {
+  //        if (isa<UndefValue>(Mask->getOperand(i)))
+  //          continue;
+  //        unsigned Idx=cast<ConstantInt>(Mask->getOperand(i))->getZExtValue();
+  //        Idx &= 31;  // Match the hardware behavior.
+  //        
+  //        if (ExtractedElts[Idx] == 0) {
+  //          ExtractedElts[Idx] = 
+  //            Builder->CreateExtractElement(Idx < 16 ? Op0 : Op1,
+  //                                          Builder->getInt32(Idx&15));
+  //        }
+  //      
+  //        // Insert this value into the result vector.
+  //        Result = Builder->CreateInsertElement(Result, ExtractedElts[Idx],
+  //                                              Builder->getInt32(i));
+  //      }
+  //      return CastInst::Create(Instruction::BitCast, Result, CI.getType());
+  //    }
+  //  }
+  //  break;
 
-  case Intrinsic::arm_neon_vld1:
-  case Intrinsic::arm_neon_vld2:
-  case Intrinsic::arm_neon_vld3:
-  case Intrinsic::arm_neon_vld4:
-  case Intrinsic::arm_neon_vld2lane:
-  case Intrinsic::arm_neon_vld3lane:
-  case Intrinsic::arm_neon_vld4lane:
-  case Intrinsic::arm_neon_vst1:
-  case Intrinsic::arm_neon_vst2:
-  case Intrinsic::arm_neon_vst3:
-  case Intrinsic::arm_neon_vst4:
-  case Intrinsic::arm_neon_vst2lane:
-  case Intrinsic::arm_neon_vst3lane:
-  case Intrinsic::arm_neon_vst4lane: {
-    unsigned MemAlign = getKnownAlignment(II->getArgOperand(0), TD);
-    unsigned AlignArg = II->getNumArgOperands() - 1;
-    ConstantInt *IntrAlign = dyn_cast<ConstantInt>(II->getArgOperand(AlignArg));
-    if (IntrAlign && IntrAlign->getZExtValue() < MemAlign) {
-      II->setArgOperand(AlignArg,
-                        ConstantInt::get(Type::getInt32Ty(II->getContext()),
-                                         MemAlign, false));
-      return II;
-    }
-    break;
-  }
+  //case Intrinsic::arm_neon_vld1:
+  //case Intrinsic::arm_neon_vld2:
+  //case Intrinsic::arm_neon_vld3:
+  //case Intrinsic::arm_neon_vld4:
+  //case Intrinsic::arm_neon_vld2lane:
+  //case Intrinsic::arm_neon_vld3lane:
+  //case Intrinsic::arm_neon_vld4lane:
+  //case Intrinsic::arm_neon_vst1:
+  //case Intrinsic::arm_neon_vst2:
+  //case Intrinsic::arm_neon_vst3:
+  //case Intrinsic::arm_neon_vst4:
+  //case Intrinsic::arm_neon_vst2lane:
+  //case Intrinsic::arm_neon_vst3lane:
+  //case Intrinsic::arm_neon_vst4lane: {
+  //  unsigned MemAlign = getKnownAlignment(II->getArgOperand(0), TD);
+  //  unsigned AlignArg = II->getNumArgOperands() - 1;
+  //  ConstantInt *IntrAlign = dyn_cast<ConstantInt>(II->getArgOperand(AlignArg));
+  //  if (IntrAlign && IntrAlign->getZExtValue() < MemAlign) {
+  //    II->setArgOperand(AlignArg,
+  //                      ConstantInt::get(Type::getInt32Ty(II->getContext()),
+  //                                       MemAlign, false));
+  //    return II;
+  //  }
+  //  break;
+  //}
 
   case Intrinsic::stackrestore: {
     // If the save is right next to the restore, remove the restore.  This can
