diff --git a/docs/CommandLine.rst b/docs/CommandLine.rst
index d34fb2c..46ba6d3 100644
--- a/docs/CommandLine.rst
+++ b/docs/CommandLine.rst
@@ -128,7 +128,6 @@
   USAGE: compiler [options]
 
   OPTIONS:
-    -h                - Alias for -help
     -help             - display available options (-help-hidden for more)
     -o <filename>     - Specify output filename
 
@@ -195,7 +194,6 @@
   USAGE: compiler [options] <input file>
 
   OPTIONS:
-    -h                - Alias for -help
     -help             - display available options (-help-hidden for more)
     -o <filename>     - Specify output filename
 
@@ -1253,14 +1251,6 @@
   with ``cl::CommaSeparated``, this modifier only makes sense with a `cl::list`_
   option.
 
-.. _cl::DefaultOption:
-
-* The **cl::DefaultOption** modifier is used to specify that the option is a
-  default that can be overridden by application specific parsers. For example,
-  the ``-help`` alias, ``-h``, is registered this way, so it can be overridden
-  by applications that need to use the ``-h`` option for another purpose,
-  either as a regular option or an alias for another option.
-
 .. _response files:
 
 Response files
diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h
index 1fb9595..cb85534 100644
--- a/include/llvm/Support/CommandLine.h
+++ b/include/llvm/Support/CommandLine.h
@@ -175,10 +175,7 @@
   // If this is enabled, multiple letter options are allowed to bunch together
   // with only a single hyphen for the whole group.  This allows emulation
   // of the behavior that ls uses for example: ls -la === ls -l -a
-  Grouping = 0x08,
-
-  // Default option
-  DefaultOption = 0x10
+  Grouping = 0x08
 };
 
 //===----------------------------------------------------------------------===//
@@ -273,7 +270,7 @@
   unsigned Value : 2;
   unsigned HiddenFlag : 2; // enum OptionHidden
   unsigned Formatting : 2; // enum FormattingFlags
-  unsigned Misc : 5;
+  unsigned Misc : 4;
   unsigned Position = 0;       // Position of last occurrence of the option
   unsigned AdditionalVals = 0; // Greater than 0 for multi-valued option.
 
@@ -309,7 +306,6 @@
   bool hasArgStr() const { return !ArgStr.empty(); }
   bool isPositional() const { return getFormattingFlag() == cl::Positional; }
   bool isSink() const { return getMiscFlags() & cl::Sink; }
-  bool isDefaultOption() const { return getMiscFlags() & cl::DefaultOption; }
 
   bool isConsumeAfter() const {
     return getNumOccurrencesFlag() == cl::ConsumeAfter;
@@ -386,7 +382,7 @@
   }
 
   inline int getNumOccurrences() const { return NumOccurrences; }
-  void reset();
+  inline void reset() { NumOccurrences = 0; }
 };
 
 //===----------------------------------------------------------------------===//
@@ -1736,10 +1732,7 @@
       error("cl::alias must have argument name specified!");
     if (!AliasFor)
       error("cl::alias must have an cl::aliasopt(option) specified!");
-    if (!Subs.empty())
-      error("cl::alias must not have cl::sub(), aliased option's cl::sub() will be used!");
     Subs = AliasFor->Subs;
-    Category = AliasFor->Category;
     addArgument();
   }
 
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index 9adccc6..1858fe9 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -98,11 +98,6 @@
   // This collects additional help to be printed.
   std::vector<StringRef> MoreHelp;
 
-  // This collects Options added with the cl::DefaultOption flag. Since they can
-  // be overridden, they are not added to the appropriate SubCommands until
-  // ParseCommandLineOptions actually runs.
-  SmallVector<Option*, 4> DefaultOptions;
-
   // This collects the different option categories that have been registered.
   SmallPtrSet<OptionCategory *, 16> RegisteredOptionCategories;
 
@@ -151,11 +146,6 @@
   void addOption(Option *O, SubCommand *SC) {
     bool HadErrors = false;
     if (O->hasArgStr()) {
-      // If it's a DefaultOption, check to make sure it isn't already there.
-      if (O->isDefaultOption() &&
-          SC->OptionsMap.find(O->ArgStr) != SC->OptionsMap.end())
-        return;
-
       // Add argument to the argument map!
       if (!SC->OptionsMap.insert(std::make_pair(O->ArgStr, O)).second) {
         errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr
@@ -195,12 +185,7 @@
     }
   }
 
-  void addOption(Option *O, bool ProcessDefaultOption = false) {
-    if (!ProcessDefaultOption && O->isDefaultOption()) {
-      DefaultOptions.push_back(O);
-      return;
-    }
-
+  void addOption(Option *O) {
     if (O->Subs.empty()) {
       addOption(O, &*TopLevelSubCommand);
     } else {
@@ -216,12 +201,8 @@
       OptionNames.push_back(O->ArgStr);
 
     SubCommand &Sub = *SC;
-    auto End = Sub.OptionsMap.end();
-    for (auto Name : OptionNames) {
-      auto I = Sub.OptionsMap.find(Name);
-      if (I != End && I->getValue() == O)
-        Sub.OptionsMap.erase(I);
-      }
+    for (auto Name : OptionNames)
+      Sub.OptionsMap.erase(Name);
 
     if (O->getFormattingFlag() == cl::Positional)
       for (auto Opt = Sub.PositionalOpts.begin();
@@ -285,13 +266,8 @@
     if (O->Subs.empty())
       updateArgStr(O, NewName, &*TopLevelSubCommand);
     else {
-      if (O->isInAllSubCommands()) {
-        for (auto SC : RegisteredSubCommands)
-          updateArgStr(O, NewName, SC);
-      } else {
-        for (auto SC : O->Subs)
-          updateArgStr(O, NewName, SC);
-      }
+      for (auto SC : O->Subs)
+        updateArgStr(O, NewName, SC);
     }
   }
 
@@ -390,13 +366,6 @@
   ArgStr = S;
 }
 
-void Option::reset() {
-  NumOccurrences = 0;
-  setDefault();
-  if (isDefaultOption())
-    removeArgument();
-}
-
 // Initialise the general option category.
 OptionCategory llvm::cl::GeneralCategory("General options");
 
@@ -1198,10 +1167,6 @@
   auto &SinkOpts = ChosenSubCommand->SinkOpts;
   auto &OptionsMap = ChosenSubCommand->OptionsMap;
 
-  for (auto O: DefaultOptions) {
-    addOption(O, true);
-  }
-
   if (ConsumeAfterOpt) {
     assert(PositionalOpts.size() > 0 &&
            "Cannot specify cl::ConsumeAfter without a positional argument!");
@@ -2181,9 +2146,6 @@
         cl::location(WrappedNormalPrinter), cl::ValueDisallowed,
         cl::cat(GenericCategory), cl::sub(*AllSubCommands));
 
-static cl::alias HOpA("h", cl::desc("Alias for -help"), cl::aliasopt(HOp),
-                      cl::DefaultOption);
-
 static cl::opt<HelpPrinterWrapper, true, parser<bool>>
     HHOp("help-hidden", cl::desc("Display all available options"),
          cl::location(WrappedHiddenPrinter), cl::Hidden, cl::ValueDisallowed,
diff --git a/test/Support/check-default-options.txt b/test/Support/check-default-options.txt
deleted file mode 100644
index 403092ec..0000000
--- a/test/Support/check-default-options.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# RUN: llvm-objdump -help-hidden %t | FileCheck --check-prefix=CHECK-OBJDUMP %s
-# RUN: llvm-readobj -help-hidden %t | FileCheck --check-prefix=CHECK-READOBJ %s
-# RUN: llvm-tblgen -help-hidden %t | FileCheck --check-prefix=CHECK-TBLGEN %s
-# RUN: llvm-opt-report -help-hidden %t | FileCheck --check-prefix=CHECK-OPT-RPT %s
-# RUN: llvm-dwarfdump -help-hidden %t | FileCheck --check-prefix=CHECK-DWARF %s
-# RUN: llvm-dwarfdump -h %t | FileCheck --check-prefix=CHECK-DWARF-H %s
-
-
-# CHECK-OBJDUMP: -h  - Alias for --section-headers
-# CHECK-READOBJ: -h  - Alias for --file-headers
-# CHECK-TBLGEN:  -h  - Alias for -help
-# CHECK-OPT-RPT: -h  - Alias for -help
-# CHECK-DWARF:   -h  - Alias for -help
-
-# llvm-dwarfdump declares `-h` option and prints special help in that case,
-# which is weird, but makes for a good test, i.e., shows the default `-h`
-# wasn't used.
-# CHECK-DWARF-H-NOT: -help-list  - Display list of available options (-help-list-hidden for more)
diff --git a/tools/llvm-opt-report/OptReport.cpp b/tools/llvm-opt-report/OptReport.cpp
index a6ca614..3ea71fc 100644
--- a/tools/llvm-opt-report/OptReport.cpp
+++ b/tools/llvm-opt-report/OptReport.cpp
@@ -36,6 +36,8 @@
 using namespace llvm;
 using namespace llvm::yaml;
 
+static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden);
+
 // Mark all our options with this category, everything else (except for -version
 // and -help) will be hidden.
 static cl::OptionCategory
@@ -438,6 +440,11 @@
       "A tool to generate an optimization report from YAML optimization"
       " record files.\n");
 
+  if (Help) {
+    cl::PrintHelpMessage();
+    return 0;
+  }
+
   LocationInfoTy LocationInfo;
   if (!readLocationInfo(LocationInfo))
     return 1;
diff --git a/unittests/Support/CommandLineTest.cpp b/unittests/Support/CommandLineTest.cpp
index a74f964..a7aee41 100644
--- a/unittests/Support/CommandLineTest.cpp
+++ b/unittests/Support/CommandLineTest.cpp
@@ -620,67 +620,6 @@
   }
 }
 
-TEST(CommandLineTest, DefaultOptions) {
-  cl::ResetCommandLineParser();
-
-  StackOption<std::string> Bar("bar", cl::sub(*cl::AllSubCommands),
-                               cl::DefaultOption);
-  StackOption<std::string, cl::alias> Bar_Alias(
-      "b", cl::desc("Alias for -bar"), cl::aliasopt(Bar), cl::DefaultOption);
-
-  StackOption<bool> Foo("foo", cl::init(false), cl::sub(*cl::AllSubCommands),
-                        cl::DefaultOption);
-  StackOption<bool, cl::alias> Foo_Alias("f", cl::desc("Alias for -foo"),
-                                         cl::aliasopt(Foo), cl::DefaultOption);
-
-  StackSubCommand SC1("sc1", "First Subcommand");
-  // Override "-b" and change type in sc1 SubCommand.
-  StackOption<bool> SC1_B("b", cl::sub(SC1), cl::init(false));
-  StackSubCommand SC2("sc2", "Second subcommand");
-  // Override "-foo" and change type in sc2 SubCommand.  Note that this does not
-  // affect "-f" alias, which continues to work correctly.
-  StackOption<std::string> SC2_Foo("foo", cl::sub(SC2));
-
-  const char *args0[] = {"prog", "-b", "args0 bar string", "-f"};
-  EXPECT_TRUE(cl::ParseCommandLineOptions(sizeof(args0) / sizeof(char *), args0,
-                                          StringRef(), &llvm::nulls()));
-  EXPECT_TRUE(Bar == "args0 bar string");
-  EXPECT_TRUE(Foo);
-  EXPECT_FALSE(SC1_B);
-  EXPECT_TRUE(SC2_Foo.empty());
-
-  cl::ResetAllOptionOccurrences();
-
-  const char *args1[] = {"prog", "sc1", "-b", "-bar", "args1 bar string", "-f"};
-  EXPECT_TRUE(cl::ParseCommandLineOptions(sizeof(args1) / sizeof(char *), args1,
-                                          StringRef(), &llvm::nulls()));
-  EXPECT_TRUE(Bar == "args1 bar string");
-  EXPECT_TRUE(Foo);
-  EXPECT_TRUE(SC1_B);
-  EXPECT_TRUE(SC2_Foo.empty());
-  for (auto *S : cl::getRegisteredSubcommands()) {
-    if (*S) {
-      EXPECT_EQ("sc1", S->getName());
-    }
-  }
-
-  cl::ResetAllOptionOccurrences();
-
-  const char *args2[] = {"prog", "sc2", "-b", "args2 bar string",
-                         "-f", "-foo", "foo string"};
-  EXPECT_TRUE(cl::ParseCommandLineOptions(sizeof(args2) / sizeof(char *), args2,
-                                          StringRef(), &llvm::nulls()));
-  EXPECT_TRUE(Bar == "args2 bar string");
-  EXPECT_TRUE(Foo);
-  EXPECT_FALSE(SC1_B);
-  EXPECT_TRUE(SC2_Foo == "foo string");
-  for (auto *S : cl::getRegisteredSubcommands()) {
-    if (*S) {
-      EXPECT_EQ("sc2", S->getName());
-    }
-  }
-}
-
 TEST(CommandLineTest, ArgumentLimit) {
   std::string args(32 * 4096, 'a');
   EXPECT_FALSE(llvm::sys::commandLineFitsWithinSystemLimits("cl", args.data()));
