[llvm] r354692 - Restore ability for C++ API users to Enable IPRA.

Daniel Sanders via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 22 12:59:07 PST 2019


Author: dsanders
Date: Fri Feb 22 12:59:07 2019
New Revision: 354692

URL: http://llvm.org/viewvc/llvm-project?rev=354692&view=rev
Log:
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

Added:
    llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp
Modified:
    llvm/trunk/lib/CodeGen/TargetPassConfig.cpp
    llvm/trunk/unittests/CodeGen/CMakeLists.txt

Modified: llvm/trunk/lib/CodeGen/TargetPassConfig.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetPassConfig.cpp?rev=354692&r1=354691&r2=354692&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/TargetPassConfig.cpp (original)
+++ llvm/trunk/lib/CodeGen/TargetPassConfig.cpp Fri Feb 22 12:59:07 2019
@@ -407,7 +407,7 @@ TargetPassConfig::TargetPassConfig(LLVMT
     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)

Modified: llvm/trunk/unittests/CodeGen/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/CMakeLists.txt?rev=354692&r1=354691&r2=354692&view=diff
==============================================================================
--- llvm/trunk/unittests/CodeGen/CMakeLists.txt (original)
+++ llvm/trunk/unittests/CodeGen/CMakeLists.txt Fri Feb 22 12:59:07 2019
@@ -20,6 +20,7 @@ add_llvm_unittest(CodeGenTests
   MachineOperandTest.cpp
   ScalableVectorMVTsTest.cpp
   TypeTraitsTest.cpp
+  TargetOptionsTest.cpp
   )
 
 add_subdirectory(GlobalISel)

Added: llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp?rev=354692&view=auto
==============================================================================
--- llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp (added)
+++ llvm/trunk/unittests/CodeGen/TargetOptionsTest.cpp Fri Feb 22 12:59:07 2019
@@ -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();
+}




More information about the llvm-commits mailing list