summaryrefslogtreecommitdiff
path: root/unittests/Transforms/Utils/BasicBlockUtils.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2018-07-28 10:51:19 +0000
committerDimitry Andric <dim@FreeBSD.org>2018-07-28 10:51:19 +0000
commiteb11fae6d08f479c0799db45860a98af528fa6e7 (patch)
tree44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /unittests/Transforms/Utils/BasicBlockUtils.cpp
parentb8a2042aa938069e862750553db0e4d82d25822c (diff)
Notes
Diffstat (limited to 'unittests/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r--unittests/Transforms/Utils/BasicBlockUtils.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/unittests/Transforms/Utils/BasicBlockUtils.cpp b/unittests/Transforms/Utils/BasicBlockUtils.cpp
new file mode 100644
index 000000000000..2d0a9302011f
--- /dev/null
+++ b/unittests/Transforms/Utils/BasicBlockUtils.cpp
@@ -0,0 +1,52 @@
+//===- BasicBlockUtils.cpp - Unit tests for BasicBlockUtils ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Utils/BasicBlockUtils.h"
+#include "llvm/AsmParser/Parser.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Dominators.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/Support/SourceMgr.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
+ SMDiagnostic Err;
+ std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
+ if (!Mod)
+ Err.print("BasicBlockUtilsTests", errs());
+ return Mod;
+}
+
+TEST(BasicBlockUtils, SplitBlockPredecessors) {
+ LLVMContext C;
+
+ std::unique_ptr<Module> M = parseIR(
+ C,
+ "define i32 @basic_func(i1 %cond) {\n"
+ "entry:\n"
+ " br i1 %cond, label %bb0, label %bb1\n"
+ "bb0:\n"
+ " br label %bb1\n"
+ "bb1:\n"
+ " %phi = phi i32 [ 0, %entry ], [ 1, %bb0 ]"
+ " ret i32 %phi\n"
+ "}\n"
+ "\n"
+ );
+
+ auto *F = M->getFunction("basic_func");
+ DominatorTree DT(*F);
+
+ // Make sure the dominator tree is properly updated if calling this on the
+ // entry block.
+ SplitBlockPredecessors(&F->getEntryBlock(), {}, "split.entry", &DT);
+ EXPECT_TRUE(DT.verify());
+}