Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / branch-on-undef.ll
blobbc42ae60730a7a59f9f91bf9ea9dfc3aef0008a2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree < %s | FileCheck %s
4 declare void @foo(i32)
6 define void @br_undef_simple() {
7 ; CHECK-LABEL: @br_undef_simple(
8 ; CHECK-NEXT:    call void @foo(i32 0)
9 ; CHECK-NEXT:    br i1 undef, label [[IF:%.*]], label [[ELSE:%.*]]
10 ; CHECK:       common.ret:
11 ; CHECK-NEXT:    ret void
12 ; CHECK:       if:
13 ; CHECK-NEXT:    call void @foo(i32 1)
14 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
15 ; CHECK:       else:
16 ; CHECK-NEXT:    call void @foo(i32 2)
17 ; CHECK-NEXT:    br label [[COMMON_RET]]
19   call void @foo(i32 0)
20   br i1 undef, label %if, label %else
22 if:
23   call void @foo(i32 1)
24   ret void
26 else:
27   call void @foo(i32 2)
28   ret void
31 define void @br_poison_simple() {
32 ; CHECK-LABEL: @br_poison_simple(
33 ; CHECK-NEXT:    call void @foo(i32 0)
34 ; CHECK-NEXT:    br i1 poison, label [[IF:%.*]], label [[ELSE:%.*]]
35 ; CHECK:       common.ret:
36 ; CHECK-NEXT:    ret void
37 ; CHECK:       if:
38 ; CHECK-NEXT:    call void @foo(i32 1)
39 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
40 ; CHECK:       else:
41 ; CHECK-NEXT:    call void @foo(i32 2)
42 ; CHECK-NEXT:    br label [[COMMON_RET]]
44   call void @foo(i32 0)
45   br i1 poison, label %if, label %else
47 if:
48   call void @foo(i32 1)
49   ret void
51 else:
52   call void @foo(i32 2)
53   ret void
56 define void @br_poison_succs_used(i32 %v) {
57 ; CHECK-LABEL: @br_poison_succs_used(
58 ; CHECK-NEXT:  entry:
59 ; CHECK-NEXT:    switch i32 [[V:%.*]], label [[BR:%.*]] [
60 ; CHECK-NEXT:      i32 1, label [[IF:%.*]]
61 ; CHECK-NEXT:      i32 2, label [[ELSE:%.*]]
62 ; CHECK-NEXT:    ]
63 ; CHECK:       br:
64 ; CHECK-NEXT:    call void @foo(i32 0)
65 ; CHECK-NEXT:    br i1 poison, label [[IF]], label [[ELSE]]
66 ; CHECK:       common.ret:
67 ; CHECK-NEXT:    ret void
68 ; CHECK:       if:
69 ; CHECK-NEXT:    [[PHI1:%.*]] = phi i32 [ 1, [[BR]] ], [ 2, [[ENTRY:%.*]] ]
70 ; CHECK-NEXT:    call void @foo(i32 [[PHI1]])
71 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
72 ; CHECK:       else:
73 ; CHECK-NEXT:    [[PHI2:%.*]] = phi i32 [ 3, [[BR]] ], [ 4, [[ENTRY]] ]
74 ; CHECK-NEXT:    call void @foo(i32 [[PHI2]])
75 ; CHECK-NEXT:    br label [[COMMON_RET]]
77 entry:
78   switch i32 %v, label %br [
79   i32 1, label %if
80   i32 2, label %else
81   ]
83 br:
84   call void @foo(i32 0)
85   br i1 poison, label %if, label %else
87 if:
88   %phi1 = phi i32 [ 1, %br ], [ 2, %entry ]
89   call void @foo(i32 %phi1)
90   ret void
92 else:
93   %phi2 = phi i32 [ 3, %br ], [ 4, %entry ]
94   call void @foo(i32 %phi2)
95   ret void