Index: llvm/trunk/lib/CodeGen/TargetPassConfig.cpp =================================================================== --- llvm/trunk/lib/CodeGen/TargetPassConfig.cpp +++ llvm/trunk/lib/CodeGen/TargetPassConfig.cpp @@ -407,7 +407,7 @@ 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) Index: llvm/trunk/unittests/CodeGen/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/CodeGen/CMakeLists.txt +++ llvm/trunk/unittests/CodeGen/CMakeLists.txt @@ -20,6 +20,7 @@ MachineOperandTest.cpp ScalableVectorMVTsTest.cpp TypeTraitsTest.cpp + TargetOptionsTest.cpp ) add_subdirectory(GlobalISel) Index: llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp =================================================================== --- llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp +++ llvm/trunk/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 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(T->createTargetMachine( + "X86", "", "", Options, None, None, CodeGenOpt::Aggressive)); +} + +typedef std::function TargetOptionsTest; + +static void targetOptionsTest(bool EnableIPRA) { + LLVMContext Context; + std::unique_ptr 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(*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(); +}