diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 399f69680af4..76275da38fe2 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -407,7 +407,7 @@ TargetPassConfig::TargetPassConfig(LLVMTargetMachine &TM, PassManagerBase &pm)
     TM.Options.EnableIPRA = EnableIPRA;
   else {
     // If not explicitly specified, use target default.
-    TM.Options.EnableIPRA = TM.useIPRA();
+    TM.Options.EnableIPRA |= TM.useIPRA();
   }
 
   if (TM.Options.EnableIPRA)
diff --git a/llvm/unittests/CodeGen/CMakeLists.txt b/llvm/unittests/CodeGen/CMakeLists.txt
index 772c075de123..706a65b4ac4b 100644
--- a/llvm/unittests/CodeGen/CMakeLists.txt
+++ b/llvm/unittests/CodeGen/CMakeLists.txt
@@ -20,6 +20,7 @@ add_llvm_unittest(CodeGenTests
   MachineOperandTest.cpp
   ScalableVectorMVTsTest.cpp
   TypeTraitsTest.cpp
+  TargetOptionsTest.cpp
   )
 
 add_subdirectory(GlobalISel)
diff --git a/llvm/unittests/CodeGen/TargetOptionsTest.cpp b/llvm/unittests/CodeGen/TargetOptionsTest.cpp
new file mode 100644
index 000000000000..93538c063065
--- /dev/null
+++ b/llvm/unittests/CodeGen/TargetOptionsTest.cpp
@@ -0,0 +1,74 @@
+#include "llvm/Target/TargetOptions.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+#include "llvm/Target/TargetMachine.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace llvm {
+  void initializeTestPassPass(PassRegistry &);
+}
+
+namespace {
+
+void initLLVM() {
+  InitializeAllTargets();
+  InitializeAllTargetMCs();
+  InitializeAllAsmPrinters();
+  InitializeAllAsmParsers();
+
+  PassRegistry *Registry = PassRegistry::getPassRegistry();
+  initializeCore(*Registry);
+  initializeCodeGen(*Registry);
+}
+
+/// Create a TargetMachine. We need a target that doesn't have IPRA enabled by
+/// default. That turns out to be all targets at the moment, so just use X86.
+std::unique_ptr<TargetMachine> createTargetMachine(bool EnableIPRA) {
+  Triple TargetTriple("x86_64--");
+  std::string Error;
+  const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
+  if (!T)
+    return nullptr;
+
+  TargetOptions Options;
+  Options.EnableIPRA = EnableIPRA;
+  return std::unique_ptr<TargetMachine>(T->createTargetMachine(
+      "X86", "", "", Options, None, None, CodeGenOpt::Aggressive));
+}
+
+typedef std::function<void(bool)> TargetOptionsTest;
+
+static void targetOptionsTest(bool EnableIPRA) {
+  LLVMContext Context;
+  std::unique_ptr<TargetMachine> TM = createTargetMachine(EnableIPRA);
+  // This test is designed for the X86 backend; stop if it is not available.
+  if (!TM)
+    return;
+  legacy::PassManager PM;
+  LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine &>(*TM);
+
+  TargetPassConfig &TPC = *LLVMTM.createPassConfig(PM);
+  (void)TPC;
+
+  ASSERT_TRUE(TM->Options.EnableIPRA == EnableIPRA);
+}
+
+} // End of anonymous namespace.
+
+TEST(TargetOptionsTest, IPRASetToOff) {
+  targetOptionsTest(false);
+}
+
+TEST(TargetOptionsTest, IPRASetToOn) {
+  targetOptionsTest(true);
+}
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  initLLVM();
+  return RUN_ALL_TESTS();
+}