xref: /llvm-project/llvm/test/Transforms/UnifyFunctionExitNodes/unreachable-blocks-status.ll (revision e390c229a438ed1eb3396df8fbeeda89c49474e6)
1; RUN: opt -passes='break-crit-edges,lower-switch,mergereturn' -S < %s | FileCheck %s
2
3; The pass did previously not report the correct Modified status in the case
4; where a function had at most one return block, and an unified unreachable
5; block was created. This was caught by the pass return status check that is
6; hidden under EXPENSIVE_CHECKS.
7
8; CHECK: for.foo.body2:
9; CHECK-NEXT: br label %UnifiedUnreachableBlock
10
11; CHECK: for.foo.end:
12; CHECK-NEXT: br label %UnifiedUnreachableBlock
13
14; CHECK: UnifiedUnreachableBlock:
15; CHECK-NEXT: unreachable
16
17define i32 @foo() {
18entry:
19  br label %for.foo.cond
20
21for.foo.cond:                                         ; preds = %entry
22  br i1 false, label %for.foo.body, label %for.foo.end3
23
24for.foo.body:                                         ; preds = %for.foo.cond
25  br label %for.foo.cond1
26
27for.foo.cond1:                                        ; preds = %for.foo.body
28  br i1 false, label %for.foo.body2, label %for.foo.end
29
30for.foo.body2:                                        ; preds = %for.foo.cond1
31  unreachable
32
33for.foo.end:                                          ; preds = %for.foo.cond1
34  unreachable
35
36for.foo.end3:                                         ; preds = %for.foo.cond
37  ret i32 undef
38}
39
40; CHECK: for.bar.body2:
41; CHECK-NEXT: br label %UnifiedUnreachableBlock
42
43; CHECK: for.bar.end:
44; CHECK-NEXT: br label %UnifiedUnreachableBlock
45
46; CHECK: UnifiedUnreachableBlock:
47; CHECK-NEXT: unreachable
48
49define void @bar() {
50entry:
51  br label %for.bar.cond
52
53for.bar.cond:                                         ; preds = %entry
54  br i1 false, label %for.bar.body, label %for.bar.end
55
56for.bar.body:                                         ; preds = %for.bar.cond
57  br label %for.bar.cond1
58
59for.bar.cond1:                                        ; preds = %for.bar.body
60  br i1 false, label %for.bar.body2, label %for.bar.end
61
62for.bar.body2:                                        ; preds = %for.bar.cond1
63  unreachable
64
65for.bar.end:                                          ; preds = %for.bar.cond1
66  unreachable
67}
68