summaryrefslogtreecommitdiff
path: root/unittests/Transforms/Utils
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2018-01-17 16:27:17 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2018-01-17 16:27:17 +0000
commit13467f82dc997360b4f0e5b7ac75bb84cb6620bc (patch)
treea0bdf9c6ff672eceda167e1c14c7b6fc1c23da3e /unittests/Transforms/Utils
parent8dfab7e453f8e9d54200a82a913fa7e1d952d14a (diff)
Add tests for ConstantFoldTerminator preserving DomTree
With my bad luck I separately implemented the DomTree preservation for ConstantFoldTerminator before r322401 was committed. Commit the tests which I think still provide some value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@322683 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Transforms/Utils')
-rw-r--r--unittests/Transforms/Utils/Local.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/unittests/Transforms/Utils/Local.cpp b/unittests/Transforms/Utils/Local.cpp
index 4789b0558d7..ab601222ae8 100644
--- a/unittests/Transforms/Utils/Local.cpp
+++ b/unittests/Transforms/Utils/Local.cpp
@@ -212,3 +212,128 @@ TEST(Local, MergeBasicBlockIntoOnlyPred) {
EXPECT_TRUE(DT->verify());
});
}
+
+TEST(Local, ConstantFoldTerminator) {
+ LLVMContext C;
+
+ std::unique_ptr<Module> M = parseIR(
+ C,
+ "define void @br_same_dest() {\n"
+ "entry:\n"
+ " br i1 false, label %bb0, label %bb0\n"
+ "bb0:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @br_different_dest() {\n"
+ "entry:\n"
+ " br i1 true, label %bb0, label %bb1\n"
+ "bb0:\n"
+ " br label %exit\n"
+ "bb1:\n"
+ " br label %exit\n"
+ "exit:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @switch_2_different_dest() {\n"
+ "entry:\n"
+ " switch i32 0, label %default [ i32 0, label %bb0 ]\n"
+ "default:\n"
+ " ret void\n"
+ "bb0:\n"
+ " ret void\n"
+ "}\n"
+ "define void @switch_2_different_dest_default() {\n"
+ "entry:\n"
+ " switch i32 1, label %default [ i32 0, label %bb0 ]\n"
+ "default:\n"
+ " ret void\n"
+ "bb0:\n"
+ " ret void\n"
+ "}\n"
+ "define void @switch_3_different_dest() {\n"
+ "entry:\n"
+ " switch i32 0, label %default [ i32 0, label %bb0\n"
+ " i32 1, label %bb1 ]\n"
+ "default:\n"
+ " ret void\n"
+ "bb0:\n"
+ " ret void\n"
+ "bb1:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @switch_variable_2_default_dest(i32 %arg) {\n"
+ "entry:\n"
+ " switch i32 %arg, label %default [ i32 0, label %default ]\n"
+ "default:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @switch_constant_2_default_dest() {\n"
+ "entry:\n"
+ " switch i32 1, label %default [ i32 0, label %default ]\n"
+ "default:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @switch_constant_3_repeated_dest() {\n"
+ "entry:\n"
+ " switch i32 0, label %default [ i32 0, label %bb0\n"
+ " i32 1, label %bb0 ]\n"
+ " bb0:\n"
+ " ret void\n"
+ "default:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @indirectbr() {\n"
+ "entry:\n"
+ " indirectbr i8* blockaddress(@indirectbr, %bb0), [label %bb0, label %bb1]\n"
+ "bb0:\n"
+ " ret void\n"
+ "bb1:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @indirectbr_repeated() {\n"
+ "entry:\n"
+ " indirectbr i8* blockaddress(@indirectbr_repeated, %bb0), [label %bb0, label %bb0]\n"
+ "bb0:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ "define void @indirectbr_unreachable() {\n"
+ "entry:\n"
+ " indirectbr i8* blockaddress(@indirectbr_unreachable, %bb0), [label %bb1]\n"
+ "bb0:\n"
+ " ret void\n"
+ "bb1:\n"
+ " ret void\n"
+ "}\n"
+ "\n"
+ );
+
+ auto CFAllTerminators = [&](Function &F, DominatorTree *DT) {
+ DeferredDominance DDT(*DT);
+ for (Function::iterator I = F.begin(), E = F.end(); I != E;) {
+ BasicBlock *BB = &*I++;
+ ConstantFoldTerminator(BB, true, nullptr, &DDT);
+ }
+
+ EXPECT_TRUE(DDT.flush().verify());
+ };
+
+ runWithDomTree(*M, "br_same_dest", CFAllTerminators);
+ runWithDomTree(*M, "br_different_dest", CFAllTerminators);
+ runWithDomTree(*M, "switch_2_different_dest", CFAllTerminators);
+ runWithDomTree(*M, "switch_2_different_dest_default", CFAllTerminators);
+ runWithDomTree(*M, "switch_3_different_dest", CFAllTerminators);
+ runWithDomTree(*M, "switch_variable_2_default_dest", CFAllTerminators);
+ runWithDomTree(*M, "switch_constant_2_default_dest", CFAllTerminators);
+ runWithDomTree(*M, "switch_constant_3_repeated_dest", CFAllTerminators);
+ runWithDomTree(*M, "indirectbr", CFAllTerminators);
+ runWithDomTree(*M, "indirectbr_repeated", CFAllTerminators);
+ runWithDomTree(*M, "indirectbr_unreachable", CFAllTerminators);
+}