Index: docs/ClangFormatStyleOptions.rst
===================================================================
--- docs/ClangFormatStyleOptions.rst	(revision 190620)
+++ docs/ClangFormatStyleOptions.rst	(working copy)
@@ -249,6 +249,9 @@
   If ``true``, spaces will be inserted between 'for'/'if'/'while'/...
   and '('.
 
+**SpaceBeforeAssignmentOperators** (``bool``)
+  If ``false``, spaces will be removed before '=', '+=', etc.
+
 **SpaceInEmptyParentheses** (``bool``)
   If ``false``, spaces may be inserted into '()'.
 
Index: include/clang/Format/Format.h
===================================================================
--- include/clang/Format/Format.h	(revision 190620)
+++ include/clang/Format/Format.h	(working copy)
@@ -222,6 +222,9 @@
   /// and '('.
   bool SpaceAfterControlStatementKeyword;
 
+  /// \brief If \c false, spaces will be removed before assignment operators.
+  bool SpaceBeforeAssignmentOperators;
+
   bool operator==(const FormatStyle &R) const {
     return AccessModifierOffset == R.AccessModifierOffset &&
            ConstructorInitializerIndentWidth ==
@@ -265,7 +268,9 @@
            SpacesInCStyleCastParentheses ==
                R.SpacesInCStyleCastParentheses &&
            SpaceAfterControlStatementKeyword ==
-               R.SpaceAfterControlStatementKeyword;
+               R.SpaceAfterControlStatementKeyword &&
+		   SpaceBeforeAssignmentOperators ==
+		       R.SpaceBeforeAssignmentOperators;
   }
 };
 
Index: lib/Format/Format.cpp
===================================================================
--- lib/Format/Format.cpp	(revision 190620)
+++ lib/Format/Format.cpp	(working copy)
@@ -147,6 +147,8 @@
                    Style.SpacesInCStyleCastParentheses);
     IO.mapOptional("SpaceAfterControlStatementKeyword",
                    Style.SpaceAfterControlStatementKeyword);
+    IO.mapOptional("SpaceBeforeAssignmentOperators",
+                   Style.SpaceBeforeAssignmentOperators);
   }
 };
 }
@@ -197,6 +199,7 @@
   LLVMStyle.SpaceInEmptyParentheses = false;
   LLVMStyle.SpacesInCStyleCastParentheses = false;
   LLVMStyle.SpaceAfterControlStatementKeyword = true;
+  LLVMStyle.SpaceBeforeAssignmentOperators = true;
 
   setDefaultPenalties(LLVMStyle);
   LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60;
@@ -239,6 +242,7 @@
   GoogleStyle.SpaceInEmptyParentheses = false;
   GoogleStyle.SpacesInCStyleCastParentheses = false;
   GoogleStyle.SpaceAfterControlStatementKeyword = true;
+  GoogleStyle.SpaceBeforeAssignmentOperators = true;
 
   setDefaultPenalties(GoogleStyle);
   GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200;
Index: lib/Format/TokenAnnotator.cpp
===================================================================
--- lib/Format/TokenAnnotator.cpp	(revision 190620)
+++ lib/Format/TokenAnnotator.cpp	(working copy)
@@ -1291,6 +1291,26 @@
   return true;
 }
 
+bool IsTokenAssignmentOperator(const FormatToken &Tok) {
+  tok::TokenKind Kind = Tok.Tok.getKind();
+  switch (Kind) {
+  case tok::equal:
+  case tok::plusequal:
+  case tok::minusequal:
+  case tok::starequal:
+  case tok::slashequal:
+  case tok::percentequal:
+  case tok::lesslessequal:
+  case tok::greatergreaterequal:
+  case tok::ampequal:
+  case tok::caretequal:
+  case tok::pipeequal:
+    return true;
+  default:
+    return false;
+  }
+}
+
 bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
                                          const FormatToken &Tok) {
   if (Tok.Tok.getIdentifierInfo() && Tok.Previous->Tok.getIdentifierInfo())
@@ -1334,6 +1354,8 @@
   if (Tok.isOneOf(tok::arrowstar, tok::periodstar) ||
       Tok.Previous->isOneOf(tok::arrowstar, tok::periodstar))
     return false;
+  if (!Style.SpaceBeforeAssignmentOperators && IsTokenAssignmentOperator(Tok))
+    return false;
   if ((Tok.Type == TT_BinaryOperator && !Tok.Previous->is(tok::l_paren)) ||
       Tok.Previous->Type == TT_BinaryOperator)
     return true;
Index: test/Format/no-space-before-assign.cpp
===================================================================
--- test/Format/no-space-before-assign.cpp	(revision 0)
+++ test/Format/no-space-before-assign.cpp	(working copy)
@@ -0,0 +1,12 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-format -style="{BasedOnStyle: LLVM, SpaceBeforeAssignmentOperators: false}" -i %t.cpp
+// RUN: FileCheck -strict-whitespace -input-file=%t.cpp %s
+
+// CHECK: {{^int\ a=\ 5;}}
+int a = 5;
+
+// CHECK: {{^a\+=\ 42;}}
+a += 42;
+
+// CHECK: {{^a or_eq\ 8;}}
+a or_eq 8;
