summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-07-25 14:49:26 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-07-25 14:49:26 +0000
commit6b6fdc992a826f66c1eb3b1e2a08220e29042891 (patch)
treecdab3c206a971a0920102a070a1811a169ea6b54 /llvm/lib/Transforms
parent115d2df8a4406959fd0b62b205611bb75773aab3 (diff)
downloadbcm5719-llvm-6b6fdc992a826f66c1eb3b1e2a08220e29042891.tar.gz
bcm5719-llvm-6b6fdc992a826f66c1eb3b1e2a08220e29042891.zip
IPO: Add use-list-order verifier
Add a -verify-use-list-order pass, which shuffles use-list order, writes to bitcode, reads back, and verifies that the (shuffled) order matches. - The utility functions live in lib/IR/UseListOrder.cpp. - Moved (and renamed) the command-line option to enable writing use-lists, so that this pass can return early if the use-list orders aren't being serialized. It's not clear that this pass is the right direction long-term (perhaps a separate tool instead?), but short-term it's a great way to test the use-list order prototype. I've added an XFAIL-ed testcase that I'm hoping to get working pretty quickly. This is part of PR5680. llvm-svn: 213945
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/IPO/CMakeLists.txt1
-rw-r--r--llvm/lib/Transforms/IPO/IPO.cpp1
-rw-r--r--llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp61
3 files changed, 63 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/CMakeLists.txt b/llvm/lib/Transforms/IPO/CMakeLists.txt
index 90c1c33e6dc..070ecfdc143 100644
--- a/llvm/lib/Transforms/IPO/CMakeLists.txt
+++ b/llvm/lib/Transforms/IPO/CMakeLists.txt
@@ -20,6 +20,7 @@ add_llvm_library(LLVMipo
PruneEH.cpp
StripDeadPrototypes.cpp
StripSymbols.cpp
+ VerifyUseListOrder.cpp
)
add_dependencies(LLVMipo intrinsics_gen)
diff --git a/llvm/lib/Transforms/IPO/IPO.cpp b/llvm/lib/Transforms/IPO/IPO.cpp
index b4d31d8d6fc..5dce2d6b407 100644
--- a/llvm/lib/Transforms/IPO/IPO.cpp
+++ b/llvm/lib/Transforms/IPO/IPO.cpp
@@ -44,6 +44,7 @@ void llvm::initializeIPO(PassRegistry &Registry) {
initializeStripDebugDeclarePass(Registry);
initializeStripDeadDebugInfoPass(Registry);
initializeStripNonDebugSymbolsPass(Registry);
+ initializeVerifyUseListOrderPass(Registry);
initializeBarrierNoopPass(Registry);
}
diff --git a/llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp b/llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp
new file mode 100644
index 00000000000..a48f6c78202
--- /dev/null
+++ b/llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp
@@ -0,0 +1,61 @@
+//===- VerifyUseListOrder.cpp - Use List Order Verifier ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/IPO.h"
+#include "llvm/IR/UseListOrder.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+
+using namespace llvm;
+
+#define DEBUG_TYPE "use-list-order"
+
+namespace {
+class VerifyUseListOrder : public ModulePass {
+public:
+ static char ID;
+ VerifyUseListOrder();
+ bool runOnModule(Module &M) override;
+};
+} // end anonymous namespace
+
+char VerifyUseListOrder::ID = 0;
+INITIALIZE_PASS(VerifyUseListOrder, "verify-use-list-order",
+ "Verify Use List Order", false, false)
+VerifyUseListOrder::VerifyUseListOrder() : ModulePass(ID) {
+ initializeVerifyUseListOrderPass(*PassRegistry::getPassRegistry());
+}
+
+bool VerifyUseListOrder::runOnModule(Module &M) {
+ 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;
+ }
+
+ shuffleUseLists(M);
+ if (!verifyBitcodeUseListOrder(M))
+ report_fatal_error("bitcode use-list order changed");
+
+ return true;
+}
+
+ModulePass *llvm::createVerifyUseListOrderPass() {
+ return new VerifyUseListOrder;
+}
OpenPOWER on IntegriCloud