summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/ADCE
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/ADCE')
-rw-r--r--llvm/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll11
-rw-r--r--llvm/test/Transforms/ADCE/2002-05-22-PHITest.ll16
-rw-r--r--llvm/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll35
-rw-r--r--llvm/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll19
-rw-r--r--llvm/test/Transforms/ADCE/2002-05-28-Crash.ll56
-rw-r--r--llvm/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll14
-rw-r--r--llvm/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll50
-rw-r--r--llvm/test/Transforms/ADCE/2002-07-29-Segfault.ll10
-rw-r--r--llvm/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll30
-rw-r--r--llvm/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll37
-rw-r--r--llvm/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll29
-rw-r--r--llvm/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll94
-rw-r--r--llvm/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll44
-rw-r--r--llvm/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll22
-rw-r--r--llvm/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll10
-rw-r--r--llvm/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll20
-rw-r--r--llvm/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll17
-rw-r--r--llvm/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll52
-rw-r--r--llvm/test/Transforms/ADCE/2016-09-06.ll55
-rw-r--r--llvm/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll24
-rw-r--r--llvm/test/Transforms/ADCE/basictest.ll18
-rw-r--r--llvm/test/Transforms/ADCE/basictest1.ll102
-rw-r--r--llvm/test/Transforms/ADCE/basictest2.ll102
-rw-r--r--llvm/test/Transforms/ADCE/dce_pure_call.ll8
-rw-r--r--llvm/test/Transforms/ADCE/dce_pure_invoke.ll19
-rw-r--r--llvm/test/Transforms/ADCE/debug-info-intrinsic.ll100
-rw-r--r--llvm/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll19
-rw-r--r--llvm/test/Transforms/ADCE/domtree-DoubleDeletion.ll39
-rw-r--r--llvm/test/Transforms/ADCE/unreachable-function.ll5
-rw-r--r--llvm/test/Transforms/ADCE/unreachable.ll18
30 files changed, 1075 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll b/llvm/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll
new file mode 100644
index 00000000000..8910bdade37
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll
@@ -0,0 +1,11 @@
+; RUN: opt < %s -adce
+
+define i32 @"main"(i32 %argc) {
+ br label %2
+
+ %retval = phi i32 [ %argc, %2 ] ; <i32> [#uses=2]
+ %two = add i32 %retval, %retval ; <i32> [#uses=1]
+ ret i32 %two
+
+ br label %1
+}
diff --git a/llvm/test/Transforms/ADCE/2002-05-22-PHITest.ll b/llvm/test/Transforms/ADCE/2002-05-22-PHITest.ll
new file mode 100644
index 00000000000..0095be1f5a1
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-05-22-PHITest.ll
@@ -0,0 +1,16 @@
+; It is illegal to remove BB1 because it will mess up the PHI node!
+;
+; RUN: opt < %s -adce -S | grep BB1
+
+define i32 @test(i1 %C, i32 %A, i32 %B) {
+; <label>:0
+ br i1 %C, label %BB1, label %BB2
+
+BB1: ; preds = %0
+ br label %BB2
+
+BB2: ; preds = %BB1, %0
+ %R = phi i32 [ %A, %0 ], [ %B, %BB1 ] ; <i32> [#uses=1]
+ ret i32 %R
+}
+
diff --git a/llvm/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll b/llvm/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll
new file mode 100644
index 00000000000..a9da9c70380
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll
@@ -0,0 +1,35 @@
+; This testcase contains a entire loop that should be removed. The only thing
+; left is the store instruction in BB0. The problem this testcase was running
+; into was that when the reg109 PHI was getting zero predecessors, it was
+; removed even though there were uses still around. Now the uses are filled
+; in with a dummy value before the PHI is deleted.
+;
+; RUN: opt < %s -S -adce | grep bb1
+; RUN: opt < %s -S -adce -adce-remove-loops | FileCheck %s
+
+ %node_t = type { double*, %node_t*, %node_t**, double**, double*, i32, i32 }
+
+define void @localize_local(%node_t* %nodelist) {
+bb0:
+ %nodelist.upgrd.1 = alloca %node_t* ; <%node_t**> [#uses=2]
+ store %node_t* %nodelist, %node_t** %nodelist.upgrd.1
+ br label %bb1
+
+bb1: ; preds = %bb0
+ %reg107 = load %node_t*, %node_t** %nodelist.upgrd.1 ; <%node_t*> [#uses=2]
+ %cond211 = icmp eq %node_t* %reg107, null ; <i1> [#uses=1]
+; CHECK: br label %bb3
+ br i1 %cond211, label %bb3, label %bb2
+
+bb2: ; preds = %bb2, %bb1
+ %reg109 = phi %node_t* [ %reg110, %bb2 ], [ %reg107, %bb1 ] ; <%node_t*> [#uses=1]
+ %reg212 = getelementptr %node_t, %node_t* %reg109, i64 0, i32 1 ; <%node_t**> [#uses=1]
+ %reg110 = load %node_t*, %node_t** %reg212 ; <%node_t*> [#uses=2]
+ %cond213 = icmp ne %node_t* %reg110, null ; <i1> [#uses=1]
+; CHECK: br label %bb3
+ br i1 %cond213, label %bb2, label %bb3
+
+bb3: ; preds = %bb2, %bb1
+ ret void
+}
+
diff --git a/llvm/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll b/llvm/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll
new file mode 100644
index 00000000000..2fefd0a5f98
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll
@@ -0,0 +1,19 @@
+; This testcase is a distilled form of: 2002-05-28-Crash.ll
+
+; RUN: opt < %s -adce
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define float @test(i32 %i) {
+ %F = sitofp i32 %i to float ; <float> [#uses=1]
+ %I = bitcast i32 %i to i32 ; <i32> [#uses=1]
+ br label %Loop
+
+Loop: ; preds = %Loop, %0
+ %B = icmp ne i32 %I, 0 ; <i1> [#uses=1]
+; CHECK: br label %Out
+ br i1 %B, label %Out, label %Loop
+
+Out: ; preds = %Loop
+ ret float %F
+}
+
diff --git a/llvm/test/Transforms/ADCE/2002-05-28-Crash.ll b/llvm/test/Transforms/ADCE/2002-05-28-Crash.ll
new file mode 100644
index 00000000000..3090792a55a
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-05-28-Crash.ll
@@ -0,0 +1,56 @@
+; This testcase is distilled from the GNU rx package. The loop should be
+; removed but causes a problem when ADCE does. The source function is:
+; int rx_bitset_empty (int size, rx_Bitset set) {
+; int x;
+; RX_subset s;
+; s = set[0];
+; set[0] = 1;
+; for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x)
+; ;
+; set[0] = s;
+; return !s;
+;}
+;
+; RUN: opt < %s -adce
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define i32 @rx_bitset_empty(i32 %size, i32* %set) {
+bb1:
+ %reg110 = load i32, i32* %set ; <i32> [#uses=2]
+ store i32 1, i32* %set
+ %cast112 = sext i32 %size to i64 ; <i64> [#uses=1]
+ %reg113 = add i64 %cast112, 31 ; <i64> [#uses=1]
+ %reg114 = lshr i64 %reg113, 5 ; <i64> [#uses=2]
+ %cast109 = trunc i64 %reg114 to i32 ; <i32> [#uses=1]
+ %reg129 = add i32 %cast109, -1 ; <i32> [#uses=1]
+ %reg114-idxcast = trunc i64 %reg114 to i32 ; <i32> [#uses=1]
+ %reg114-idxcast-offset = add i32 %reg114-idxcast, 1073741823 ; <i32> [#uses=1]
+ %reg114-idxcast-offset.upgrd.1 = zext i32 %reg114-idxcast-offset to i64 ; <i64> [#uses=1]
+ %reg124 = getelementptr i32, i32* %set, i64 %reg114-idxcast-offset.upgrd.1 ; <i32*> [#uses=1]
+ %reg125 = load i32, i32* %reg124 ; <i32> [#uses=1]
+ %cond232 = icmp ne i32 %reg125, 0 ; <i1> [#uses=1]
+; CHECK: br label %bb3
+ br i1 %cond232, label %bb3, label %bb2
+
+bb2: ; preds = %bb2, %bb1
+ %cann-indvar = phi i32 [ 0, %bb1 ], [ %add1-indvar, %bb2 ] ; <i32> [#uses=2]
+ %reg130-scale = mul i32 %cann-indvar, -1 ; <i32> [#uses=1]
+ %reg130 = add i32 %reg130-scale, %reg129 ; <i32> [#uses=1]
+ %add1-indvar = add i32 %cann-indvar, 1 ; <i32> [#uses=1]
+ %reg130-idxcast = bitcast i32 %reg130 to i32 ; <i32> [#uses=1]
+ %reg130-idxcast-offset = add i32 %reg130-idxcast, 1073741823 ; <i32> [#uses=1]
+ %reg130-idxcast-offset.upgrd.2 = zext i32 %reg130-idxcast-offset to i64 ; <i64> [#uses=1]
+ %reg118 = getelementptr i32, i32* %set, i64 %reg130-idxcast-offset.upgrd.2 ; <i32*> [#uses=1]
+ %reg119 = load i32, i32* %reg118 ; <i32> [#uses=1]
+ %cond233 = icmp eq i32 %reg119, 0 ; <i1> [#uses=1]
+ br i1 %cond233, label %bb2, label %bb3
+
+bb3: ; preds = %bb2, %bb1
+ store i32 %reg110, i32* %set
+ %cast126 = zext i32 %reg110 to i64 ; <i64> [#uses=1]
+ %reg127 = add i64 %cast126, -1 ; <i64> [#uses=1]
+ %reg128 = lshr i64 %reg127, 63 ; <i64> [#uses=1]
+ %cast120 = trunc i64 %reg128 to i32 ; <i32> [#uses=1]
+ ret i32 %cast120
+}
+
diff --git a/llvm/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll b/llvm/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll
new file mode 100644
index 00000000000..a83d856e9d7
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll
@@ -0,0 +1,14 @@
+; This testcase fails because ADCE does not correctly delete the chain of
+; three instructions that are dead here. Ironically there were a dead basic
+; block in this function, it would work fine, but that would be the part we
+; have to fix now, wouldn't it....
+;
+; RUN: opt < %s -adce -S | FileCheck %s
+
+define void @foo(i8* %reg5481) {
+ %cast611 = bitcast i8* %reg5481 to i8** ; <i8**> [#uses=1]
+ %reg162 = load i8*, i8** %cast611 ; <i8*> [#uses=1]
+; CHECK-NOT: ptrtoint
+ ptrtoint i8* %reg162 to i32 ; <i32>:1 [#uses=0]
+ ret void
+}
diff --git a/llvm/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll b/llvm/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll
new file mode 100644
index 00000000000..bb8ef26c61c
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll
@@ -0,0 +1,50 @@
+; This testcase was extracted from the gzip SPEC benchmark
+;
+; RUN: opt < %s -adce | FileCheck %s
+
+@bk = external global i32 ; <i32*> [#uses=2]
+@hufts = external global i32 ; <i32*> [#uses=1]
+
+define i32 @inflate() {
+bb0:
+ br label %bb2
+
+bb2: ; preds = %bb6, %bb0
+ %reg128 = phi i32 [ %reg130, %bb6 ], [ 0, %bb0 ] ; <i32> [#uses=2]
+ br i1 true, label %bb4, label %bb3
+
+bb3: ; preds = %bb2
+ br label %UnifiedExitNode
+
+; CHECK-NOT: bb4:
+; CHECK-NOT: bb5:
+bb4: ; preds = %bb2
+ %reg117 = load i32, i32* @hufts ; <i32> [#uses=2]
+ %cond241 = icmp ule i32 %reg117, %reg128 ; <i1> [#uses=1]
+ br i1 %cond241, label %bb6, label %bb5
+
+bb5: ; preds = %bb4
+ br label %bb6
+
+bb6: ; preds = %bb5, %bb4
+ %reg130 = phi i32 [ %reg117, %bb5 ], [ %reg128, %bb4 ] ; <i32> [#uses=1]
+ br i1 false, label %bb2, label %bb7
+
+bb7: ; preds = %bb6
+ %reg126 = load i32, i32* @bk ; <i32> [#uses=1]
+ %cond247 = icmp ule i32 %reg126, 7 ; <i1> [#uses=1]
+ br i1 %cond247, label %bb9, label %bb8
+
+bb8: ; preds = %bb8, %bb7
+ %reg119 = load i32, i32* @bk ; <i32> [#uses=1]
+ %cond256 = icmp ugt i32 %reg119, 7 ; <i1> [#uses=1]
+ br i1 %cond256, label %bb8, label %bb9
+
+bb9: ; preds = %bb8, %bb7
+ br label %UnifiedExitNode
+
+UnifiedExitNode: ; preds = %bb9, %bb3
+ %UnifiedRetVal = phi i32 [ 7, %bb3 ], [ 0, %bb9 ] ; <i32> [#uses=1]
+ ret i32 %UnifiedRetVal
+}
+
diff --git a/llvm/test/Transforms/ADCE/2002-07-29-Segfault.ll b/llvm/test/Transforms/ADCE/2002-07-29-Segfault.ll
new file mode 100644
index 00000000000..6745555a406
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2002-07-29-Segfault.ll
@@ -0,0 +1,10 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -disable-output -adce-remove-loops
+
+define void @test() {
+ br label %BB3
+
+BB3: ; preds = %BB3, %0
+ br label %BB3
+}
+
diff --git a/llvm/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll b/llvm/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll
new file mode 100644
index 00000000000..ac395de6d41
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll
@@ -0,0 +1,30 @@
+; Testcase reduced from 197.parser by bugpoint
+; RUN: opt < %s -adce
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define void @conjunction_prune() {
+; <label>:0
+ br label %bb19
+
+bb19: ; preds = %bb23, %bb22, %0
+ %reg205 = phi i8* [ null, %bb22 ], [ null, %bb23 ], [ null, %0 ] ; <i8*> [#uses=1]
+; CHECK: br label %bb22
+ br i1 false, label %bb21, label %bb22
+
+bb21: ; preds = %bb19
+ %cast455 = bitcast i8* %reg205 to i8** ; <i8**> [#uses=0]
+; CHECK: br label %bb22
+ br label %bb22
+
+bb22: ; preds = %bb21, %bb19
+; CHECK: br label %bb23
+ br i1 false, label %bb19, label %bb23
+
+bb23: ; preds = %bb22
+; CHECK: br label %bb28
+ br i1 false, label %bb19, label %bb28
+
+bb28: ; preds = %bb23
+ ret void
+}
+
diff --git a/llvm/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll b/llvm/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll
new file mode 100644
index 00000000000..37adba599cd
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll
@@ -0,0 +1,37 @@
+; THis testcase caused an assertion failure because a PHI node did not have
+; entries for it's postdominator. But I think this can only happen when the
+; PHI node is dead, so we just avoid patching up dead PHI nodes.
+
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+target datalayout = "e-p:32:32"
+
+define void @dead_test8() {
+entry:
+ br label %loopentry
+
+loopentry: ; preds = %endif, %entry
+ %k.1 = phi i32 [ %k.0, %endif ], [ 0, %entry ] ; <i32> [#uses=1]
+ br i1 false, label %no_exit, label %return
+
+no_exit: ; preds = %loopentry
+; CHECK: br label %then
+ br i1 false, label %then, label %else
+
+then: ; preds = %no_exit
+ br label %endif
+
+else: ; preds = %no_exit
+ %dec = add i32 %k.1, -1 ; <i32> [#uses=1]
+ br label %endif
+
+endif: ; preds = %else, %then
+ %k.0 = phi i32 [ %dec, %else ], [ 0, %then ] ; <i32> [#uses=1]
+ store i32 2, i32* null
+ br label %loopentry
+
+return: ; preds = %loopentry
+ ret void
+}
+
diff --git a/llvm/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll b/llvm/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll
new file mode 100644
index 00000000000..8ff98b7e7b3
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll
@@ -0,0 +1,29 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -disable-output
+
+@G = external global i32* ; <i32**> [#uses=1]
+
+declare void @Fn(i32*)
+
+define i32 @main(i32 %argc.1, i8** %argv.1) {
+entry:
+ br label %endif.42
+
+endif.42: ; preds = %shortcirc_done.12, %then.66, %endif.42, %entry
+ br i1 false, label %endif.65, label %endif.42
+
+then.66: ; preds = %shortcirc_done.12
+ call void @Fn( i32* %tmp.2846 )
+ br label %endif.42
+
+endif.65: ; preds = %endif.42
+ %tmp.2846 = load i32*, i32** @G ; <i32*> [#uses=1]
+ br i1 false, label %shortcirc_next.12, label %shortcirc_done.12
+
+shortcirc_next.12: ; preds = %endif.65
+ br label %shortcirc_done.12
+
+shortcirc_done.12: ; preds = %shortcirc_next.12, %endif.65
+ br i1 false, label %then.66, label %endif.42
+}
+
diff --git a/llvm/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll b/llvm/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll
new file mode 100644
index 00000000000..48513654f8d
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll
@@ -0,0 +1,94 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops=true -disable-output
+
+target datalayout = "e-p:32:32"
+ %struct..CppObjTypeDesc = type { i32, i16, i16 }
+ %struct..TypeToken = type { i32, i16, i16 }
+
+define i32 @C_ReFaxToDb() {
+entry:
+ br i1 false, label %endif.0, label %then.0
+
+then.0: ; preds = %entry
+ ret i32 0
+
+endif.0: ; preds = %entry
+ br i1 false, label %then.11, label %then.4
+
+then.4: ; preds = %endif.0
+ ret i32 0
+
+then.11: ; preds = %endif.0
+ br i1 false, label %loopentry.0, label %else.2
+
+loopentry.0: ; preds = %loopentry.1, %endif.14, %then.11
+ br i1 false, label %endif.14, label %loopexit.0
+
+endif.14: ; preds = %loopentry.0
+ br i1 false, label %loopentry.1, label %loopentry.0
+
+loopentry.1: ; preds = %then.53, %endif.14
+ %SubArrays.10 = phi i32* [ %SubArrays.8, %then.53 ], [ null, %endif.14 ] ; <i32*> [#uses=3]
+ br i1 false, label %no_exit.1, label %loopentry.0
+
+no_exit.1: ; preds = %loopentry.1
+; CHECK: switch
+ switch i32 0, label %label.17 [
+ i32 2, label %label.11
+ i32 19, label %label.10
+ ]
+
+label.10: ; preds = %no_exit.1
+ br i1 false, label %then.43, label %endif.43
+
+then.43: ; preds = %label.10
+ br i1 false, label %then.44, label %endif.44
+
+then.44: ; preds = %then.43
+ br i1 false, label %shortcirc_next.4, label %endif.45
+
+shortcirc_next.4: ; preds = %then.44
+ br i1 false, label %no_exit.2, label %loopexit.2
+
+no_exit.2: ; preds = %shortcirc_next.4
+ %tmp.897 = getelementptr i32, i32* %SubArrays.10, i64 0 ; <i32*> [#uses=1]
+ %tmp.899 = load i32, i32* %tmp.897 ; <i32> [#uses=1]
+ store i32 %tmp.899, i32* null
+ ret i32 0
+
+loopexit.2: ; preds = %shortcirc_next.4
+ ret i32 0
+
+endif.45: ; preds = %then.44
+ ret i32 0
+
+endif.44: ; preds = %then.43
+ ret i32 0
+
+endif.43: ; preds = %label.10
+ ret i32 0
+
+label.11: ; preds = %no_exit.1
+ ret i32 0
+
+label.17: ; preds = %no_exit.1
+ br i1 false, label %then.53, label %shortcirc_next.7
+
+shortcirc_next.7: ; preds = %label.17
+ br i1 false, label %then.53, label %shortcirc_next.8
+
+shortcirc_next.8: ; preds = %shortcirc_next.7
+ ret i32 0
+
+then.53: ; preds = %shortcirc_next.7, %label.17
+ %SubArrays.8 = phi i32* [ %SubArrays.10, %shortcirc_next.7 ], [ %SubArrays.10, %label.17 ] ; <i32*> [#uses=1]
+ %tmp.1023 = load i32, i32* null ; <i32> [#uses=1]
+ switch i32 %tmp.1023, label %loopentry.1 [
+ ]
+
+loopexit.0: ; preds = %loopentry.0
+ ret i32 0
+
+else.2: ; preds = %then.11
+ ret i32 0
+}
diff --git a/llvm/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll b/llvm/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll
new file mode 100644
index 00000000000..ac2a30d40b9
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll
@@ -0,0 +1,44 @@
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define void @dead_test8(i32* %data.1, i32 %idx.1) {
+entry:
+ %tmp.1 = load i32, i32* %data.1 ; <i32> [#uses=2]
+ %tmp.41 = icmp sgt i32 %tmp.1, 0 ; <i1> [#uses=1]
+ br i1 %tmp.41, label %no_exit.preheader, label %return
+
+no_exit.preheader: ; preds = %entry
+ %tmp.11 = getelementptr i32, i32* %data.1, i64 1 ; <i32*> [#uses=1]
+ %tmp.22-idxcast = sext i32 %idx.1 to i64 ; <i64> [#uses=1]
+ %tmp.28 = getelementptr i32, i32* %data.1, i64 %tmp.22-idxcast ; <i32*> [#uses=1]
+ br label %no_exit
+
+no_exit: ; preds = %endif, %no_exit.preheader
+ %k.1 = phi i32 [ %k.0, %endif ], [ 0, %no_exit.preheader ] ; <i32> [#uses=3]
+ %i.0 = phi i32 [ %inc.1, %endif ], [ 0, %no_exit.preheader ] ; <i32> [#uses=1]
+ %tmp.12 = load i32, i32* %tmp.11 ; <i32> [#uses=1]
+ %tmp.14 = sub i32 0, %tmp.12 ; <i32> [#uses=1]
+; CHECK-NOT: %tmp.161
+ %tmp.161 = icmp ne i32 %k.1, %tmp.14 ; <i1> [#uses=1]
+; CHECK: br label %then
+ br i1 %tmp.161, label %then, label %else
+
+then: ; preds = %no_exit
+ %inc.0 = add i32 %k.1, 1 ; <i32> [#uses=1]
+ br label %endif
+
+else: ; preds = %no_exit
+ %dec = add i32 %k.1, -1 ; <i32> [#uses=1]
+ br label %endif
+
+endif: ; preds = %else, %then
+ %k.0 = phi i32 [ %dec, %else ], [ %inc.0, %then ] ; <i32> [#uses=1]
+ store i32 2, i32* %tmp.28
+ %inc.1 = add i32 %i.0, 1 ; <i32> [#uses=2]
+ %tmp.4 = icmp slt i32 %inc.1, %tmp.1 ; <i1> [#uses=1]
+ br i1 %tmp.4, label %no_exit, label %return
+
+return: ; preds = %endif, %entry
+ ret void
+}
+
diff --git a/llvm/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll b/llvm/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll
new file mode 100644
index 00000000000..607bf2e5809
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll
@@ -0,0 +1,22 @@
+; RUN: opt < %s -adce -disable-output
+
+define void @test() personality i32 (...)* @__gxx_personality_v0 {
+ br i1 false, label %then, label %endif
+
+then: ; preds = %0
+ invoke void null( i8* null )
+ to label %invoke_cont unwind label %invoke_catch
+
+invoke_catch: ; preds = %then
+ %exn = landingpad {i8*, i32}
+ cleanup
+ resume { i8*, i32 } %exn
+
+invoke_cont: ; preds = %then
+ ret void
+
+endif: ; preds = %0
+ ret void
+}
+
+declare i32 @__gxx_personality_v0(...)
diff --git a/llvm/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll b/llvm/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll
new file mode 100644
index 00000000000..458045a086f
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll
@@ -0,0 +1,10 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -disable-output
+
+define i32 @main() {
+ br label %loop
+
+loop: ; preds = %loop, %0
+ br label %loop
+}
+
diff --git a/llvm/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll b/llvm/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll
new file mode 100644
index 00000000000..f60469a6163
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll
@@ -0,0 +1,20 @@
+; RUN: opt < %s -adce -simplifycfg -S | grep call
+; RUN: opt < %s -adce -adce-remove-loops -simplifycfg -S | grep call
+
+declare void @exit(i32)
+
+define i32 @main(i32 %argc) {
+ %C = icmp eq i32 %argc, 1 ; <i1> [#uses=2]
+ br i1 %C, label %Cond, label %Done
+
+Cond: ; preds = %0
+ br i1 %C, label %Loop, label %Done
+
+Loop: ; preds = %Loop, %Cond
+ call void @exit( i32 0 )
+ br label %Loop
+
+Done: ; preds = %Cond, %0
+ ret i32 1
+}
+
diff --git a/llvm/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll b/llvm/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll
new file mode 100644
index 00000000000..123b6832f0f
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll
@@ -0,0 +1,17 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -disable-output
+
+define void @test() {
+entry:
+ br label %UnifiedReturnBlock
+
+UnifiedReturnBlock: ; preds = %invoke_catch.0, %entry
+ ret void
+
+invoke_catch.0: ; No predecessors!
+ br i1 false, label %UnifiedUnwindBlock, label %UnifiedReturnBlock
+
+UnifiedUnwindBlock: ; preds = %invoke_catch.0
+ unreachable
+}
+
diff --git a/llvm/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll b/llvm/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll
new file mode 100644
index 00000000000..068ad2bc1d8
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll
@@ -0,0 +1,52 @@
+; RUN: opt < %s -adce -disable-output
+
+declare void @strlen()
+
+declare void @_ZN10QByteArray6resizeEi()
+
+declare void @q_atomic_decrement()
+
+define void @_ZNK10QByteArray13leftJustifiedEicb() personality i32 (...)* @__gxx_personality_v0 {
+entry:
+ invoke void @strlen( )
+ to label %tmp.3.i.noexc unwind label %invoke_catch.0
+
+tmp.3.i.noexc: ; preds = %entry
+ br i1 false, label %then.0, label %else.0
+
+invoke_catch.0: ; preds = %entry
+ %exn.0 = landingpad {i8*, i32}
+ cleanup
+ invoke void @q_atomic_decrement( )
+ to label %tmp.1.i.i183.noexc unwind label %terminate
+
+tmp.1.i.i183.noexc: ; preds = %invoke_catch.0
+ ret void
+
+then.0: ; preds = %tmp.3.i.noexc
+ invoke void @_ZN10QByteArray6resizeEi( )
+ to label %invoke_cont.1 unwind label %invoke_catch.1
+
+invoke_catch.1: ; preds = %then.0
+ %exn.1 = landingpad {i8*, i32}
+ cleanup
+ invoke void @q_atomic_decrement( )
+ to label %tmp.1.i.i162.noexc unwind label %terminate
+
+tmp.1.i.i162.noexc: ; preds = %invoke_catch.1
+ ret void
+
+invoke_cont.1: ; preds = %then.0
+ ret void
+
+else.0: ; preds = %tmp.3.i.noexc
+ ret void
+
+terminate: ; preds = %invoke_catch.1, %invoke_catch.0
+ %dbg.0.1 = phi { }* [ null, %invoke_catch.1 ], [ null, %invoke_catch.0 ] ; <{ }*> [#uses=0]
+ %exn = landingpad {i8*, i32}
+ cleanup
+ unreachable
+}
+
+declare i32 @__gxx_personality_v0(...)
diff --git a/llvm/test/Transforms/ADCE/2016-09-06.ll b/llvm/test/Transforms/ADCE/2016-09-06.ll
new file mode 100644
index 00000000000..6a2d396ecda
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2016-09-06.ll
@@ -0,0 +1,55 @@
+; RUN: opt < %s -sroa -adce -adce-remove-loops -S | FileCheck %s
+; ModuleID = 'test1.bc'
+source_filename = "test1.c"
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Function Attrs: nounwind uwtable
+define i32 @foo(i32, i32, i32) #0 {
+ %4 = alloca i32, align 4
+ %5 = alloca i32, align 4
+ %6 = alloca i32, align 4
+ %7 = alloca i32, align 4
+ %8 = alloca i32, align 4
+ store i32 %0, i32* %4, align 4
+ store i32 %1, i32* %5, align 4
+ store i32 %2, i32* %6, align 4
+ store i32 0, i32* %7, align 4
+ %9 = load i32, i32* %5, align 4
+ %I10 = icmp ne i32 %9, 0
+ br i1 %I10, label %B11, label %B21
+
+B11:
+ store i32 0, i32* %8, align 4
+ br label %B12
+
+B12:
+ %I13 = load i32, i32* %8, align 4
+ %I14 = load i32, i32* %6, align 4
+ %I15 = icmp slt i32 %I13, %I14
+; CHECK: br label %B20
+ br i1 %I15, label %B16, label %B20
+
+B16:
+ br label %B17
+
+B17:
+ %I18 = load i32, i32* %8, align 4
+ %I19 = add nsw i32 %I18, 1
+ store i32 %I19, i32* %8, align 4
+ br label %B12
+
+B20:
+ store i32 1, i32* %7, align 4
+ br label %B21
+
+B21:
+ %I22 = load i32, i32* %7, align 4
+ ret i32 %I22
+}
+
+attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 4.0.0"}
diff --git a/llvm/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll b/llvm/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll
new file mode 100644
index 00000000000..e532f29e9f4
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll
@@ -0,0 +1,24 @@
+; RUN: opt < %s -adce | llvm-dis
+; RUN: opt < %s -adce -verify-dom-info | llvm-dis
+
+define void @foo() {
+entry:
+ br label %switch
+switch: ; preds = %entry
+ switch i32 undef, label %default [
+ i32 2, label %two
+ i32 5, label %five
+ i32 4, label %four
+ ]
+four: ; preds = %switch
+ br label %exit
+five: ; preds = %switch
+ br label %exit
+two: ; preds = %switch
+ br label %exit
+default: ; preds = %switch
+ br label %exit
+exit: ; preds = %default, %two, %five, %four
+ ret void
+}
+
diff --git a/llvm/test/Transforms/ADCE/basictest.ll b/llvm/test/Transforms/ADCE/basictest.ll
new file mode 100644
index 00000000000..aaacc184225
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/basictest.ll
@@ -0,0 +1,18 @@
+; RUN: opt < %s -adce -simplifycfg | llvm-dis
+; RUN: opt < %s -passes=adce | llvm-dis
+
+define i32 @Test(i32 %A, i32 %B) {
+BB1:
+ br label %BB4
+
+BB2: ; No predecessors!
+ br label %BB3
+
+BB3: ; preds = %BB4, %BB2
+ %ret = phi i32 [ %X, %BB4 ], [ %B, %BB2 ] ; <i32> [#uses=1]
+ ret i32 %ret
+
+BB4: ; preds = %BB1
+ %X = phi i32 [ %A, %BB1 ] ; <i32> [#uses=1]
+ br label %BB3
+}
diff --git a/llvm/test/Transforms/ADCE/basictest1.ll b/llvm/test/Transforms/ADCE/basictest1.ll
new file mode 100644
index 00000000000..76bb5cabf66
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/basictest1.ll
@@ -0,0 +1,102 @@
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+%FILE = type { i32, i8*, i8*, i8, i8, i32, i32, i32 }
+ %spec_fd_t = type { i32, i32, i32, i8* }
+@__iob = external global [20 x %FILE] ; <[20 x %FILE]*> [#uses=1]
+@dbglvl = global i32 4 ; <i32*> [#uses=3]
+@spec_fd = external global [3 x %spec_fd_t] ; <[3 x %spec_fd_t]*> [#uses=4]
+@.LC9 = internal global [34 x i8] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00" ; <[34 x i8]*> [#uses=1]
+@.LC10 = internal global [4 x i8] c"EOF\00" ; <[4 x i8]*> [#uses=1]
+@.LC11 = internal global [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=1]
+@.LC12 = internal global [17 x i8] c"spec_getc: %d = \00" ; <[17 x i8]*> [#uses=1]
+
+declare i32 @fprintf(%FILE*, i8*, ...)
+
+declare void @exit(i32)
+
+declare i32 @remove(i8*)
+
+declare i32 @fputc(i32, %FILE*)
+
+declare i32 @fwrite(i8*, i32, i32, %FILE*)
+
+declare void @perror(i8*)
+
+define i32 @spec_getc(i32 %fd) {
+ %reg109 = load i32, i32* @dbglvl ; <i32> [#uses=1]
+ %cond266 = icmp sle i32 %reg109, 4 ; <i1> [#uses=1]
+; CHECKL br label %bb3
+ br i1 %cond266, label %bb3, label %bb2
+
+bb2: ; preds = %0
+ %cast273 = getelementptr [17 x i8], [17 x i8]* @.LC12, i64 0, i64 0 ; <i8*> [#uses=0]
+ br label %bb3
+
+bb3: ; preds = %bb2, %0
+ %cond267 = icmp sle i32 %fd, 3 ; <i1> [#uses=1]
+ br i1 %cond267, label %bb5, label %bb4
+
+bb4: ; preds = %bb3
+ %reg111 = getelementptr [20 x %FILE], [20 x %FILE]* @__iob, i64 0, i64 1, i32 3 ; <i8*> [#uses=1]
+ %cast274 = getelementptr [34 x i8], [34 x i8]* @.LC9, i64 0, i64 0 ; <i8*> [#uses=0]
+ %cast282 = bitcast i8* %reg111 to %FILE* ; <%FILE*> [#uses=0]
+ call void @exit( i32 1 )
+ br label %UnifiedExitNode
+
+bb5: ; preds = %bb3
+ %reg107-idxcast1 = sext i32 %fd to i64 ; <i64> [#uses=2]
+ %reg107-idxcast2 = sext i32 %fd to i64 ; <i64> [#uses=1]
+ %reg1311 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast2 ; <%spec_fd_t*> [#uses=1]
+ %idx1 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2 ; <i32*> [#uses=1]
+ %reg1321 = load i32, i32* %idx1 ; <i32> [#uses=3]
+ %idx2 = getelementptr %spec_fd_t, %spec_fd_t* %reg1311, i64 0, i32 1 ; <i32*> [#uses=1]
+ %reg1331 = load i32, i32* %idx2 ; <i32> [#uses=1]
+ %cond270 = icmp slt i32 %reg1321, %reg1331 ; <i1> [#uses=1]
+ br i1 %cond270, label %bb9, label %bb6
+
+bb6: ; preds = %bb5
+ %reg134 = load i32, i32* @dbglvl ; <i32> [#uses=1]
+ %cond271 = icmp sle i32 %reg134, 4 ; <i1> [#uses=1]
+; CHECK: br label %bb8
+ br i1 %cond271, label %bb8, label %bb7
+
+bb7: ; preds = %bb6
+ %cast277 = getelementptr [4 x i8], [4 x i8]* @.LC10, i64 0, i64 0 ; <i8*> [#uses=0]
+ br label %bb8
+
+bb8: ; preds = %bb7, %bb6
+ br label %UnifiedExitNode
+
+bb9: ; preds = %bb5
+ %reg107-idxcast3 = sext i32 %fd to i64 ; <i64> [#uses=1]
+ %idx3 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast3, i32 3 ; <i8**> [#uses=1]
+ %reg1601 = load i8*, i8** %idx3 ; <i8*> [#uses=1]
+ %reg132-idxcast1 = sext i32 %reg1321 to i64 ; <i64> [#uses=1]
+ %idx4 = getelementptr i8, i8* %reg1601, i64 %reg132-idxcast1 ; <i8*> [#uses=1]
+ %reg1621 = load i8, i8* %idx4 ; <i8> [#uses=2]
+ %cast108 = zext i8 %reg1621 to i64 ; <i64> [#uses=0]
+ %reg157 = add i32 %reg1321, 1 ; <i32> [#uses=1]
+ %idx5 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2 ; <i32*> [#uses=1]
+ store i32 %reg157, i32* %idx5
+ %reg163 = load i32, i32* @dbglvl ; <i32> [#uses=1]
+ %cond272 = icmp sle i32 %reg163, 4 ; <i1> [#uses=1]
+; CHECK: br label %bb11
+ br i1 %cond272, label %bb11, label %bb10
+
+bb10: ; preds = %bb9
+ %cast279 = getelementptr [4 x i8], [4 x i8]* @.LC11, i64 0, i64 0 ; <i8*> [#uses=0]
+ br label %bb11
+
+bb11: ; preds = %bb10, %bb9
+ %cast291 = zext i8 %reg1621 to i32 ; <i32> [#uses=1]
+ br label %UnifiedExitNode
+
+UnifiedExitNode: ; preds = %bb11, %bb8, %bb4
+ %UnifiedRetVal = phi i32 [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ] ; <i32> [#uses=1]
+ ret i32 %UnifiedRetVal
+}
+
+declare i32 @puts(i8*)
+
+declare i32 @printf(i8*, ...)
diff --git a/llvm/test/Transforms/ADCE/basictest2.ll b/llvm/test/Transforms/ADCE/basictest2.ll
new file mode 100644
index 00000000000..50336e18705
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/basictest2.ll
@@ -0,0 +1,102 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+ %FILE = type { i32, i8*, i8*, i8, i8, i32, i32, i32 }
+ %spec_fd_t = type { i32, i32, i32, i8* }
+@__iob = external global [20 x %FILE] ; <[20 x %FILE]*> [#uses=1]
+@dbglvl = global i32 4 ; <i32*> [#uses=3]
+@spec_fd = external global [3 x %spec_fd_t] ; <[3 x %spec_fd_t]*> [#uses=4]
+@.LC9 = internal global [34 x i8] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00" ; <[34 x i8]*> [#uses=1]
+@.LC10 = internal global [4 x i8] c"EOF\00" ; <[4 x i8]*> [#uses=1]
+@.LC11 = internal global [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=1]
+@.LC12 = internal global [17 x i8] c"spec_getc: %d = \00" ; <[17 x i8]*> [#uses=1]
+
+declare i32 @fprintf(%FILE*, i8*, ...)
+
+declare void @exit(i32)
+
+declare i32 @remove(i8*)
+
+declare i32 @fputc(i32, %FILE*)
+
+declare i32 @fwrite(i8*, i32, i32, %FILE*)
+
+declare void @perror(i8*)
+
+define i32 @spec_getc(i32 %fd) {
+ %reg109 = load i32, i32* @dbglvl ; <i32> [#uses=1]
+ %cond266 = icmp sle i32 %reg109, 4 ; <i1> [#uses=1]
+; CHECK: br label %bb3
+ br i1 %cond266, label %bb3, label %bb2
+
+bb2: ; preds = %0
+ %cast273 = getelementptr [17 x i8], [17 x i8]* @.LC12, i64 0, i64 0 ; <i8*> [#uses=0]
+ br label %bb3
+
+bb3: ; preds = %bb2, %0
+ %cond267 = icmp sle i32 %fd, 3 ; <i1> [#uses=0]
+ br label %bb5
+
+bb4: ; No predecessors!
+ %reg111 = getelementptr [20 x %FILE], [20 x %FILE]* @__iob, i64 0, i64 1, i32 3 ; <i8*> [#uses=1]
+ %cast274 = getelementptr [34 x i8], [34 x i8]* @.LC9, i64 0, i64 0 ; <i8*> [#uses=0]
+ %cast282 = bitcast i8* %reg111 to %FILE* ; <%FILE*> [#uses=0]
+ call void @exit( i32 1 )
+ br label %UnifiedExitNode
+
+bb5: ; preds = %bb3
+ %reg107-idxcast1 = sext i32 %fd to i64 ; <i64> [#uses=2]
+ %reg107-idxcast2 = sext i32 %fd to i64 ; <i64> [#uses=1]
+ %reg1311 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast2 ; <%spec_fd_t*> [#uses=1]
+ %idx1 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2 ; <i32*> [#uses=1]
+ %reg1321 = load i32, i32* %idx1 ; <i32> [#uses=3]
+ %idx2 = getelementptr %spec_fd_t, %spec_fd_t* %reg1311, i64 0, i32 1 ; <i32*> [#uses=1]
+ %reg1331 = load i32, i32* %idx2 ; <i32> [#uses=1]
+ %cond270 = icmp slt i32 %reg1321, %reg1331 ; <i1> [#uses=1]
+ br i1 %cond270, label %bb9, label %bb6
+
+bb6: ; preds = %bb5
+ %reg134 = load i32, i32* @dbglvl ; <i32> [#uses=1]
+ %cond271 = icmp sle i32 %reg134, 4 ; <i1> [#uses=1]
+; CHECK: br label %bb8
+ br i1 %cond271, label %bb8, label %bb7
+
+bb7: ; preds = %bb6
+ %cast277 = getelementptr [4 x i8], [4 x i8]* @.LC10, i64 0, i64 0 ; <i8*> [#uses=0]
+ br label %bb8
+
+bb8: ; preds = %bb7, %bb6
+ br label %UnifiedExitNode
+
+bb9: ; preds = %bb5
+ %reg107-idxcast3 = sext i32 %fd to i64 ; <i64> [#uses=1]
+ %idx3 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast3, i32 3 ; <i8**> [#uses=1]
+ %reg1601 = load i8*, i8** %idx3 ; <i8*> [#uses=1]
+ %reg132-idxcast1 = sext i32 %reg1321 to i64 ; <i64> [#uses=1]
+ %idx4 = getelementptr i8, i8* %reg1601, i64 %reg132-idxcast1 ; <i8*> [#uses=1]
+ %reg1621 = load i8, i8* %idx4 ; <i8> [#uses=2]
+ %cast108 = zext i8 %reg1621 to i64 ; <i64> [#uses=0]
+ %reg157 = add i32 %reg1321, 1 ; <i32> [#uses=1]
+ %idx5 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2 ; <i32*> [#uses=1]
+ store i32 %reg157, i32* %idx5
+ %reg163 = load i32, i32* @dbglvl ; <i32> [#uses=1]
+ %cond272 = icmp sle i32 %reg163, 4 ; <i1> [#uses=1]
+; CHECK: br label %bb11
+ br i1 %cond272, label %bb11, label %bb10
+
+bb10: ; preds = %bb9
+ %cast279 = getelementptr [4 x i8], [4 x i8]* @.LC11, i64 0, i64 0 ; <i8*> [#uses=0]
+ br label %bb11
+
+bb11: ; preds = %bb10, %bb9
+ %cast291 = zext i8 %reg1621 to i32 ; <i32> [#uses=1]
+ br label %UnifiedExitNode
+
+UnifiedExitNode: ; preds = %bb11, %bb8, %bb4
+ %UnifiedRetVal = phi i32 [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ] ; <i32> [#uses=1]
+ ret i32 %UnifiedRetVal
+}
+
+declare i32 @puts(i8*)
+
+declare i32 @printf(i8*, ...)
diff --git a/llvm/test/Transforms/ADCE/dce_pure_call.ll b/llvm/test/Transforms/ADCE/dce_pure_call.ll
new file mode 100644
index 00000000000..66483abbc91
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/dce_pure_call.ll
@@ -0,0 +1,8 @@
+; RUN: opt -adce -S < %s | not grep call
+
+declare i32 @strlen(i8*) readonly nounwind
+
+define void @test() {
+ call i32 @strlen( i8* null ) ; <i32>:1 [#uses=0]
+ ret void
+}
diff --git a/llvm/test/Transforms/ADCE/dce_pure_invoke.ll b/llvm/test/Transforms/ADCE/dce_pure_invoke.ll
new file mode 100644
index 00000000000..e01c9feaeb0
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/dce_pure_invoke.ll
@@ -0,0 +1,19 @@
+; RUN: opt < %s -adce -S | grep null
+
+declare i32 @strlen(i8*) readnone
+
+define i32 @test() personality i32 (...)* @__gxx_personality_v0 {
+ ; invoke of pure function should not be deleted!
+ invoke i32 @strlen( i8* null ) readnone
+ to label %Cont unwind label %Other ; <i32>:1 [#uses=0]
+
+Cont: ; preds = %0
+ ret i32 0
+
+Other: ; preds = %0
+ %exn = landingpad {i8*, i32}
+ cleanup
+ ret i32 1
+}
+
+declare i32 @__gxx_personality_v0(...)
diff --git a/llvm/test/Transforms/ADCE/debug-info-intrinsic.ll b/llvm/test/Transforms/ADCE/debug-info-intrinsic.ll
new file mode 100644
index 00000000000..f32122bb4c3
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/debug-info-intrinsic.ll
@@ -0,0 +1,100 @@
+; RUN: opt -adce -S < %s | FileCheck %s
+; Test that debug info intrinsics in dead scopes get eliminated by -adce.
+
+; Generated with 'clang -g -S -emit-llvm | opt -mem2reg -inline' at r262899
+; (before -adce was augmented) and then hand-reduced. This was the input:
+;
+;;void sink(void);
+;;
+;;void variable_in_unused_subscope(void) {
+;; { int i = 0; }
+;; sink();
+;;}
+;;
+;;void variable_in_parent_scope(void) {
+;; int i = 0;
+;; { sink(); }
+;;}
+;;
+;;static int empty_function_with_unused_variable(void) {
+;; { int i = 0; }
+;; return 0;
+;;}
+;;
+;;void calls_empty_function_with_unused_variable_in_unused_subscope(void) {
+;; { empty_function_with_unused_variable(); }
+;; sink();
+;;}
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+declare void @sink()
+
+; CHECK-LABEL: define void @variable_in_unused_subscope(
+define void @variable_in_unused_subscope() !dbg !4 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call void @sink
+; CHECK-NEXT: ret void
+entry:
+ call void @llvm.dbg.value(metadata i32 0, metadata !15, metadata !17), !dbg !18
+ call void @sink(), !dbg !19
+ ret void, !dbg !20
+}
+
+; CHECK-LABEL: define void @variable_in_parent_scope(
+define void @variable_in_parent_scope() !dbg !7 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call void @llvm.dbg.value
+; CHECK-NEXT: call void @sink
+; CHECK-NEXT: ret void
+entry:
+ call void @llvm.dbg.value(metadata i32 0, metadata !21, metadata !17), !dbg !22
+ call void @sink(), !dbg !23
+ ret void, !dbg !25
+}
+
+; CHECK-LABEL: define void @calls_empty_function_with_unused_variable_in_unused_subscope(
+define void @calls_empty_function_with_unused_variable_in_unused_subscope() !dbg !8 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call void @sink
+; CHECK-NEXT: ret void
+entry:
+ call void @llvm.dbg.value(metadata i32 0, metadata !26, metadata !17), !dbg !28
+ call void @sink(), !dbg !31
+ ret void, !dbg !32
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!14}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "t.c", directory: "/path/to/test/Transforms/ADCE")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "variable_in_unused_subscope", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null}
+!7 = distinct !DISubprogram(name: "variable_in_parent_scope", scope: !1, file: !1, line: 8, type: !5, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!8 = distinct !DISubprogram(name: "calls_empty_function_with_unused_variable_in_unused_subscope", scope: !1, file: !1, line: 18, type: !5, isLocal: false, isDefinition: true, scopeLine: 18, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!10 = distinct !DISubprogram(name: "empty_function_with_unused_variable", scope: !1, file: !1, line: 13, type: !11, isLocal: true, isDefinition: true, scopeLine: 13, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!11 = !DISubroutineType(types: !12)
+!12 = !{!13}
+!13 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!14 = !{i32 2, !"Debug Info Version", i32 3}
+!15 = !DILocalVariable(name: "i", scope: !16, file: !1, line: 4, type: !13)
+!16 = distinct !DILexicalBlock(scope: !4, file: !1, line: 4, column: 3)
+!17 = !DIExpression()
+!18 = !DILocation(line: 4, column: 9, scope: !16)
+!19 = !DILocation(line: 5, column: 3, scope: !4)
+!20 = !DILocation(line: 6, column: 1, scope: !4)
+!21 = !DILocalVariable(name: "i", scope: !7, file: !1, line: 9, type: !13)
+!22 = !DILocation(line: 9, column: 7, scope: !7)
+!23 = !DILocation(line: 10, column: 5, scope: !24)
+!24 = distinct !DILexicalBlock(scope: !7, file: !1, line: 10, column: 3)
+!25 = !DILocation(line: 11, column: 1, scope: !7)
+!26 = !DILocalVariable(name: "i", scope: !27, file: !1, line: 14, type: !13)
+!27 = distinct !DILexicalBlock(scope: !10, file: !1, line: 14, column: 3)
+!28 = !DILocation(line: 14, column: 9, scope: !27, inlinedAt: !29)
+!29 = distinct !DILocation(line: 19, column: 5, scope: !30)
+!30 = distinct !DILexicalBlock(scope: !8, file: !1, line: 19, column: 3)
+!31 = !DILocation(line: 20, column: 3, scope: !8)
+!32 = !DILocation(line: 21, column: 1, scope: !8)
diff --git a/llvm/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll b/llvm/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll
new file mode 100644
index 00000000000..804b3dd67f2
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll
@@ -0,0 +1,19 @@
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -passes=adce -S | FileCheck %s
+
+; Verify that a call to instrument a constant is deleted.
+
+@__profc_foo = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
+@__profd_foo = private global { i64, i64, i64*, i8*, i8*, i32, [1 x i16] } { i64 6699318081062747564, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc_foo, i32 0, i32 0), i8* bitcast (i32 ()* @foo to i8*), i8* null, i32 1, [1 x i16] [i16 1] }, section "__llvm_prf_data", align 8
+
+define i32 @foo() {
+; CHECK-NOT: call void @__llvm_profile_instrument_target
+entry:
+ tail call void @__llvm_profile_instrument_target(i64 ptrtoint (i32 (i32)* @bar to i64), i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd_foo to i8*), i32 0)
+ %call = tail call i32 @bar(i32 21)
+ ret i32 %call
+}
+
+declare i32 @bar(i32)
+
+declare void @__llvm_profile_instrument_target(i64, i8*, i32)
diff --git a/llvm/test/Transforms/ADCE/domtree-DoubleDeletion.ll b/llvm/test/Transforms/ADCE/domtree-DoubleDeletion.ll
new file mode 100644
index 00000000000..018eb79b26f
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/domtree-DoubleDeletion.ll
@@ -0,0 +1,39 @@
+; RUN: opt < %s -gvn -simplifycfg -adce | llvm-dis
+; RUN: opt < %s -gvn -simplifycfg -adce -verify-dom-info | llvm-dis
+
+; This test makes sure that the DominatorTree properly handles
+; deletion of edges that go to forward-unreachable regions.
+; In this case, %land.end is already forward unreachable when
+; the DT gets informed about the deletion of %entry -> %land.end.
+
+@a = common global i32 0, align 4
+
+define i32 @main() {
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ %0 = load i32, i32* @a, align 4
+ %cmp = icmp ne i32 %0, 1
+ br i1 %cmp, label %land.rhs, label %land.end4
+
+land.rhs: ; preds = %entry
+ %1 = load i32, i32* @a, align 4
+ %tobool = icmp ne i32 %1, 0
+ br i1 %tobool, label %land.rhs1, label %land.end
+
+land.rhs1: ; preds = %land.rhs
+ br label %land.end
+
+land.end: ; preds = %land.rhs1, %land.rhs
+ %2 = phi i1 [ false, %land.rhs ], [ true, %land.rhs1 ]
+ %land.ext = zext i1 %2 to i32
+ %conv = trunc i32 %land.ext to i16
+ %conv2 = sext i16 %conv to i32
+ %tobool3 = icmp ne i32 %conv2, 0
+ br label %land.end4
+
+land.end4: ; preds = %land.end, %entry
+ %3 = phi i1 [ false, %entry ], [ %tobool3, %land.end ]
+ %land.ext5 = zext i1 %3 to i32
+ ret i32 0
+}
diff --git a/llvm/test/Transforms/ADCE/unreachable-function.ll b/llvm/test/Transforms/ADCE/unreachable-function.ll
new file mode 100644
index 00000000000..7c6a30ec6b6
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/unreachable-function.ll
@@ -0,0 +1,5 @@
+; RUN: opt < %s -adce -disable-output
+
+define void @test() {
+ unreachable
+}
diff --git a/llvm/test/Transforms/ADCE/unreachable.ll b/llvm/test/Transforms/ADCE/unreachable.ll
new file mode 100644
index 00000000000..aaacc184225
--- /dev/null
+++ b/llvm/test/Transforms/ADCE/unreachable.ll
@@ -0,0 +1,18 @@
+; RUN: opt < %s -adce -simplifycfg | llvm-dis
+; RUN: opt < %s -passes=adce | llvm-dis
+
+define i32 @Test(i32 %A, i32 %B) {
+BB1:
+ br label %BB4
+
+BB2: ; No predecessors!
+ br label %BB3
+
+BB3: ; preds = %BB4, %BB2
+ %ret = phi i32 [ %X, %BB4 ], [ %B, %BB2 ] ; <i32> [#uses=1]
+ ret i32 %ret
+
+BB4: ; preds = %BB1
+ %X = phi i32 [ %A, %BB1 ] ; <i32> [#uses=1]
+ br label %BB3
+}
OpenPOWER on IntegriCloud