diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp
index 3e6f44c..b45459a 100644
--- a/llvm/lib/CodeGen/StackProtector.cpp
+++ b/llvm/lib/CodeGen/StackProtector.cpp
@@ -66,7 +66,7 @@
     unsigned SSPBufferSize;
 
     /// VisitedPHIs - The set of PHI nodes visited when determining
-    /// if a variable's reference has been taken.  This set 
+    /// if a variable's reference has been taken.  This set
     /// is maintained to ensure we don't visit the same PHI node multiple
     /// times.
     SmallPtrSet<const PHINode*, 16> VisitedPHIs;
@@ -245,7 +245,7 @@
           // of size.
           if (Strong)
             return true;
-  
+
           if (const ConstantInt *CI =
                dyn_cast<ConstantInt>(AI->getArraySize())) {
             if (CI->getLimitedValue(SSPBufferSize) >= SSPBufferSize)
@@ -262,7 +262,7 @@
           return true;
 
         if (Strong && HasAddressTaken(AI)) {
-          ++NumAddrTaken; 
+          ++NumAddrTaken;
           return true;
         }
       }
@@ -347,7 +347,7 @@
   if (TLI->getStackCookieLocation(AddressSpace, Offset)) {
     Constant *OffsetVal =
       ConstantInt::get(Type::getInt32Ty(RI->getContext()), Offset);
-    
+
     StackGuardVar = ConstantExpr::getIntToPtr(OffsetVal,
                                               PointerType::get(PtrTy,
                                                                AddressSpace));
@@ -357,15 +357,15 @@
       ->setVisibility(GlobalValue::HiddenVisibility);
   } else {
     SupportsSelectionDAGSP = true;
-    StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);    
+    StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
   }
-  
+
   BasicBlock &Entry = F->getEntryBlock();
   Instruction *InsPt = &Entry.front();
-  
+
   AI = new AllocaInst(PtrTy, "StackGuardSlot", InsPt);
   LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, InsPt);
-  
+
   Value *Args[] = { LI, AI };
   CallInst::
     Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
@@ -384,7 +384,7 @@
   bool HasPrologue = false;
   bool SupportsSelectionDAGSP = false;
   AllocaInst *AI = 0;           // Place on stack that stores the stack guard.
-  Value *StackGuardVar = 0;  // The stack guard variable.
+  Value *StackGuardVar = 0;     // The stack guard variable.
 
   for (Function::iterator I = F->begin(), E = F->end(); I != E; ) {
     BasicBlock *BB = I++;
@@ -394,8 +394,8 @@
     if (!HasPrologue) {
       HasPrologue = true;
       SupportsSelectionDAGSP = CreatePrologue(F, M, RI, TLI, Trip, AI,
-                                          StackGuardVar);
-    }    
+                                              StackGuardVar);
+    }
 
     if (EnableSelectionDAGSP && !TM->Options.EnableFastISel &&
         SupportsSelectionDAGSP) {
@@ -404,7 +404,7 @@
       Instruction *InsertionPt = 0;
       if (CallInst *CI = FindPotentialTailCall(BB, RI, TLI)) {
         InsertionPt = CI;
-      } else {        
+      } else {
         InsertionPt = RI;
         // At this point we know that BB has a return statement so it *DOES*
         // have a terminator.
@@ -445,25 +445,25 @@
 
       // Create the FailBB. We duplicate the BB every time since the MI tail
       // merge pass will merge together all of the various BB into one including
-      // fail BB generated by the stack protector pseudo instruction. 
+      // fail BB generated by the stack protector pseudo instruction.
       BasicBlock *FailBB = CreateFailBB();
-      
+
       // Split the basic block before the return instruction.
       BasicBlock *NewBB = BB->splitBasicBlock(RI, "SP_return");
-      
+
       // Update the dominator tree if we need to.
       if (DT && DT->isReachableFromEntry(BB)) {
         DT->addNewBlock(NewBB, BB);
         DT->addNewBlock(FailBB, BB);
       }
-      
+
       // Remove default branch instruction to the new BB.
       BB->getTerminator()->eraseFromParent();
-      
+
       // Move the newly created basic block to the point right after the old
       // basic block so that it's in the "fall through" position.
       NewBB->moveAfter(BB);
-      
+
       // Generate the stack protector instructions in the old basic block.
       LoadInst *LI1 = new LoadInst(StackGuardVar, "", false, BB);
       LoadInst *LI2 = new LoadInst(AI, "", true, BB);
