1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
3
4; Test that a switch going to a switch on the same value can be merged.
5; All three switches in this example can be merged into one big one.
6
7declare void @foo1()
8
9declare void @foo2()
10
11declare void @foo3()
12
13declare void @foo4()
14
15define void @test1(i32 %V) {
16; CHECK-LABEL: @test1(
17; CHECK-NEXT:    switch i32 [[V:%.*]], label [[INFLOOP:%.*]] [
18; CHECK-NEXT:    i32 4, label [[A:%.*]]
19; CHECK-NEXT:    i32 17, label [[B:%.*]]
20; CHECK-NEXT:    i32 18, label [[B]]
21; CHECK-NEXT:    i32 42, label [[D:%.*]]
22; CHECK-NEXT:    ]
23; CHECK:       A:
24; CHECK-NEXT:    call void @foo1()
25; CHECK-NEXT:    ret void
26; CHECK:       B:
27; CHECK-NEXT:    call void @foo2()
28; CHECK-NEXT:    ret void
29; CHECK:       D:
30; CHECK-NEXT:    call void @foo4()
31; CHECK-NEXT:    ret void
32; CHECK:       infloop:
33; CHECK-NEXT:    br label [[INFLOOP]]
34;
35  switch i32 %V, label %F [
36  i32 4, label %T
37  i32 17, label %T
38  i32 5, label %T
39  i32 1234, label %F
40  ]
41T:              ; preds = %0, %0, %0
42  switch i32 %V, label %F [
43  i32 4, label %A
44  i32 17, label %B
45  i32 42, label %C
46  ]
47A:              ; preds = %T
48  call void @foo1( )
49  ret void
50B:              ; preds = %F, %F, %T
51  call void @foo2( )
52  ret void
53C:              ; preds = %T
54  call void @foo3( )
55  ret void
56F:              ; preds = %F, %T, %0, %0
57  switch i32 %V, label %F [
58  i32 4, label %B
59  i32 18, label %B
60  i32 42, label %D
61  ]
62D:              ; preds = %F
63  call void @foo4( )
64  ret void
65
66}
67
68