Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / switch_switch_fold.ll
blobbef08af50b4c9ec9698adbde12a7a1d919ac6bb3
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
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.
7 declare void @foo1()
9 declare void @foo2()
11 declare void @foo3()
13 declare void @foo4()
15 define 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]]
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   ]
43 T:              ; 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   ]
49 A:              ; preds = %T
50   call void @foo1( )
51   ret void
52 B:              ; preds = %F, %F, %T
53   call void @foo2( )
54   ret void
55 C:              ; preds = %T
56   call void @foo3( )
57   ret void
58 F:              ; 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   ]
64 D:              ; preds = %F
65   call void @foo4( )
66   ret void