[llvm] 48f1884 - [DSE] Add additional tests with unreachable exits.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 14 06:28:59 PST 2022


Author: Florian Hahn
Date: 2022-02-14T14:28:49Z
New Revision: 48f188433335846bba4cf3e5e9fa2150d4c0253b

URL: https://github.com/llvm/llvm-project/commit/48f188433335846bba4cf3e5e9fa2150d4c0253b
DIFF: https://github.com/llvm/llvm-project/commit/48f188433335846bba4cf3e5e9fa2150d4c0253b.diff

LOG: [DSE] Add additional tests with unreachable exits.

Adds tests for #53800.

Added: 
    

Modified: 
    llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll
index 6548ec34ae0ac..a931922ab2c82 100644
--- a/llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll
@@ -57,3 +57,141 @@ bb50:                                             ; preds = %bb43
 bb53:                                             ; preds = %bb53, %bb50, %bb22, %bb
   br label %bb53
 }
+
+declare void @exit()
+
+define void @unreachable_exit_with_no_call(i64* noalias %ptr, i1 %c.1) {
+; CHECK-LABEL: @unreachable_exit_with_no_call(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i64 1, i64* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    unreachable
+; CHECK:       if.end:
+; CHECK-NEXT:    store i64 0, i64* [[PTR]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i64 1, i64* %ptr, align 8
+  br i1 %c.1, label %if.then, label %if.end
+
+if.then:
+  unreachable
+
+if.end:
+  store i64 0, i64* %ptr, align 8
+  ret void
+}
+
+; Test for PR53800.
+define void @unreachable_exit_with_nounwind_call_pr53800(i64* noalias %ptr, i1 %c.1) {
+; CHECK-LABEL: @unreachable_exit_with_nounwind_call_pr53800(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i64 1, i64* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    tail call void @exit() #[[ATTR0:[0-9]+]]
+; CHECK-NEXT:    unreachable
+; CHECK:       if.end:
+; CHECK-NEXT:    store i64 0, i64* [[PTR]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i64 1, i64* %ptr, align 8
+  br i1 %c.1, label %if.then, label %if.end
+
+if.then:
+  tail call void @exit() nounwind
+  unreachable
+
+if.end:
+  store i64 0, i64* %ptr, align 8
+  ret void
+}
+
+; The call @exit may read %ptr as it is not marked as noalias
+define void @unreachable_exit_and_call_may_read(i64* %ptr, i1 %c.1) {
+; CHECK-LABEL: @unreachable_exit_and_call_may_read(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i64 1, i64* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    tail call void @exit() #[[ATTR0]]
+; CHECK-NEXT:    unreachable
+; CHECK:       if.end:
+; CHECK-NEXT:    store i64 0, i64* [[PTR]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i64 1, i64* %ptr, align 8
+  br i1 %c.1, label %if.then, label %if.end
+
+if.then:
+  tail call void @exit() nounwind
+  unreachable
+
+if.end:
+  store i64 0, i64* %ptr, align 8
+  ret void
+}
+
+define void @unreachable_exit_with_may_unwind_call(i64* noalias %ptr, i1 %c.1) {
+; CHECK-LABEL: @unreachable_exit_with_may_unwind_call(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i64 1, i64* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    tail call void @exit()
+; CHECK-NEXT:    unreachable
+; CHECK:       if.end:
+; CHECK-NEXT:    store i64 0, i64* [[PTR]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i64 1, i64* %ptr, align 8
+  br i1 %c.1, label %if.then, label %if.end
+
+if.then:
+  tail call void @exit()
+  unreachable
+
+if.end:
+  store i64 0, i64* %ptr, align 8
+  ret void
+}
+
+; Cannot remove the store in entry, because it is not dead on the path to e.1
+define void @unreachable_exit_but_another_exit(i64* noalias %ptr, i1 %c.1, i32 %s, i1 %c.2) {
+; CHECK-LABEL: @unreachable_exit_but_another_exit(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i64 1, i64* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[E_0:%.*]], label [[E_1:%.*]]
+; CHECK:       e.0:
+; CHECK-NEXT:    tail call void @exit() #[[ATTR0]]
+; CHECK-NEXT:    unreachable
+; CHECK:       e.1:
+; CHECK-NEXT:    ret void
+; CHECK:       if.end:
+; CHECK-NEXT:    store i64 0, i64* [[PTR]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i64 1, i64* %ptr, align 8
+  br i1 %c.1, label %if.then, label %if.end
+
+if.then:
+  br i1 %c.2, label %e.0, label %e.1
+
+e.0:
+  tail call void @exit() nounwind
+  unreachable
+
+e.1:
+  ret void
+
+if.end:
+  store i64 0, i64* %ptr, align 8
+  ret void
+}


        


More information about the llvm-commits mailing list