Move -verify-use-list-order into llvm-uselistorder

Ugh.  Turns out not even transformation passes link in how to read IR.
I sincerely believe the buildbots will finally agree with my system
after this though.  (I don't really understand why all of this has been
working on my system, but not on all the buildbots.)

Create a new tool called llvm-uselistorder to use for verifying use-list
order.  For now, just dump everything from the (now defunct)
-verify-use-list-order pass into the tool.

This might be a better way to test use-list order anyway.

Part of PR5680.

llvm-svn: 213957
GitOrigin-RevId: 4b4d8ecde10a5be00a95bd7767ecd7519eef8dc2
diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h
index ae036b4..20074f0 100644
--- a/include/llvm/InitializePasses.h
+++ b/include/llvm/InitializePasses.h
@@ -268,7 +268,6 @@
 void initializeUnreachableBlockElimPass(PassRegistry&);
 void initializeUnreachableMachineBlockElimPass(PassRegistry&);
 void initializeVerifierLegacyPassPass(PassRegistry&);
-void initializeVerifyUseListOrderPass(PassRegistry&);
 void initializeVirtRegMapPass(PassRegistry&);
 void initializeVirtRegRewriterPass(PassRegistry&);
 void initializeInstSimplifierPass(PassRegistry&);
diff --git a/include/llvm/LinkAllPasses.h b/include/llvm/LinkAllPasses.h
index ec695c8..b7f832d 100644
--- a/include/llvm/LinkAllPasses.h
+++ b/include/llvm/LinkAllPasses.h
@@ -161,7 +161,6 @@
       (void) llvm::createPartiallyInlineLibCallsPass();
       (void) llvm::createScalarizerPass();
       (void) llvm::createSeparateConstOffsetFromGEPPass();
-      (void) llvm::createVerifyUseListOrderPass();
 
       (void)new llvm::IntervalPartition();
       (void)new llvm::FindUsedTypes();
diff --git a/include/llvm/Transforms/IPO.h b/include/llvm/Transforms/IPO.h
index ca6d514..ce1a7d6 100644
--- a/include/llvm/Transforms/IPO.h
+++ b/include/llvm/Transforms/IPO.h
@@ -118,11 +118,6 @@
 /// createInternalizePass - Same as above, but with an empty exportList.
 ModulePass *createInternalizePass();
 
-/// \brief Verify that use-list order doesn't change after shuffling.
-///
-/// \note This is a transformation, since the use-list order changes.
-ModulePass *createVerifyUseListOrderPass();
-
 //===----------------------------------------------------------------------===//
 /// createDeadArgEliminationPass - This pass removes arguments from functions
 /// which are not used by the body of the function.
diff --git a/lib/Transforms/IPO/CMakeLists.txt b/lib/Transforms/IPO/CMakeLists.txt
index 070ecfdc..90c1c33 100644
--- a/lib/Transforms/IPO/CMakeLists.txt
+++ b/lib/Transforms/IPO/CMakeLists.txt
@@ -20,7 +20,6 @@
   PruneEH.cpp
   StripDeadPrototypes.cpp
   StripSymbols.cpp
-  VerifyUseListOrder.cpp
   )
 
 add_dependencies(LLVMipo intrinsics_gen)
diff --git a/lib/Transforms/IPO/IPO.cpp b/lib/Transforms/IPO/IPO.cpp
index 5dce2d6..b4d31d8 100644
--- a/lib/Transforms/IPO/IPO.cpp
+++ b/lib/Transforms/IPO/IPO.cpp
@@ -44,7 +44,6 @@
   initializeStripDebugDeclarePass(Registry);
   initializeStripDeadDebugInfoPass(Registry);
   initializeStripNonDebugSymbolsPass(Registry);
-  initializeVerifyUseListOrderPass(Registry);
   initializeBarrierNoopPass(Registry);
 }
 
diff --git a/test/Bitcode/use-list-order.ll b/test/Bitcode/use-list-order.ll
index 6d87ded..aef5264 100644
--- a/test/Bitcode/use-list-order.ll
+++ b/test/Bitcode/use-list-order.ll
@@ -1,4 +1,4 @@
-; RUN: opt -S < %s -preserve-bc-use-list-order -verify-use-list-order
+; RUN: llvm-uselistorder < %s -preserve-bc-use-list-order
 ; XFAIL: *
 
 @a = global [4 x i1] [i1 0, i1 1, i1 0, i1 1]
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 928b87a..59a17b1 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -44,6 +44,7 @@
           llvm-rtdyld
           llvm-symbolizer
           llvm-tblgen
+          llvm-uselistorder
           llvm-vtabledump
           macho-dump
           opt
diff --git a/test/lit.cfg b/test/lit.cfg
index 99c05a7..2b9b2d9 100644
--- a/test/lit.cfg
+++ b/test/lit.cfg
@@ -228,6 +228,7 @@
                 r"\bllvm-rtdyld\b",
                 r"\bllvm-size\b",
                 r"\bllvm-tblgen\b",
+                r"\bllvm-uselistorder\b",
                 r"\bllvm-vtabledump\b",
                 r"\bllvm-c-test\b",
                 r"\bmacho-dump\b",
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index acc4eb1..ef8095b 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -43,6 +43,8 @@
 add_llvm_tool_subdirectory(llvm-stress)
 add_llvm_tool_subdirectory(llvm-mcmarkup)
 
+add_llvm_tool_subdirectory(llvm-uselistorder)
+
 add_llvm_tool_subdirectory(llvm-symbolizer)
 
 add_llvm_tool_subdirectory(llvm-c-test)
diff --git a/tools/llvm-uselistorder/CMakeLists.txt b/tools/llvm-uselistorder/CMakeLists.txt
new file mode 100644
index 0000000..21c46e9
--- /dev/null
+++ b/tools/llvm-uselistorder/CMakeLists.txt
@@ -0,0 +1,9 @@
+set(LLVM_LINK_COMPONENTS
+  Support
+  IRReader
+  BitWriter
+  )
+
+add_llvm_tool(llvm-uselistorder
+  llvm-uselistorder.cpp
+  )
diff --git a/tools/llvm-uselistorder/LLVMBuild.txt b/tools/llvm-uselistorder/LLVMBuild.txt
new file mode 100644
index 0000000..b9d6f10
--- /dev/null
+++ b/tools/llvm-uselistorder/LLVMBuild.txt
@@ -0,0 +1,22 @@
+;===- ./tools/llvm-uselistorder/LLVMBuild.txt ------------------*- Conf -*--===;
+;
+;                     The LLVM Compiler Infrastructure
+;
+; This file is distributed under the University of Illinois Open Source
+; License. See LICENSE.TXT for details.
+;
+;===------------------------------------------------------------------------===;
+;
+; This is an LLVMBuild description file for the components in this subdirectory.
+;
+; For more information on the LLVMBuild system, please see:
+;
+;   http://llvm.org/docs/LLVMBuild.html
+;
+;===------------------------------------------------------------------------===;
+
+[component_0]
+type = Tool
+name = llvm-uselistorder
+parent = Tools
+required_libraries = IRReader BitWriter Support
diff --git a/tools/llvm-uselistorder/Makefile b/tools/llvm-uselistorder/Makefile
new file mode 100644
index 0000000..b9fc34b
--- /dev/null
+++ b/tools/llvm-uselistorder/Makefile
@@ -0,0 +1,17 @@
+##===- tools/llvm-uselistorder/Makefile --------------------*- Makefile -*-===##
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL := ../..
+TOOLNAME := llvm-uselistorder
+LINK_COMPONENTS := support irreader bitwriter
+
+# This tool has no plugins, optimize startup time.
+TOOL_NO_EXPORTS := 1
+
+include $(LEVEL)/Makefile.common
diff --git a/lib/Transforms/IPO/VerifyUseListOrder.cpp b/tools/llvm-uselistorder/llvm-uselistorder.cpp
similarity index 86%
rename from lib/Transforms/IPO/VerifyUseListOrder.cpp
rename to tools/llvm-uselistorder/llvm-uselistorder.cpp
index 16a88e3..1d5a3d9 100644
--- a/lib/Transforms/IPO/VerifyUseListOrder.cpp
+++ b/tools/llvm-uselistorder/llvm-uselistorder.cpp
@@ -1,4 +1,4 @@
-//===- VerifyUseListOrder.cpp - Use List Order Verifier ---------*- C++ -*-===//
+//===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,33 +7,39 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// Pass to verify use-list order doesn't change after serialization.
-//
-// Despite it being a verifier, this pass *does* transform the module, since it
-// shuffles the use-list of every value.
+// Optimizations may be specified an arbitrary number of times on the command
+// line, They are run in the order specified.
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Transforms/IPO.h"
-
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/AsmParser/Parser.h"
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/UseListOrder.h"
-#include "llvm/Pass.h"
+#include "llvm/IRReader/IRReader.h"
+#include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/PrettyStackTrace.h"
+#include "llvm/Support/Signals.h"
 #include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/SystemUtils.h"
 
 using namespace llvm;
 
 #define DEBUG_TYPE "use-list-order"
 
+static cl::opt<std::string> InputFilename(cl::Positional,
+                                          cl::desc("<input bitcode file>"),
+                                          cl::init("-"),
+                                          cl::value_desc("filename"));
+
 namespace {
 
 struct TempFile {
@@ -329,42 +335,45 @@
   return matches(ValueMapping(M), ValueMapping(*OtherM));
 }
 
-namespace {
-class VerifyUseListOrder : public ModulePass {
-public:
-  static char ID;
-  VerifyUseListOrder();
-  bool runOnModule(Module &M) override;
-};
-} // end anonymous namespace
+int main(int argc, char **argv) {
+  sys::PrintStackTraceOnErrorSignal();
+  llvm::PrettyStackTraceProgram X(argc, argv);
 
-char VerifyUseListOrder::ID = 0;
-INITIALIZE_PASS(VerifyUseListOrder, "verify-use-list-order",
-                "Verify Use List Order", false, false)
-VerifyUseListOrder::VerifyUseListOrder() : ModulePass(ID) {
-  initializeVerifyUseListOrderPass(*PassRegistry::getPassRegistry());
-}
+  // Enable debug stream buffering.
+  EnableDebugBuffering = true;
 
-bool VerifyUseListOrder::runOnModule(Module &M) {
+  llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
+  LLVMContext &Context = getGlobalContext();
+
+  cl::ParseCommandLineOptions(argc, argv,
+                              "llvm tool to verify use-list order\n");
+
+  SMDiagnostic Err;
+
+  // Load the input module...
+  std::unique_ptr<Module> M;
+  M.reset(ParseIRFile(InputFilename, Err, Context));
+
+  if (!M.get()) {
+    Err.print(argv[0], errs());
+    return 1;
+  }
+
   DEBUG(dbgs() << "*** verify-use-list-order ***\n");
   if (!shouldPreserveBitcodeUseListOrder()) {
     // Can't verify if order isn't preserved.
     DEBUG(dbgs() << "warning: cannot verify bitcode; "
                     "try -preserve-bc-use-list-order\n");
-    return false;
+    return 0;
   }
 
-  shuffleUseLists(M);
-  if (!verifyBitcodeUseListOrder(M))
+  shuffleUseLists(*M);
+  if (!verifyBitcodeUseListOrder(*M))
     report_fatal_error("bitcode use-list order changed");
 
   if (shouldPreserveBitcodeUseListOrder())
-    if (!verifyAssemblyUseListOrder(M))
+    if (!verifyAssemblyUseListOrder(*M))
       report_fatal_error("assembly use-list order changed");
 
-  return true;
-}
-
-ModulePass *llvm::createVerifyUseListOrderPass() {
-  return new VerifyUseListOrder;
+  return 0;
 }