diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index 4c60248..a0ef03b 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -230,7 +230,7 @@
   Builder.CreateStore(Src.getScalarVal(), DstAddr);
 }
 
-void CodeGenFunction::EmitStoreThroughOCUComponentLValue(RValue Src, LValue Dst, 
+void CodeGenFunction::EmitStoreThroughOCUComponentLValue(RValue Src, LValue Dst,
                                                          QualType Ty) {
   // This access turns into a read/modify/write of the vector.  Load the input
   // value now.
@@ -392,9 +392,9 @@
     
     if (E->isArrow()) {
       QualType PTy = cast<PointerType>(BaseExpr->getType())->getPointeeType();
-      BaseValue =  Builder.CreateBitCast(BaseValue, 
-                                         llvm::PointerType::get(ConvertType(PTy)),
-                                         "tmp");
+      BaseValue =  
+        Builder.CreateBitCast(BaseValue, 
+                              llvm::PointerType::get(ConvertType(PTy)), "tmp");
     }
   } else
     BaseValue = EmitScalarExpr(BaseExpr);
@@ -408,7 +408,8 @@
   // Match union field type.
   if (BaseExpr->getType()->isUnionType()) {
     const llvm::Type * FieldTy = ConvertType(Field->getType());
-    const llvm::PointerType * BaseTy = cast<llvm::PointerType>(BaseValue->getType());
+    const llvm::PointerType * BaseTy = 
+      cast<llvm::PointerType>(BaseValue->getType());
     if (FieldTy != BaseTy->getElementType()) {
       V = Builder.CreateBitCast(V, llvm::PointerType::get(FieldTy), "tmp");
     }
diff --git a/CodeGen/CGExprAgg.cpp b/CodeGen/CGExprAgg.cpp
index 9e2368e..160f491 100644
--- a/CodeGen/CGExprAgg.cpp
+++ b/CodeGen/CGExprAgg.cpp
@@ -194,13 +194,15 @@
 
   std::vector<llvm::Constant*> ArrayElts;
   const llvm::PointerType *APType = cast<llvm::PointerType>(DestPtr->getType());
-  const llvm::ArrayType *AType = cast<llvm::ArrayType>(APType->getElementType());
+  const llvm::ArrayType *AType = 
+    cast<llvm::ArrayType>(APType->getElementType());
 
   // Copy initializer elements.
   bool AllConstElements = true;
   unsigned i = 0;
   for (i = 0; i < NumInitElements; ++i) {
-    if (llvm::Constant *C = dyn_cast<llvm::Constant>(CGF.EmitScalarExpr(E->getInit(i))))
+    if (llvm::Constant *C = 
+        dyn_cast<llvm::Constant>(CGF.EmitScalarExpr(E->getInit(i))))
       ArrayElts.push_back(C);
     else {
       AllConstElements = false;
diff --git a/CodeGen/CGExprComplex.cpp b/CodeGen/CGExprComplex.cpp
index aa66bb6..085e837 100644
--- a/CodeGen/CGExprComplex.cpp
+++ b/CodeGen/CGExprComplex.cpp
@@ -303,13 +303,15 @@
     NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal);
   else if (InVal.first->getType() == llvm::Type::FloatTy)
     // FIXME: Handle long double.
-    NextVal = llvm::ConstantFP::get(InVal.first->getType(), 
-                                    llvm::APFloat(static_cast<float>(AmountVal)));
+    NextVal = 
+      llvm::ConstantFP::get(InVal.first->getType(), 
+                            llvm::APFloat(static_cast<float>(AmountVal)));
   else {
     // FIXME: Handle long double.
     assert(InVal.first->getType() == llvm::Type::DoubleTy);
-    NextVal = llvm::ConstantFP::get(InVal.first->getType(), 
-                                    llvm::APFloat(static_cast<double>(AmountVal)));
+    NextVal = 
+      llvm::ConstantFP::get(InVal.first->getType(), 
+                            llvm::APFloat(static_cast<double>(AmountVal)));
   }
   
   // Add the inc/dec to the real part.
diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp
index 277bcde..dd3c2ed 100644
--- a/CodeGen/CGExprScalar.cpp
+++ b/CodeGen/CGExprScalar.cpp
@@ -496,13 +496,15 @@
       NextVal = llvm::ConstantInt::get(InVal->getType(), AmountVal);
     else if (InVal->getType() == llvm::Type::FloatTy)
       // FIXME: Handle long double.
-      NextVal = llvm::ConstantFP::get(InVal->getType(),
-                                    llvm::APFloat(static_cast<float>(AmountVal)));
+      NextVal = 
+        llvm::ConstantFP::get(InVal->getType(),
+                              llvm::APFloat(static_cast<float>(AmountVal)));
     else {
       // FIXME: Handle long double.
       assert(InVal->getType() == llvm::Type::DoubleTy);
-      NextVal = llvm::ConstantFP::get(InVal->getType(),
-                                      llvm::APFloat(static_cast<double>(AmountVal)));
+      NextVal = 
+        llvm::ConstantFP::get(InVal->getType(),
+                              llvm::APFloat(static_cast<double>(AmountVal)));
     }
     NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
   }
@@ -907,7 +909,8 @@
 
 Value *ScalarExprEmitter::VisitChooseExpr(ChooseExpr *E) {
   // Emit the LHS or RHS as appropriate.
-  return Visit(E->isConditionTrue(CGF.getContext()) ? E->getLHS() : E->getRHS());
+  return
+    Visit(E->isConditionTrue(CGF.getContext()) ? E->getLHS() : E->getRHS());
 }
 
 Value *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE)
diff --git a/CodeGen/CGStmt.cpp b/CodeGen/CGStmt.cpp
index 3a55e04..6a2e3aa 100644
--- a/CodeGen/CGStmt.cpp
+++ b/CodeGen/CGStmt.cpp
@@ -469,8 +469,8 @@
   llvm::BasicBlock *NextBlock = new llvm::BasicBlock("after.sw", CurFn);
   SwitchInsn = Builder.CreateSwitch(CondV, NextBlock);
 
-  // All break statements jump to NextBlock. If BreakContinueStack is non empty then
-  // reuse last ContinueBlock.
+  // All break statements jump to NextBlock. If BreakContinueStack is non empty
+  // then reuse last ContinueBlock.
   llvm::BasicBlock *ContinueBlock = NULL;
   if (!BreakContinueStack.empty())
     ContinueBlock = BreakContinueStack.back().ContinueBlock;
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index 00c2621..b5f4c8d 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -83,15 +83,18 @@
 
       std::vector<llvm::Constant*> ArrayElts;
       const llvm::PointerType *APType = cast<llvm::PointerType>(GV->getType());
-      const llvm::ArrayType *AType = cast<llvm::ArrayType>(APType->getElementType());
+      const llvm::ArrayType *AType = 
+        cast<llvm::ArrayType>(APType->getElementType());
       
       // Copy initializer elements.
       unsigned i = 0;
       for (i = 0; i < NumInitElements; ++i) {
         assert (ILE->getInit(i)->getType()->isIntegerType() 
                 && "Only IntegerType global array initializers are supported");
-        llvm::APSInt Value(static_cast<uint32_t>(
-           getContext().getTypeSize(ILE->getInit(i)->getType(), SourceLocation())));
+        llvm::APSInt 
+          Value(static_cast<uint32_t>
+                (getContext().getTypeSize(ILE->getInit(i)->getType(), 
+                                          SourceLocation())));
         if (ILE->getInit(i)->isIntegerConstantExpr(Value, Context)) {
           llvm::Constant *C = llvm::ConstantInt::get(Value);
           ArrayElts.push_back(C);
@@ -100,8 +103,9 @@
       
       // Initialize remaining array elements.
       unsigned NumArrayElements = AType->getNumElements();
+      const llvm::Type *AElemTy = AType->getElementType();
       for (; i < NumArrayElements; ++i)
-        ArrayElts.push_back(llvm::Constant::getNullValue(AType->getElementType()));
+        ArrayElts.push_back(llvm::Constant::getNullValue(AElemTy));
       
       Init = llvm::ConstantArray::get(AType, ArrayElts);
     } else
diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp
index 1fd09e9..1069313 100644
--- a/CodeGen/CodeGenTypes.cpp
+++ b/CodeGen/CodeGenTypes.cpp
@@ -235,8 +235,9 @@
         return OpaqueI->second;
 
       // Create new OpaqueType now for later use.
-      // FIXME: This creates a lot of opaque types, most of which are not needed.  
-      // Reevaluate this when performance analyis finds tons of opaque types.
+      // FIXME: This creates a lot of opaque types, most of them are not 
+      // needed. Reevaluate this when performance analyis finds tons of 
+      // opaque types.
       llvm::OpaqueType *OpaqueTy =  llvm::OpaqueType::get();
       RecordTypesToResolve[RD] = OpaqueTy;
       TypeHolderMap.insert(std::make_pair(T.getTypePtr(), 
