--- /dev/null
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree < %s | FileCheck %s
+
+declare void @foo(i32)
+
+define void @br_undef_simple() {
+; CHECK-LABEL: @br_undef_simple(
+; CHECK-NEXT: call void @foo(i32 0)
+; CHECK-NEXT: br i1 undef, label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK: common.ret:
+; CHECK-NEXT: ret void
+; CHECK: if:
+; CHECK-NEXT: call void @foo(i32 1)
+; CHECK-NEXT: br label [[COMMON_RET:%.*]]
+; CHECK: else:
+; CHECK-NEXT: call void @foo(i32 2)
+; CHECK-NEXT: br label [[COMMON_RET]]
+;
+ call void @foo(i32 0)
+ br i1 undef, label %if, label %else
+
+if:
+ call void @foo(i32 1)
+ ret void
+
+else:
+ call void @foo(i32 2)
+ ret void
+}
+
+define void @br_poison_simple() {
+; CHECK-LABEL: @br_poison_simple(
+; CHECK-NEXT: call void @foo(i32 0)
+; CHECK-NEXT: br i1 poison, label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK: common.ret:
+; CHECK-NEXT: ret void
+; CHECK: if:
+; CHECK-NEXT: call void @foo(i32 1)
+; CHECK-NEXT: br label [[COMMON_RET:%.*]]
+; CHECK: else:
+; CHECK-NEXT: call void @foo(i32 2)
+; CHECK-NEXT: br label [[COMMON_RET]]
+;
+ call void @foo(i32 0)
+ br i1 poison, label %if, label %else
+
+if:
+ call void @foo(i32 1)
+ ret void
+
+else:
+ call void @foo(i32 2)
+ ret void
+}
+
+define void @br_poison_succs_used(i32 %v) {
+; CHECK-LABEL: @br_poison_succs_used(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i32 [[V:%.*]], label [[BR:%.*]] [
+; CHECK-NEXT: i32 1, label [[IF:%.*]]
+; CHECK-NEXT: i32 2, label [[ELSE:%.*]]
+; CHECK-NEXT: ]
+; CHECK: br:
+; CHECK-NEXT: call void @foo(i32 0)
+; CHECK-NEXT: br i1 poison, label [[IF]], label [[ELSE]]
+; CHECK: common.ret:
+; CHECK-NEXT: ret void
+; CHECK: if:
+; CHECK-NEXT: [[PHI1:%.*]] = phi i32 [ 1, [[BR]] ], [ 2, [[ENTRY:%.*]] ]
+; CHECK-NEXT: call void @foo(i32 [[PHI1]])
+; CHECK-NEXT: br label [[COMMON_RET:%.*]]
+; CHECK: else:
+; CHECK-NEXT: [[PHI2:%.*]] = phi i32 [ 3, [[BR]] ], [ 4, [[ENTRY]] ]
+; CHECK-NEXT: call void @foo(i32 [[PHI2]])
+; CHECK-NEXT: br label [[COMMON_RET]]
+;
+entry:
+ switch i32 %v, label %br [
+ i32 1, label %if
+ i32 2, label %else
+ ]
+
+br:
+ call void @foo(i32 0)
+ br i1 poison, label %if, label %else
+
+if:
+ %phi1 = phi i32 [ 1, %br ], [ 2, %entry ]
+ call void @foo(i32 %phi1)
+ ret void
+
+else:
+ %phi2 = phi i32 [ 3, %br ], [ 4, %entry ]
+ call void @foo(i32 %phi2)
+ ret void
+}