[SimplifyCFG] Add test for branch on undef/poison (NFC)
authorNikita Popov <npopov@redhat.com>
Tue, 3 Jan 2023 13:51:13 +0000 (14:51 +0100)
committerNikita Popov <npopov@redhat.com>
Tue, 3 Jan 2023 13:52:48 +0000 (14:52 +0100)
llvm/test/Transforms/SimplifyCFG/branch-on-undef.ll [new file with mode: 0644]

diff --git a/llvm/test/Transforms/SimplifyCFG/branch-on-undef.ll b/llvm/test/Transforms/SimplifyCFG/branch-on-undef.ll
new file mode 100644 (file)
index 0000000..29f4b8e
--- /dev/null
@@ -0,0 +1,96 @@
+; 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
+}