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(); +}