summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorJakub Kuderski <kubakuderski@gmail.com>2017-08-22 16:30:21 +0000
committerJakub Kuderski <kubakuderski@gmail.com>2017-08-22 16:30:21 +0000
commit2724d453256140b3ca71f4d4cd64845cb0d16e28 (patch)
tree3e8c9cdc59e5fe2f97be53f247316e848dffc0d7 /llvm/test/Transforms
parenta680a8f5f85f217a353ae0d5a90efc672faf1d01 (diff)
downloadbcm5719-llvm-2724d453256140b3ca71f4d4cd64845cb0d16e28.tar.gz
bcm5719-llvm-2724d453256140b3ca71f4d4cd64845cb0d16e28.zip
[ADCE][Dominators] Reapply: Teach ADCE to preserve dominators
Summary: This patch teaches ADCE to preserve both DominatorTrees and PostDominatorTrees. This is reapplies the original patch r311057 that was reverted in r311381. The previous version wasn't using the batch update api for updating dominators, which in vary rare cases caused assertion failures. This also fixes PR34258. Reviewers: dberlin, chandlerc, sanjoy, davide, grosser, brzycki Reviewed By: davide Subscribers: grandinj, zhendongsu, llvm-commits, david2050 Differential Revision: https://reviews.llvm.org/D35869 llvm-svn: 311467
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll24
-rw-r--r--llvm/test/Transforms/ADCE/domtree-DoubleDeletion.ll39
-rw-r--r--llvm/test/Transforms/ADCE/unreachable.ll18
3 files changed, 81 insertions, 0 deletions
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/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.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