From 07cda257f84ba773ee6dd0b140889c59f6459f39 Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Fri, 22 Feb 2019 20:59:07 +0000 Subject: [PATCH] Restore ability for C++ API users to Enable IPRA. Summary: Prior to r310876 one of our out-of-tree targets was enabling IPRA by modifying the TargetOptions::EnableIPRA. This no longer works on current trunk since the useIPRA() hook overrides any values that are set in advance. This patch adjusts the behaviour of the hook so that API users and useIPRA() can both enable it but useIPRA() cannot disable it if the API user already enabled it. Reviewers: arsenm Reviewed By: arsenm Subscribers: wdng, mgorny, llvm-commits Differential Revision: https://reviews.llvm.org/D38043 llvm-svn: 354692 --- llvm/lib/CodeGen/TargetPassConfig.cpp | 2 +- llvm/unittests/CodeGen/CMakeLists.txt | 1 + llvm/unittests/CodeGen/TargetOptionsTest.cpp | 74 ++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 llvm/unittests/CodeGen/TargetOptionsTest.cpp 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 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(); +}