diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index 1aad8cf..4f774ac 100644
--- a/lib/Analysis/DataStructure/DataStructure.cpp
+++ b/lib/Analysis/DataStructure/DataStructure.cpp
@@ -336,8 +336,8 @@
 
   // Check to see if we have a compatible, but different type...
   if (NewTySize == SubTypeSize) {
-    // Check to see if this type is obviously convertable... int -> uint f.e.
-    if (NewTy->isLosslesslyConvertableTo(SubType))
+    // Check to see if this type is obviously convertible... int -> uint f.e.
+    if (NewTy->isLosslesslyConvertibleTo(SubType))
       return false;
 
     // Check to see if we have a pointer & integer mismatch going on here,
diff --git a/lib/Analysis/Expressions.cpp b/lib/Analysis/Expressions.cpp
index bfab20c..513efe0 100644
--- a/lib/Analysis/Expressions.cpp
+++ b/lib/Analysis/Expressions.cpp
@@ -318,7 +318,7 @@
       DestTy = Type::ULongTy;  // Pointer types are represented as ulong
 
     /*
-    if (!Src.getExprType(0)->isLosslesslyConvertableTo(DestTy)) {
+    if (!Src.getExprType(0)->isLosslesslyConvertibleTo(DestTy)) {
       if (Src.ExprTy != ExprType::Constant)
         return I;  // Converting cast, and not a constant value...
     }
diff --git a/lib/Transforms/ExprTypeConvert.cpp b/lib/Transforms/ExprTypeConvert.cpp
index b132018..044e1ad 100644
--- a/lib/Transforms/ExprTypeConvert.cpp
+++ b/lib/Transforms/ExprTypeConvert.cpp
@@ -2,7 +2,7 @@
 //
 // This file implements the part of level raising that checks to see if it is
 // possible to coerce an entire expression tree into a different type.  If
-// convertable, other routines from this file will do the conversion.
+// convertible, other routines from this file will do the conversion.
 //
 //===----------------------------------------------------------------------===//
 
@@ -17,7 +17,7 @@
 #include <algorithm>
 using std::cerr;
 
-static bool OperandConvertableToType(User *U, Value *V, const Type *Ty,
+static bool OperandConvertibleToType(User *U, Value *V, const Type *Ty,
                                      ValueTypeCache &ConvertedTypes,
                                      const TargetData &TD);
 
@@ -35,7 +35,7 @@
 // If these conditions hold, we convert the malloc to allocate an [RTy]
 // element.  TODO: This comment is out of date WRT arrays
 //
-static bool MallocConvertableToType(MallocInst *MI, const Type *Ty,
+static bool MallocConvertibleToType(MallocInst *MI, const Type *Ty,
                                     ValueTypeCache &CTMap,
                                     const TargetData &TD) {
   if (!isa<PointerType>(Ty)) return false;   // Malloc always returns pointers
@@ -132,8 +132,8 @@
 }
 
 
-// ExpressionConvertableToType - Return true if it is possible
-bool ExpressionConvertableToType(Value *V, const Type *Ty,
+// ExpressionConvertibleToType - Return true if it is possible
+bool ExpressionConvertibleToType(Value *V, const Type *Ty,
                                  ValueTypeCache &CTMap, const TargetData &TD) {
   // Expression type must be holdable in a register.
   if (!Ty->isFirstClassType())
@@ -158,8 +158,8 @@
   switch (I->getOpcode()) {
   case Instruction::Cast:
     // We can convert the expr if the cast destination type is losslessly
-    // convertable to the requested type.
-    if (!Ty->isLosslesslyConvertableTo(I->getType())) return false;
+    // convertible to the requested type.
+    if (!Ty->isLosslesslyConvertibleTo(I->getType())) return false;
 
     // We also do not allow conversion of a cast that casts from a ptr to array
     // of X to a *X.  For example: cast [4 x %List *] * %val to %List * *
@@ -175,8 +175,8 @@
   case Instruction::Add:
   case Instruction::Sub:
     if (!Ty->isInteger() && !Ty->isFloatingPoint()) return false;
-    if (!ExpressionConvertableToType(I->getOperand(0), Ty, CTMap, TD) ||
-        !ExpressionConvertableToType(I->getOperand(1), Ty, CTMap, TD))
+    if (!ExpressionConvertibleToType(I->getOperand(0), Ty, CTMap, TD) ||
+        !ExpressionConvertibleToType(I->getOperand(1), Ty, CTMap, TD))
       return false;
     break;
   case Instruction::Shr:
@@ -185,13 +185,13 @@
     // FALL THROUGH
   case Instruction::Shl:
     if (!Ty->isInteger()) return false;
-    if (!ExpressionConvertableToType(I->getOperand(0), Ty, CTMap, TD))
+    if (!ExpressionConvertibleToType(I->getOperand(0), Ty, CTMap, TD))
       return false;
     break;
 
   case Instruction::Load: {
     LoadInst *LI = cast<LoadInst>(I);
-    if (!ExpressionConvertableToType(LI->getPointerOperand(),
+    if (!ExpressionConvertibleToType(LI->getPointerOperand(),
                                      PointerType::get(Ty), CTMap, TD))
       return false;
     break;                                     
@@ -199,18 +199,18 @@
   case Instruction::PHINode: {
     PHINode *PN = cast<PHINode>(I);
     for (unsigned i = 0; i < PN->getNumIncomingValues(); ++i)
-      if (!ExpressionConvertableToType(PN->getIncomingValue(i), Ty, CTMap, TD))
+      if (!ExpressionConvertibleToType(PN->getIncomingValue(i), Ty, CTMap, TD))
         return false;
     break;
   }
 
   case Instruction::Malloc:
-    if (!MallocConvertableToType(cast<MallocInst>(I), Ty, CTMap, TD))
+    if (!MallocConvertibleToType(cast<MallocInst>(I), Ty, CTMap, TD))
       return false;
     break;
 
   case Instruction::GetElementPtr: {
-    // GetElementPtr's are directly convertable to a pointer type if they have
+    // GetElementPtr's are directly convertible to a pointer type if they have
     // a number of zeros at the end.  Because removing these values does not
     // change the logical offset of the GEP, it is okay and fair to remove them.
     // This can change this:
@@ -261,9 +261,9 @@
       // the appropriate size... if so, allow it.
       //
       std::vector<Value*> Indices;
-      const Type *ElTy = ConvertableToGEP(PTy, I->getOperand(1), Indices, TD);
+      const Type *ElTy = ConvertibleToGEP(PTy, I->getOperand(1), Indices, TD);
       if (ElTy == PVTy) {
-        if (!ExpressionConvertableToType(I->getOperand(0),
+        if (!ExpressionConvertibleToType(I->getOperand(0),
                                          PointerType::get(ElTy), CTMap, TD))
           return false;  // Can't continue, ExConToTy might have polluted set!
         break;
@@ -281,7 +281,7 @@
         TD.getTypeSize(PTy->getElementType()) == 
         TD.getTypeSize(GEP->getType()->getElementType())) {
       const PointerType *NewSrcTy = PointerType::get(PVTy);
-      if (!ExpressionConvertableToType(I->getOperand(0), NewSrcTy, CTMap, TD))
+      if (!ExpressionConvertibleToType(I->getOperand(0), NewSrcTy, CTMap, TD))
         return false;
       break;
     }
@@ -302,7 +302,7 @@
                                      FT->getParamTypes().end());
     const FunctionType *NewTy =
       FunctionType::get(Ty, ArgTys, FT->isVarArg());
-    if (!ExpressionConvertableToType(I->getOperand(0),
+    if (!ExpressionConvertibleToType(I->getOperand(0),
                                      PointerType::get(NewTy), CTMap, TD))
       return false;
     break;
@@ -311,12 +311,12 @@
     return false;
   }
 
-  // Expressions are only convertable if all of the users of the expression can
+  // Expressions are only convertible if all of the users of the expression can
   // have this value converted.  This makes use of the map to avoid infinite
   // recursion.
   //
   for (Value::use_iterator It = I->use_begin(), E = I->use_end(); It != E; ++It)
-    if (!OperandConvertableToType(*It, I, Ty, CTMap, TD))
+    if (!OperandConvertibleToType(*It, I, Ty, CTMap, TD))
       return false;
 
   return true;
@@ -425,7 +425,7 @@
   }
 
   case Instruction::GetElementPtr: {
-    // GetElementPtr's are directly convertable to a pointer type if they have
+    // GetElementPtr's are directly convertible to a pointer type if they have
     // a number of zeros at the end.  Because removing these values does not
     // change the logical offset of the GEP, it is okay and fair to remove them.
     // This can change this:
@@ -471,7 +471,7 @@
       // the appropriate size... if so, allow it.
       //
       std::vector<Value*> Indices;
-      const Type *ElTy = ConvertableToGEP(NewSrcTy, I->getOperand(1),
+      const Type *ElTy = ConvertibleToGEP(NewSrcTy, I->getOperand(1),
                                           Indices, TD, &It);
       if (ElTy) {        
         assert(ElTy == PVTy && "Internal error, setup wrong!");
@@ -527,7 +527,7 @@
     break;
   }
   default:
-    assert(0 && "Expression convertable, but don't know how to convert?");
+    assert(0 && "Expression convertible, but don't know how to convert?");
     return 0;
   }
 
@@ -538,7 +538,7 @@
   // Add the instruction to the expression map
   VMC.ExprMap[I] = Res;
 
-  // Expressions are only convertable if all of the users of the expression can
+  // Expressions are only convertible if all of the users of the expression can
   // have this value converted.  This makes use of the map to avoid infinite
   // recursion.
   //
@@ -558,8 +558,8 @@
 
 
 
-// ValueConvertableToType - Return true if it is possible
-bool ValueConvertableToType(Value *V, const Type *Ty,
+// ValueConvertibleToType - Return true if it is possible
+bool ValueConvertibleToType(Value *V, const Type *Ty,
                              ValueTypeCache &ConvertedTypes,
                             const TargetData &TD) {
   ValueTypeCache::iterator I = ConvertedTypes.find(V);
@@ -571,7 +571,7 @@
   //
   if (V->getType() != Ty) {
     for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I)
-      if (!OperandConvertableToType(*I, V, Ty, ConvertedTypes, TD))
+      if (!OperandConvertibleToType(*I, V, Ty, ConvertedTypes, TD))
         return false;
   }
 
@@ -582,13 +582,13 @@
 
 
 
-// OperandConvertableToType - Return true if it is possible to convert operand
+// OperandConvertibleToType - Return true if it is possible to convert operand
 // V of User (instruction) U to the specified type.  This is true iff it is
 // possible to change the specified instruction to accept this.  CTMap is a map
 // of converted types, so that circular definitions will see the future type of
 // the expression, not the static current type.
 //
-static bool OperandConvertableToType(User *U, Value *V, const Type *Ty,
+static bool OperandConvertibleToType(User *U, Value *V, const Type *Ty,
                                      ValueTypeCache &CTMap,
                                      const TargetData &TD) {
   //  if (V->getType() == Ty) return true;   // Operand already the right type?
@@ -604,10 +604,10 @@
   case Instruction::Cast:
     assert(I->getOperand(0) == V);
     // We can convert the expr if the cast destination type is losslessly
-    // convertable to the requested type.
+    // convertible to the requested type.
     // Also, do not change a cast that is a noop cast.  For all intents and
     // purposes it should be eliminated.
-    if (!Ty->isLosslesslyConvertableTo(I->getOperand(0)->getType()) ||
+    if (!Ty->isLosslesslyConvertibleTo(I->getOperand(0)->getType()) ||
         I->getType() == I->getOperand(0)->getType())
       return false;
 
@@ -617,7 +617,7 @@
     // signedness doesn't change... or if the current cast is not a lossy
     // conversion.
     //
-    if (!I->getType()->isLosslesslyConvertableTo(I->getOperand(0)->getType()) &&
+    if (!I->getType()->isLosslesslyConvertibleTo(I->getOperand(0)->getType()) &&
         I->getOperand(0)->getType()->isSigned() != Ty->isSigned())
       return false;
 
@@ -636,15 +636,15 @@
     if (isa<PointerType>(Ty)) {
       Value *IndexVal = I->getOperand(V == I->getOperand(0) ? 1 : 0);
       std::vector<Value*> Indices;
-      if (const Type *ETy = ConvertableToGEP(Ty, IndexVal, Indices, TD)) {
+      if (const Type *ETy = ConvertibleToGEP(Ty, IndexVal, Indices, TD)) {
         const Type *RetTy = PointerType::get(ETy);
 
         // Only successful if we can convert this type to the required type
-        if (ValueConvertableToType(I, RetTy, CTMap, TD)) {
+        if (ValueConvertibleToType(I, RetTy, CTMap, TD)) {
           CTMap[I] = RetTy;
           return true;
         }
-        // We have to return failure here because ValueConvertableToType could 
+        // We have to return failure here because ValueConvertibleToType could 
         // have polluted our map
         return false;
       }
@@ -654,13 +654,13 @@
     if (!Ty->isInteger() && !Ty->isFloatingPoint()) return false;
 
     Value *OtherOp = I->getOperand((V == I->getOperand(0)) ? 1 : 0);
-    return ValueConvertableToType(I, Ty, CTMap, TD) &&
-           ExpressionConvertableToType(OtherOp, Ty, CTMap, TD);
+    return ValueConvertibleToType(I, Ty, CTMap, TD) &&
+           ExpressionConvertibleToType(OtherOp, Ty, CTMap, TD);
   }
   case Instruction::SetEQ:
   case Instruction::SetNE: {
     Value *OtherOp = I->getOperand((V == I->getOperand(0)) ? 1 : 0);
-    return ExpressionConvertableToType(OtherOp, Ty, CTMap, TD);
+    return ExpressionConvertibleToType(OtherOp, Ty, CTMap, TD);
   }
   case Instruction::Shr:
     if (Ty->isSigned() != V->getType()->isSigned()) return false;
@@ -668,7 +668,7 @@
   case Instruction::Shl:
     if (I->getOperand(1) == V) return false;  // Cannot change shift amount type
     if (!Ty->isInteger()) return false;
-    return ValueConvertableToType(I, Ty, CTMap, TD);
+    return ValueConvertibleToType(I, Ty, CTMap, TD);
 
   case Instruction::Free:
     assert(I->getOperand(0) == V);
@@ -697,7 +697,7 @@
       if (TD.getTypeSize(LoadedTy) != TD.getTypeSize(LI->getType()))
         return false;
 
-      return ValueConvertableToType(LI, LoadedTy, CTMap, TD);
+      return ValueConvertibleToType(LI, LoadedTy, CTMap, TD);
     }
     return false;
 
@@ -743,7 +743,7 @@
 
       // Can convert the store if we can convert the pointer operand to match
       // the new  value type...
-      return ExpressionConvertableToType(I->getOperand(1), PointerType::get(Ty),
+      return ExpressionConvertibleToType(I->getOperand(1), PointerType::get(Ty),
                                          CTMap, TD);
     } else if (const PointerType *PT = dyn_cast<PointerType>(Ty)) {
       const Type *ElTy = PT->getElementType();
@@ -766,8 +766,8 @@
           TD.getTypeSize(ElTy) != TD.getTypeSize(I->getOperand(0)->getType()))
         return false;
 
-      // Can convert store if the incoming value is convertable...
-      return ExpressionConvertableToType(I->getOperand(0), ElTy, CTMap, TD);
+      // Can convert store if the incoming value is convertible...
+      return ExpressionConvertibleToType(I->getOperand(0), ElTy, CTMap, TD);
     }
     return false;
   }
@@ -786,7 +786,7 @@
       Instruction *TempScale = 0;
 
       // If the old data element is not unit sized, we have to create a scale
-      // instruction so that ConvertableToGEP will know the REAL amount we are
+      // instruction so that ConvertibleToGEP will know the REAL amount we are
       // indexing by.  Note that this is never inserted into the instruction
       // stream, so we have to delete it when we're done.
       //
@@ -801,20 +801,20 @@
       // be converted to the appropriate size... if so, allow it.
       //
       std::vector<Value*> Indices;
-      const Type *ElTy = ConvertableToGEP(Ty, Index, Indices, TD);
+      const Type *ElTy = ConvertibleToGEP(Ty, Index, Indices, TD);
       delete TempScale;   // Free our temporary multiply if we made it
 
       if (ElTy == 0) return false;  // Cannot make conversion...
-      return ValueConvertableToType(I, PointerType::get(ElTy), CTMap, TD);
+      return ValueConvertibleToType(I, PointerType::get(ElTy), CTMap, TD);
     }
     return false;
 
   case Instruction::PHINode: {
     PHINode *PN = cast<PHINode>(I);
     for (unsigned i = 0; i < PN->getNumIncomingValues(); ++i)
-      if (!ExpressionConvertableToType(PN->getIncomingValue(i), Ty, CTMap, TD))
+      if (!ExpressionConvertibleToType(PN->getIncomingValue(i), Ty, CTMap, TD))
         return false;
-    return ValueConvertableToType(PN, Ty, CTMap, TD);
+    return ValueConvertibleToType(PN, Ty, CTMap, TD);
   }
 
   case Instruction::Call: {
@@ -851,21 +851,21 @@
 
       // Okay, at this point, we know that the call and the function type match
       // number of arguments.  Now we see if we can convert the arguments
-      // themselves.  Note that we do not require operands to be convertable,
+      // themselves.  Note that we do not require operands to be convertible,
       // we can insert casts if they are convertible but not compatible.  The
       // reason for this is that we prefer to have resolved functions but casted
       // arguments if possible.
       //
       const FunctionType::ParamTypes &PTs = FTy->getParamTypes();
       for (unsigned i = 0, NA = PTs.size(); i < NA; ++i)
-        if (!PTs[i]->isLosslesslyConvertableTo(I->getOperand(i+1)->getType()))
+        if (!PTs[i]->isLosslesslyConvertibleTo(I->getOperand(i+1)->getType()))
           return false;   // Operands must have compatible types!
 
       // Okay, at this point, we know that all of the arguments can be
       // converted.  We succeed if we can change the return type if
       // neccesary...
       //
-      return ValueConvertableToType(I, FTy->getReturnType(), CTMap, TD);
+      return ValueConvertibleToType(I, FTy->getReturnType(), CTMap, TD);
     }
     
     const PointerType *MPtr = cast<PointerType>(I->getOperand(0)->getType());
@@ -878,7 +878,7 @@
     // If we get this far, we know the value is in the varargs section of the
     // function!  We can convert if we don't reinterpret the value...
     //
-    return Ty->isLosslesslyConvertableTo(V->getType());
+    return Ty->isLosslesslyConvertibleTo(V->getType());
   }
   }
   return false;
@@ -912,7 +912,7 @@
     return;
 
 
-  Instruction *I = cast<Instruction>(U);  // Only Instructions convertable
+  Instruction *I = cast<Instruction>(U);  // Only Instructions convertible
 
   BasicBlock *BB = I->getParent();
   assert(BB != 0 && "Instruction not embedded in basic block!");
@@ -951,13 +951,13 @@
       std::vector<Value*> Indices;
       BasicBlock::iterator It = I;
 
-      if (const Type *ETy = ConvertableToGEP(NewTy, IndexVal, Indices, TD,&It)){
+      if (const Type *ETy = ConvertibleToGEP(NewTy, IndexVal, Indices, TD,&It)){
         // If successful, convert the add to a GEP
         //const Type *RetTy = PointerType::get(ETy);
         // First operand is actually the given pointer...
         Res = new GetElementPtrInst(NewVal, Indices, Name);
         assert(cast<PointerType>(Res->getType())->getElementType() == ETy &&
-               "ConvertableToGEP broken!");
+               "ConvertibleToGEP broken!");
         break;
       }
     }
@@ -1023,7 +1023,7 @@
       ValueMapCache::ExprMapTy::iterator VMCI =
         VMC.ExprMap.find(I->getOperand(1));
       if (VMCI != VMC.ExprMap.end()) {
-        // Comments describing this stuff are in the OperandConvertableToType
+        // Comments describing this stuff are in the OperandConvertibleToType
         // switch statement for Store...
         //
         const Type *ElTy =
@@ -1105,11 +1105,11 @@
     // Perform the conversion now...
     //
     std::vector<Value*> Indices;
-    const Type *ElTy = ConvertableToGEP(NewVal->getType(),Index,Indices,TD,&It);
+    const Type *ElTy = ConvertibleToGEP(NewVal->getType(),Index,Indices,TD,&It);
     assert(ElTy != 0 && "GEP Conversion Failure!");
     Res = new GetElementPtrInst(NewVal, Indices, Name);
     assert(Res->getType() == PointerType::get(ElTy) &&
-           "ConvertableToGet failed!");
+           "ConvertibleToGet failed!");
   }
 #if 0
     if (I->getType() == PointerType::get(Type::SByteTy)) {
@@ -1122,7 +1122,7 @@
       // be converted to the appropriate size... if so, allow it.
       //
       std::vector<Value*> Indices;
-      const Type *ElTy = ConvertableToGEP(NewVal->getType(), I->getOperand(1),
+      const Type *ElTy = ConvertibleToGEP(NewVal->getType(), I->getOperand(1),
                                           Indices, TD, &It);
       assert(ElTy != 0 && "GEP Conversion Failure!");
       
@@ -1169,7 +1169,7 @@
 
       // Get an iterator to the call instruction so that we can insert casts for
       // operands if needbe.  Note that we do not require operands to be
-      // convertable, we can insert casts if they are convertible but not
+      // convertible, we can insert casts if they are convertible but not
       // compatible.  The reason for this is that we prefer to have resolved
       // functions but casted arguments if possible.
       //
@@ -1200,7 +1200,7 @@
     break;
   }
   default:
-    assert(0 && "Expression convertable, but don't know how to convert?");
+    assert(0 && "Expression convertible, but don't know how to convert?");
     return;
   }
 
diff --git a/lib/Transforms/LevelRaise.cpp b/lib/Transforms/LevelRaise.cpp
index 01607e1..b678dff 100644
--- a/lib/Transforms/LevelRaise.cpp
+++ b/lib/Transforms/LevelRaise.cpp
@@ -90,7 +90,7 @@
 // cast instruction would cause the underlying bits to change.
 //
 static inline bool isReinterpretingCast(const CastInst *CI) {
-  return!CI->getOperand(0)->getType()->isLosslesslyConvertableTo(CI->getType());
+  return!CI->getOperand(0)->getType()->isLosslesslyConvertibleTo(CI->getType());
 }
 
 
@@ -127,8 +127,8 @@
 
   std::vector<Value*> Indices;
   Value *Src = CI.getOperand(0);
-  const Type *Result = ConvertableToGEP(DestPTy, Src, Indices, TD, &BI);
-  if (Result == 0) return false;  // Not convertable...
+  const Type *Result = ConvertibleToGEP(DestPTy, Src, Indices, TD, &BI);
+  if (Result == 0) return false;  // Not convertible...
 
   // Cannot handle subtracts if there is more than one index required...
   if (HasSubUse && Indices.size() != 1) return false;
@@ -212,8 +212,8 @@
     return false;
 
   std::vector<Value*> Indices;
-  if (!ConvertableToGEP(SrcPtr->getType(), OffsetVal, Indices, TD, &BI))
-    return false;  // Not convertable... perhaps next time
+  if (!ConvertibleToGEP(SrcPtr->getType(), OffsetVal, Indices, TD, &BI))
+    return false;  // Not convertible... perhaps next time
 
   if (getPointedToComposite(AddOp1->getType())) {  // case 1
     PRINT_PEEPHOLE2("add-to-gep1:in", AddOp2, *BI);
@@ -271,7 +271,7 @@
       // destination type of the cast...
       //
       ConvertedTypes[CI] = CI->getType();  // Make sure the cast doesn't change
-      if (ExpressionConvertableToType(Src, DestTy, ConvertedTypes, TD)) {
+      if (ExpressionConvertibleToType(Src, DestTy, ConvertedTypes, TD)) {
         PRINT_PEEPHOLE3("CAST-SRC-EXPR-CONV:in ", Src, CI, BB->getParent());
           
         DEBUG(cerr << "\nCONVERTING SRC EXPR TYPE:\n");
@@ -299,7 +299,7 @@
       ConvertedTypes.clear();
       // Make sure the source doesn't change type
       ConvertedTypes[Src] = Src->getType();
-      if (ValueConvertableToType(CI, Src->getType(), ConvertedTypes, TD)) {
+      if (ValueConvertibleToType(CI, Src->getType(), ConvertedTypes, TD)) {
         PRINT_PEEPHOLE3("CAST-DEST-EXPR-CONV:in ", Src, CI, BB->getParent());
 
         DEBUG(cerr << "\nCONVERTING EXPR TYPE:\n");
@@ -357,7 +357,7 @@
           }
 
         // If it doesn't have an add use, check to see if the dest type is
-        // losslessly convertable to one of the types in the start of the struct
+        // losslessly convertible to one of the types in the start of the struct
         // type.
         //
         if (!HasAddUse) {
@@ -386,7 +386,7 @@
             Indices.push_back(Constant::getNullValue(CurCTy->getIndexType()));
 
             // Did we find what we're looking for?
-            if (ElTy->isLosslesslyConvertableTo(DestPointedTy)) break;
+            if (ElTy->isLosslesslyConvertibleTo(DestPointedTy)) break;
             
             // Nope, go a level deeper.
             ++Depth;
@@ -421,7 +421,7 @@
     Value *Pointer = SI->getPointerOperand();
     
     // Peephole optimize the following instructions:
-    // %t = cast <T1>* %P to <T2> * ;; If T1 is losslessly convertable to T2
+    // %t = cast <T1>* %P to <T2> * ;; If T1 is losslessly convertible to T2
     // store <T2> %V, <T2>* %t
     //
     // Into: 
@@ -436,8 +436,8 @@
     if (CastInst *CI = dyn_cast<CastInst>(Pointer))
       if (Value *CastSrc = CI->getOperand(0)) // CSPT = CastSrcPointerType
         if (const PointerType *CSPT = dyn_cast<PointerType>(CastSrc->getType()))
-          // convertable types?
-          if (Val->getType()->isLosslesslyConvertableTo(CSPT->getElementType())) {
+          // convertible types?
+          if (Val->getType()->isLosslesslyConvertibleTo(CSPT->getElementType())) {
             PRINT_PEEPHOLE3("st-src-cast:in ", Pointer, Val, SI);
 
             // Insert the new T cast instruction... stealing old T's name
@@ -459,7 +459,7 @@
       cast<PointerType>(Pointer->getType())->getElementType();
     
     // Peephole optimize the following instructions:
-    // %Val = cast <T1>* to <T2>*    ;; If T1 is losslessly convertable to T2
+    // %Val = cast <T1>* to <T2>*    ;; If T1 is losslessly convertible to T2
     // %t = load <T2>* %P
     //
     // Into: 
@@ -474,8 +474,8 @@
     if (CastInst *CI = dyn_cast<CastInst>(Pointer))
       if (Value *CastSrc = CI->getOperand(0)) // CSPT = CastSrcPointerType
         if (const PointerType *CSPT = dyn_cast<PointerType>(CastSrc->getType()))
-          // convertable types?
-          if (PtrElType->isLosslesslyConvertableTo(CSPT->getElementType())) {
+          // convertible types?
+          if (PtrElType->isLosslesslyConvertibleTo(CSPT->getElementType())) {
             PRINT_PEEPHOLE2("load-src-cast:in ", Pointer, LI);
 
             // Create the new load instruction... loading the pre-casted value
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index d00cefd..d73ee1e 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -811,7 +811,7 @@
   // It is legal to eliminate the instruction if casting A->B->A if the sizes
   // are identical and the bits don't get reinterpreted (for example 
   // int->float->int would not be allowed)
-  if (SrcTy == DstTy && SrcTy->isLosslesslyConvertableTo(MidTy))
+  if (SrcTy == DstTy && SrcTy->isLosslesslyConvertibleTo(MidTy))
     return true;
 
   // Allow free casting and conversion of sizes as long as the sign doesn't
diff --git a/lib/Transforms/TransformInternals.cpp b/lib/Transforms/TransformInternals.cpp
index d3641e6..56c03b9 100644
--- a/lib/Transforms/TransformInternals.cpp
+++ b/lib/Transforms/TransformInternals.cpp
@@ -74,12 +74,12 @@
   return LeafTy;
 }
 
-// ConvertableToGEP - This function returns true if the specified value V is
+// ConvertibleToGEP - This function returns true if the specified value V is
 // a valid index into a pointer of type Ty.  If it is valid, Idx is filled in
 // with the values that would be appropriate to make this a getelementptr
 // instruction.  The type returned is the root type that the GEP would point to
 //
-const Type *ConvertableToGEP(const Type *Ty, Value *OffsetVal,
+const Type *ConvertibleToGEP(const Type *Ty, Value *OffsetVal,
                              std::vector<Value*> &Indices,
                              const TargetData &TD,
                              BasicBlock::iterator *BI) {
diff --git a/lib/Transforms/TransformInternals.h b/lib/Transforms/TransformInternals.h
index 9f6eb79..8cab429 100644
--- a/lib/Transforms/TransformInternals.h
+++ b/lib/Transforms/TransformInternals.h
@@ -30,7 +30,7 @@
   return PT ? dyn_cast<CompositeType>(PT->getElementType()) : 0;
 }
 
-// ConvertableToGEP - This function returns true if the specified value V is
+// ConvertibleToGEP - This function returns true if the specified value V is
 // a valid index into a pointer of type Ty.  If it is valid, Idx is filled in
 // with the values that would be appropriate to make this a getelementptr
 // instruction.  The type returned is the root type that the GEP would point
@@ -39,7 +39,7 @@
 // If BI is nonnull, cast instructions are inserted as appropriate for the
 // arguments of the getelementptr.
 //
-const Type *ConvertableToGEP(const Type *Ty, Value *V,
+const Type *ConvertibleToGEP(const Type *Ty, Value *V,
                              std::vector<Value*> &Indices,
                              const TargetData &TD,
                              BasicBlock::iterator *BI = 0);
@@ -105,13 +105,13 @@
 };
 
 
-bool ExpressionConvertableToType(Value *V, const Type *Ty, ValueTypeCache &Map,
+bool ExpressionConvertibleToType(Value *V, const Type *Ty, ValueTypeCache &Map,
                                  const TargetData &TD);
 Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC,
                                const TargetData &TD);
 
-// ValueConvertableToType - Return true if it is possible
-bool ValueConvertableToType(Value *V, const Type *Ty,
+// ValueConvertibleToType - Return true if it is possible
+bool ValueConvertibleToType(Value *V, const Type *Ty,
                             ValueTypeCache &ConvertedTypes,
                             const TargetData &TD);
 
diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp
index 398937a..2374493 100644
--- a/lib/VMCore/Type.cpp
+++ b/lib/VMCore/Type.cpp
@@ -82,10 +82,10 @@
   }
 }
 
-// isLosslesslyConvertableTo - Return true if this type can be converted to
+// isLosslesslyConvertibleTo - Return true if this type can be converted to
 // 'Ty' without any reinterpretation of bits.  For example, uint to int.
 //
-bool Type::isLosslesslyConvertableTo(const Type *Ty) const {
+bool Type::isLosslesslyConvertibleTo(const Type *Ty) const {
   if (this == Ty) return true;
   if ((!isPrimitiveType()    && !isa<PointerType>(this)) ||
       (!isa<PointerType>(Ty) && !Ty->isPrimitiveType())) return false;
