diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index 8cd1f5e..9587de2 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -922,7 +922,7 @@
 
   // Begin generating the function.
   StartFunction(blockDecl, fnType->getResultType(), fn, args,
-                blockInfo.getBlockExpr()->getBody()->getLocEnd(), CC_Default);
+                blockInfo.getBlockExpr()->getBody()->getLocEnd());
   CurFuncDecl = outerFnDecl; // StartFunction sets this to blockDecl
 
   // Okay.  Undo some of what StartFunction did.
@@ -1078,7 +1078,7 @@
                                           SC_None,
                                           false,
                                           true);
-  StartFunction(FD, C.VoidTy, Fn, args, SourceLocation(), CC_Default);
+  StartFunction(FD, C.VoidTy, Fn, args, SourceLocation());
 
   const llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
 
@@ -1167,7 +1167,7 @@
                                           SC_Static,
                                           SC_None,
                                           false, true);
-  StartFunction(FD, C.VoidTy, Fn, args, SourceLocation(), CC_Default);
+  StartFunction(FD, C.VoidTy, Fn, args, SourceLocation());
 
   const llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
 
@@ -1270,7 +1270,7 @@
                                           SC_Static,
                                           SC_None,
                                           false, true);
-  StartFunction(FD, R, Fn, Args, SourceLocation(), CC_Default);
+  StartFunction(FD, R, Fn, Args, SourceLocation());
 
   // dst->x
   llvm::Value *V = GetAddrOfLocalVar(Dst);
@@ -1340,7 +1340,7 @@
                                           SC_Static,
                                           SC_None,
                                           false, true);
-  StartFunction(FD, R, Fn, Args, SourceLocation(), CC_Default);
+  StartFunction(FD, R, Fn, Args, SourceLocation());
 
   llvm::Value *V = GetAddrOfLocalVar(Src);
   V = Builder.CreateBitCast(V, llvm::PointerType::get(T, 0));
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 3c3765a..1d9a9a6 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -36,7 +36,6 @@
   case CC_X86StdCall: return llvm::CallingConv::X86_StdCall;
   case CC_X86FastCall: return llvm::CallingConv::X86_FastCall;
   case CC_X86ThisCall: return llvm::CallingConv::X86_ThisCall;
-  case CC_Win64ThisCall: return llvm::CallingConv::Win64_ThisCall;
   // TODO: add support for CC_X86Pascal to llvm
   }
 }
@@ -76,23 +75,19 @@
 static const CGFunctionInfo &getFunctionInfo(CodeGenTypes &CGT,
                                   llvm::SmallVectorImpl<CanQualType> &ArgTys,
                                              CanQual<FunctionProtoType> FTP,
-                                             CallingConv CC,
                                              bool IsRecursive = false) {
   // FIXME: Kill copy.
   for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
     ArgTys.push_back(FTP->getArgType(i));
   CanQualType ResTy = FTP->getResultType().getUnqualifiedType();
-
-  return CGT.getFunctionInfo(ResTy, ArgTys,
-                             FTP->getExtInfo().withCallingConv(CC),
-                             IsRecursive);
+  return CGT.getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo(), IsRecursive);
 }
 
 const CGFunctionInfo &
 CodeGenTypes::getFunctionInfo(CanQual<FunctionProtoType> FTP,
                               bool IsRecursive) {
   llvm::SmallVector<CanQualType, 16> ArgTys;
-  return ::getFunctionInfo(*this, ArgTys, FTP, CC_Default, IsRecursive);
+  return ::getFunctionInfo(*this, ArgTys, FTP, IsRecursive);
 }
 
 static CallingConv getCallingConventionForDecl(const Decl *D) {
@@ -119,10 +114,8 @@
   // Add the 'this' pointer.
   ArgTys.push_back(GetThisType(Context, RD));
 
-  CallingConv CC = Context.Target.isWin64() ? CC_Win64ThisCall : CC_Default;
-
   return ::getFunctionInfo(*this, ArgTys,
-           FTP->getCanonicalTypeUnqualified().getAs<FunctionProtoType>(), CC);
+              FTP->getCanonicalTypeUnqualified().getAs<FunctionProtoType>());
 }
 
 const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) {
@@ -135,9 +128,7 @@
   if (MD->isInstance())
     ArgTys.push_back(GetThisType(Context, MD->getParent()));
 
-  CallingConv CC = Context.Target.isWin64() ? CC_Win64ThisCall : CC_Default;
-
-  return ::getFunctionInfo(*this, ArgTys, GetFormalType(MD), CC);
+  return ::getFunctionInfo(*this, ArgTys, GetFormalType(MD));
 }
 
 const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXConstructorDecl *D,
@@ -154,9 +145,7 @@
   for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
     ArgTys.push_back(FTP->getArgType(i));
 
-  CallingConv CC = Context.Target.isWin64() ? CC_Win64ThisCall : CC_Default;
-
-  return getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo().withCallingConv(CC));
+  return getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo());
 }
 
 const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXDestructorDecl *D,
@@ -170,9 +159,7 @@
   CanQual<FunctionProtoType> FTP = GetFormalType(D);
   assert(FTP->getNumArgs() == 0 && "dtor with formal parameters");
 
-  CallingConv CC = Context.Target.isWin64() ? CC_Win64ThisCall : CC_Default;
-
-  return getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo().withCallingConv(CC));
+  return getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo());
 }
 
 const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) {
@@ -263,8 +250,8 @@
     return *FI;
 
   // Construct the function info.
-  FI = new CGFunctionInfo(CC, Info.getNoReturn(), Info.getRegParm(),
-                          ResTy, ArgTys.data(), ArgTys.size());
+  FI = new CGFunctionInfo(CC, Info.getNoReturn(), Info.getRegParm(), ResTy,
+                          ArgTys.data(), ArgTys.size());
   FunctionInfos.InsertNode(FI, InsertPos);
 
   // Compute ABI information.
diff --git a/lib/CodeGen/CGDeclCXX.cpp b/lib/CodeGen/CGDeclCXX.cpp
index e9c6d00..8b37e9a 100644
--- a/lib/CodeGen/CGDeclCXX.cpp
+++ b/lib/CodeGen/CGDeclCXX.cpp
@@ -261,7 +261,7 @@
                                                        const VarDecl *D,
                                                  llvm::GlobalVariable *Addr) {
   StartFunction(GlobalDecl(), getContext().VoidTy, Fn, FunctionArgList(),
-                SourceLocation(), CC_Default);
+                SourceLocation());
 
   // Use guarded initialization if the global variable is weak due to
   // being a class template's static data member.
@@ -278,7 +278,7 @@
                                                 llvm::Constant **Decls,
                                                 unsigned NumDecls) {
   StartFunction(GlobalDecl(), getContext().VoidTy, Fn, FunctionArgList(),
-                SourceLocation(), CC_Default);
+                SourceLocation());
 
   for (unsigned i = 0; i != NumDecls; ++i)
     if (Decls[i])
@@ -290,10 +290,8 @@
 void CodeGenFunction::GenerateCXXGlobalDtorFunc(llvm::Function *Fn,
                   const std::vector<std::pair<llvm::WeakVH, llvm::Constant*> >
                                                 &DtorsAndObjects) {
-  const bool IsWin64 = getContext().Target.isWin64();
-
   StartFunction(GlobalDecl(), getContext().VoidTy, Fn, FunctionArgList(),
-                SourceLocation(), IsWin64 ? CC_Win64ThisCall : CC_Default);
+                SourceLocation());
 
   // Emit the dtors, in reverse order from construction.
   for (unsigned i = 0, e = DtorsAndObjects.size(); i != e; ++i) {
@@ -329,8 +327,7 @@
   llvm::Function *Fn = 
     CreateGlobalInitOrDestructFunction(CGM, FTy, "__cxx_global_array_dtor");
 
-  StartFunction(GlobalDecl(), getContext().VoidTy, Fn, Args, SourceLocation(),
-                CC_Default);
+  StartFunction(GlobalDecl(), getContext().VoidTy, Fn, Args, SourceLocation());
 
   QualType BaseElementTy = getContext().getBaseElementType(Array);
   const llvm::Type *BasePtr = ConvertType(BaseElementTy)->getPointerTo();
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index f2cd951..0f9abc7 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -2121,7 +2121,7 @@
   CallArgList Args;
   EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), ArgBeg, ArgEnd);
 
-  return EmitCall(CGM.getTypes().getFunctionInfo(Args, FnType, CC_Default),
+  return EmitCall(CGM.getTypes().getFunctionInfo(Args, FnType),
                   Callee, ReturnValue, Args, TargetDecl);
 }
 
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp
index 06d04a5..bba7864 100644
--- a/lib/CodeGen/CGExprCXX.cpp
+++ b/lib/CodeGen/CGExprCXX.cpp
@@ -48,13 +48,8 @@
   EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
 
   QualType ResultType = FPT->getResultType();
-  FunctionType::ExtInfo Info = FPT->getExtInfo();
-
-  if (getContext().Target.isWin64()) {
-      Info = Info.withCallingConv(CC_Win64ThisCall);
-  }
-
-  return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args, Info),
+  return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args,
+                                                 FPT->getExtInfo()),
                   Callee, ReturnValue, Args, MD);
 }
 
@@ -297,11 +292,8 @@
   // And the rest of the call args
   EmitCallArgs(Args, FPT, E->arg_begin(), E->arg_end());
   const FunctionType *BO_FPT = BO->getType()->getAs<FunctionProtoType>();
-
-  const CGFunctionInfo &FI = CGM.getTypes().getFunctionInfo(Args, BO_FPT,
-          CGM.getContext().Target.isWin64() ? CC_Win64ThisCall : CC_Default);
-
-  return EmitCall(FI , Callee, ReturnValue, Args);
+  return EmitCall(CGM.getTypes().getFunctionInfo(Args, BO_FPT), Callee, 
+                  ReturnValue, Args);
 }
 
 RValue
@@ -818,10 +810,8 @@
       for (unsigned I = 0; I != NumPlacementArgs; ++I)
         DeleteArgs.push_back(std::make_pair(getPlacementArgs()[I], *AI++));
 
-      // FIXME Check whether this needs thiscall on Win64.
       // Call 'operator delete'.
-      CGF.EmitCall(CGF.CGM.getTypes().getFunctionInfo(DeleteArgs, FPT,
-                                                      CC_Default),
+      CGF.EmitCall(CGF.CGM.getTypes().getFunctionInfo(DeleteArgs, FPT),
                    CGF.CGM.GetAddrOfFunction(OperatorDelete),
                    ReturnValueSlot(), DeleteArgs, OperatorDelete);
     }
@@ -881,10 +871,8 @@
         DeleteArgs.push_back(std::make_pair(RV, *AI++));
       }
 
-      // FIXME Check whether this needs thiscall on Win64.
       // Call 'operator delete'.
-      CGF.EmitCall(CGF.CGM.getTypes().getFunctionInfo(DeleteArgs, FPT,
-                                                      CC_Default),
+      CGF.EmitCall(CGF.CGM.getTypes().getFunctionInfo(DeleteArgs, FPT),
                    CGF.CGM.GetAddrOfFunction(OperatorDelete),
                    ReturnValueSlot(), DeleteArgs, OperatorDelete);
     }
@@ -988,7 +976,7 @@
 
   // Emit the call to new.
   RValue RV =
-    EmitCall(CGM.getTypes().getFunctionInfo(NewArgs, NewFTy, CC_Default),
+    EmitCall(CGM.getTypes().getFunctionInfo(NewArgs, NewFTy),
              CGM.GetAddrOfFunction(NewFD), ReturnValueSlot(), NewArgs, NewFD);
 
   // If an allocation function is declared with an empty exception specification
@@ -1098,7 +1086,7 @@
     DeleteArgs.push_back(std::make_pair(RValue::get(Size), SizeTy));
 
   // Emit the call to delete.
-  EmitCall(CGM.getTypes().getFunctionInfo(DeleteArgs, DeleteFTy, CC_Default),
+  EmitCall(CGM.getTypes().getFunctionInfo(DeleteArgs, DeleteFTy),
            CGM.GetAddrOfFunction(DeleteFD), ReturnValueSlot(), 
            DeleteArgs, DeleteFD);
 }
@@ -1219,7 +1207,7 @@
       }
 
       // Emit the call to delete.
-      CGF.EmitCall(CGF.getTypes().getFunctionInfo(Args, DeleteFTy, CC_Default),
+      CGF.EmitCall(CGF.getTypes().getFunctionInfo(Args, DeleteFTy),
                    CGF.CGM.GetAddrOfFunction(OperatorDelete),
                    ReturnValueSlot(), Args, OperatorDelete);
     }
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index 6ae1ac8..5d34907 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -140,8 +140,7 @@
 
   CurGD = OMD;
 
-  StartFunction(OMD, OMD->getResultType(), Fn, Args, OMD->getLocStart(),
-                CC_Default);
+  StartFunction(OMD, OMD->getResultType(), Fn, Args, OMD->getLocStart());
 }
 
 void CodeGenFunction::GenerateObjCGetterBody(ObjCIvarDecl *Ivar, 
diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp
index 6acbe43..891697f 100644
--- a/lib/CodeGen/CGVTables.cpp
+++ b/lib/CodeGen/CGVTables.cpp
@@ -2582,11 +2582,8 @@
     
     FunctionArgs.push_back(std::make_pair(Param, Param->getType()));
   }
-
-  const bool IsWin64 = CGM.getContext().Target.isWin64();
-
-  StartFunction(GlobalDecl(), ResultType, Fn, FunctionArgs, SourceLocation(),
-                IsWin64 ? CC_Win64ThisCall : CC_Default);
+  
+  StartFunction(GlobalDecl(), ResultType, Fn, FunctionArgs, SourceLocation());
 
   CGM.getCXXABI().EmitInstanceFunctionProlog(*this);
 
@@ -2617,14 +2614,9 @@
                                    FPT->isVariadic());
   llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
 
-  FunctionType::ExtInfo Info = FPT->getExtInfo();
-
-  if (IsWin64) {
-      Info = Info.withCallingConv(CC_Win64ThisCall);
-  }
-
   const CGFunctionInfo &FnInfo = 
-    CGM.getTypes().getFunctionInfo(ResultType, CallArgs, Info);
+    CGM.getTypes().getFunctionInfo(ResultType, CallArgs,
+                                   FPT->getExtInfo());
   
   // Determine whether we have a return value slot to use.
   ReturnValueSlot Slot;
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 9660b07..4ab3277 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -211,8 +211,7 @@
 void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
                                     llvm::Function *Fn,
                                     const FunctionArgList &Args,
-                                    SourceLocation StartLoc,
-                                    CallingConv CC) {
+                                    SourceLocation StartLoc) {
   const Decl *D = GD.getDecl();
   
   DidCallStackSave = false;
@@ -279,7 +278,7 @@
   // FIXME: Leaked.
   // CC info is ignored, hopefully?
   CurFnInfo = &CGM.getTypes().getFunctionInfo(FnRetTy, Args,
-                                              FunctionType::ExtInfo().withCallingConv(CC));
+                                              FunctionType::ExtInfo());
 
   if (RetTy->isVoidType()) {
     // Void type; nothing to return.
@@ -360,7 +359,7 @@
   if (Stmt *Body = FD->getBody()) BodyRange = Body->getSourceRange();
 
   // Emit the standard function prologue.
-  StartFunction(GD, ResTy, Fn, Args, BodyRange.getBegin(), CC_Default);
+  StartFunction(GD, ResTy, Fn, Args, BodyRange.getBegin());
 
   // Generate the body of the function.
   if (isa<CXXDestructorDecl>(FD))
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index 9b698d3..0edd0f0 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -1126,8 +1126,7 @@
   void StartFunction(GlobalDecl GD, QualType RetTy,
                      llvm::Function *Fn,
                      const FunctionArgList &Args,
-                     SourceLocation StartLoc,
-                     CallingConv CC);
+                     SourceLocation StartLoc);
 
   void EmitConstructorBody(FunctionArgList &Args);
   void EmitDestructorBody(FunctionArgList &Args);
diff --git a/lib/CodeGen/CodeGenTypes.h b/lib/CodeGen/CodeGenTypes.h
index 6bf3f92..41513da 100644
--- a/lib/CodeGen/CodeGenTypes.h
+++ b/lib/CodeGen/CodeGenTypes.h
@@ -161,11 +161,9 @@
                                         CXXDtorType Type);
 
   const CGFunctionInfo &getFunctionInfo(const CallArgList &Args,
-                                        const FunctionType *Ty,
-                                        CallingConv CC) {
-    FunctionType::ExtInfo Info = Ty->getExtInfo().withCallingConv(CC);
-
-    return getFunctionInfo(Ty->getResultType(), Args, Info);
+                                        const FunctionType *Ty) {
+    return getFunctionInfo(Ty->getResultType(), Args,
+                           Ty->getExtInfo());
   }
 
   const CGFunctionInfo &getFunctionInfo(CanQual<FunctionProtoType> Ty,
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
index 14a6e0a..2ffc840 100644
--- a/lib/CodeGen/TargetInfo.cpp
+++ b/lib/CodeGen/TargetInfo.cpp
@@ -942,26 +942,6 @@
 
     return false;
   }
-
-  void SetTargetAttributes(const Decl *D,
-                           llvm::GlobalValue *GV,
-                           CodeGen::CodeGenModule &M) const {
-    if (M.getContext().Target.isWin64()) {
-      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
-        const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(FD);
-
-        if ((M && M->isInstance())
-            || dyn_cast<CXXConstructorDecl>(FD)
-            || dyn_cast<CXXDestructorDecl>(FD)) {
-              // When using the MSVC Win64 ABI, methods/constructors/destructors
-              // use the Win64 thiscall calling convention.
-              llvm::Function *F = cast<llvm::Function>(GV);
-              F->setCallingConv(llvm::CallingConv::Win64_ThisCall);
-        }
-      }
-    }
-  }
-
 };
 
 }
