xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/switch_switch_fold.ll (revision 07b9d231ff9baa6473b0dd588a3ce5330d3e4871)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=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:       common.ret:
24; CHECK-NEXT:    ret void
25; CHECK:       A:
26; CHECK-NEXT:    call void @foo1()
27; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
28; CHECK:       B:
29; CHECK-NEXT:    call void @foo2()
30; CHECK-NEXT:    br label [[COMMON_RET]]
31; CHECK:       D:
32; CHECK-NEXT:    call void @foo4()
33; CHECK-NEXT:    br label [[COMMON_RET]]
34; CHECK:       infloop:
35; CHECK-NEXT:    br label [[INFLOOP]]
36;
37  switch i32 %V, label %F [
38  i32 4, label %T
39  i32 17, label %T
40  i32 5, label %T
41  i32 1234, label %F
42  ]
43T:              ; preds = %0, %0, %0
44  switch i32 %V, label %F [
45  i32 4, label %A
46  i32 17, label %B
47  i32 42, label %C
48  ]
49A:              ; preds = %T
50  call void @foo1( )
51  ret void
52B:              ; preds = %F, %F, %T
53  call void @foo2( )
54  ret void
55C:              ; preds = %T
56  call void @foo3( )
57  ret void
58F:              ; preds = %F, %T, %0, %0
59  switch i32 %V, label %F [
60  i32 4, label %B
61  i32 18, label %B
62  i32 42, label %D
63  ]
64D:              ; preds = %F
65  call void @foo4( )
66  ret void
67
68}
69
70