xref: /aosp_15_r20/external/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Test normal folding
5*9880d681SAndroid Build Coastguard Workerdefine i32 @test1() {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  TheDest:
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 1234
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker  switch i32 5, label %Default [
11*9880d681SAndroid Build Coastguard Worker  i32 0, label %Foo
12*9880d681SAndroid Build Coastguard Worker  i32 1, label %Bar
13*9880d681SAndroid Build Coastguard Worker  i32 2, label %Baz
14*9880d681SAndroid Build Coastguard Worker  i32 5, label %TheDest
15*9880d681SAndroid Build Coastguard Worker  ]
16*9880d681SAndroid Build Coastguard WorkerDefault:
17*9880d681SAndroid Build Coastguard Worker  ret i32 -1
18*9880d681SAndroid Build Coastguard WorkerFoo:
19*9880d681SAndroid Build Coastguard Worker  ret i32 -2
20*9880d681SAndroid Build Coastguard WorkerBar:
21*9880d681SAndroid Build Coastguard Worker  ret i32 -3
22*9880d681SAndroid Build Coastguard WorkerBaz:
23*9880d681SAndroid Build Coastguard Worker  ret i32 -4
24*9880d681SAndroid Build Coastguard WorkerTheDest:
25*9880d681SAndroid Build Coastguard Worker  ret i32 1234
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; Test folding to default dest
29*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  Default:
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 1234
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker  switch i32 3, label %Default [
35*9880d681SAndroid Build Coastguard Worker  i32 0, label %Foo
36*9880d681SAndroid Build Coastguard Worker  i32 1, label %Bar
37*9880d681SAndroid Build Coastguard Worker  i32 2, label %Baz
38*9880d681SAndroid Build Coastguard Worker  i32 5, label %TheDest
39*9880d681SAndroid Build Coastguard Worker  ]
40*9880d681SAndroid Build Coastguard WorkerDefault:
41*9880d681SAndroid Build Coastguard Worker  ret i32 1234
42*9880d681SAndroid Build Coastguard WorkerFoo:
43*9880d681SAndroid Build Coastguard Worker  ret i32 -2
44*9880d681SAndroid Build Coastguard WorkerBar:
45*9880d681SAndroid Build Coastguard Worker  ret i32 -5
46*9880d681SAndroid Build Coastguard WorkerBaz:
47*9880d681SAndroid Build Coastguard Worker  ret i32 -6
48*9880d681SAndroid Build Coastguard WorkerTheDest:
49*9880d681SAndroid Build Coastguard Worker  ret i32 -8
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; Test folding all to same dest
53*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i1 %C) {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  TheDest:
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 1234
57*9880d681SAndroid Build Coastguard Worker;
58*9880d681SAndroid Build Coastguard Worker  br i1 %C, label %Start, label %TheDest
59*9880d681SAndroid Build Coastguard WorkerStart:          ; preds = %0
60*9880d681SAndroid Build Coastguard Worker  switch i32 3, label %TheDest [
61*9880d681SAndroid Build Coastguard Worker  i32 0, label %TheDest
62*9880d681SAndroid Build Coastguard Worker  i32 1, label %TheDest
63*9880d681SAndroid Build Coastguard Worker  i32 2, label %TheDest
64*9880d681SAndroid Build Coastguard Worker  i32 5, label %TheDest
65*9880d681SAndroid Build Coastguard Worker  ]
66*9880d681SAndroid Build Coastguard WorkerTheDest:
67*9880d681SAndroid Build Coastguard Worker  ret i32 1234
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; Test folding switch -> branch
71*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %C) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  L1:
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 %C, 0
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOT:%.*]] = select i1 [[COND]], i32 1, i32 0
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DOT]]
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker  switch i32 %C, label %L1 [
79*9880d681SAndroid Build Coastguard Worker  i32 0, label %L2
80*9880d681SAndroid Build Coastguard Worker  ]
81*9880d681SAndroid Build Coastguard WorkerL1:
82*9880d681SAndroid Build Coastguard Worker  ret i32 0
83*9880d681SAndroid Build Coastguard WorkerL2:
84*9880d681SAndroid Build Coastguard Worker  ret i32 1
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; Can fold into a cond branch!
88*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %C) {
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  L1:
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 %C, 0
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOT:%.*]] = select i1 [[COND]], i32 1, i32 0
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DOT]]
94*9880d681SAndroid Build Coastguard Worker;
95*9880d681SAndroid Build Coastguard Worker  switch i32 %C, label %L1 [
96*9880d681SAndroid Build Coastguard Worker  i32 0, label %L2
97*9880d681SAndroid Build Coastguard Worker  i32 123, label %L1
98*9880d681SAndroid Build Coastguard Worker  ]
99*9880d681SAndroid Build Coastguard WorkerL1:
100*9880d681SAndroid Build Coastguard Worker  ret i32 0
101*9880d681SAndroid Build Coastguard WorkerL2:
102*9880d681SAndroid Build Coastguard Worker  ret i32 1
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105