xref: /aosp_15_r20/external/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test basic folding to a conditional branch.
4*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i64 %x, i64 %y) nounwind {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo(
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker    %eq = icmp eq i64 %x, %y
8*9880d681SAndroid Build Coastguard Worker    br i1 %eq, label %b, label %switch
9*9880d681SAndroid Build Coastguard Workerswitch:
10*9880d681SAndroid Build Coastguard Worker    %lt = icmp slt i64 %x, %y
11*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %lt, label %a, label %b
12*9880d681SAndroid Build Coastguard Worker    %qux = select i1 %lt, i32 0, i32 2
13*9880d681SAndroid Build Coastguard Worker    switch i32 %qux, label %bees [
14*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
15*9880d681SAndroid Build Coastguard Worker        i32 1, label %b
16*9880d681SAndroid Build Coastguard Worker        i32 2, label %b
17*9880d681SAndroid Build Coastguard Worker    ]
18*9880d681SAndroid Build Coastguard Workera:
19*9880d681SAndroid Build Coastguard Worker    tail call void @bees.a() nounwind
20*9880d681SAndroid Build Coastguard Worker    ret i32 1
21*9880d681SAndroid Build Coastguard Worker; CHECK: b:
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %retval = phi i32 [ 0, %switch ], [ 2, %entry ]
23*9880d681SAndroid Build Coastguard Workerb:
24*9880d681SAndroid Build Coastguard Worker    %retval = phi i32 [0, %switch], [0, %switch], [2, %entry]
25*9880d681SAndroid Build Coastguard Worker    tail call void @bees.b() nounwind
26*9880d681SAndroid Build Coastguard Worker    ret i32 %retval
27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bees:
28*9880d681SAndroid Build Coastguard Workerbees:
29*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.trap() nounwind
30*9880d681SAndroid Build Coastguard Worker    unreachable
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; Test basic folding to an unconditional branch.
34*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(i64 %x, i64 %y) nounwind {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar(
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tail call void @bees.a() [[NUW:#[0-9]+]]
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
40*9880d681SAndroid Build Coastguard Worker    %lt = icmp slt i64 %x, %y
41*9880d681SAndroid Build Coastguard Worker    %qux = select i1 %lt, i32 0, i32 2
42*9880d681SAndroid Build Coastguard Worker    switch i32 %qux, label %bees [
43*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
44*9880d681SAndroid Build Coastguard Worker        i32 1, label %b
45*9880d681SAndroid Build Coastguard Worker        i32 2, label %a
46*9880d681SAndroid Build Coastguard Worker    ]
47*9880d681SAndroid Build Coastguard Workera:
48*9880d681SAndroid Build Coastguard Worker    %retval = phi i32 [0, %entry], [0, %entry], [1, %b]
49*9880d681SAndroid Build Coastguard Worker    tail call void @bees.a() nounwind
50*9880d681SAndroid Build Coastguard Worker    ret i32 0
51*9880d681SAndroid Build Coastguard Workerb:
52*9880d681SAndroid Build Coastguard Worker    tail call void @bees.b() nounwind
53*9880d681SAndroid Build Coastguard Worker    br label %a
54*9880d681SAndroid Build Coastguard Workerbees:
55*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.trap() nounwind
56*9880d681SAndroid Build Coastguard Worker    unreachable
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; Test the edge case where both values from the select are the default case.
60*9880d681SAndroid Build Coastguard Workerdefine void @bazz(i64 %x, i64 %y) nounwind {
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bazz(
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tail call void @bees.b() [[NUW]]
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
66*9880d681SAndroid Build Coastguard Worker    %lt = icmp slt i64 %x, %y
67*9880d681SAndroid Build Coastguard Worker    %qux = select i1 %lt, i32 10, i32 12
68*9880d681SAndroid Build Coastguard Worker    switch i32 %qux, label %b [
69*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
70*9880d681SAndroid Build Coastguard Worker        i32 1, label %bees
71*9880d681SAndroid Build Coastguard Worker        i32 2, label %bees
72*9880d681SAndroid Build Coastguard Worker    ]
73*9880d681SAndroid Build Coastguard Workera:
74*9880d681SAndroid Build Coastguard Worker    tail call void @bees.a() nounwind
75*9880d681SAndroid Build Coastguard Worker    ret void
76*9880d681SAndroid Build Coastguard Workerb:
77*9880d681SAndroid Build Coastguard Worker    tail call void @bees.b() nounwind
78*9880d681SAndroid Build Coastguard Worker    ret void
79*9880d681SAndroid Build Coastguard Workerbees:
80*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.trap()
81*9880d681SAndroid Build Coastguard Worker    unreachable
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; Test the edge case where both values from the select are equal.
85*9880d681SAndroid Build Coastguard Workerdefine void @quux(i64 %x, i64 %y) nounwind {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @quux(
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tail call void @bees.a() [[NUW]]
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
91*9880d681SAndroid Build Coastguard Worker    %lt = icmp slt i64 %x, %y
92*9880d681SAndroid Build Coastguard Worker    %qux = select i1 %lt, i32 0, i32 0
93*9880d681SAndroid Build Coastguard Worker    switch i32 %qux, label %b [
94*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
95*9880d681SAndroid Build Coastguard Worker        i32 1, label %bees
96*9880d681SAndroid Build Coastguard Worker        i32 2, label %bees
97*9880d681SAndroid Build Coastguard Worker    ]
98*9880d681SAndroid Build Coastguard Workera:
99*9880d681SAndroid Build Coastguard Worker    tail call void @bees.a() nounwind
100*9880d681SAndroid Build Coastguard Worker    ret void
101*9880d681SAndroid Build Coastguard Workerb:
102*9880d681SAndroid Build Coastguard Worker    tail call void @bees.b() nounwind
103*9880d681SAndroid Build Coastguard Worker    ret void
104*9880d681SAndroid Build Coastguard Workerbees:
105*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.trap()
106*9880d681SAndroid Build Coastguard Worker    unreachable
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; A final test, for phi node munging.
110*9880d681SAndroid Build Coastguard Workerdefine i32 @xyzzy(i64 %x, i64 %y) {
111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xyzzy(
112*9880d681SAndroid Build Coastguard Workerentry:
113*9880d681SAndroid Build Coastguard Worker    %eq = icmp eq i64 %x, %y
114*9880d681SAndroid Build Coastguard Worker    br i1 %eq, label %r, label %cont
115*9880d681SAndroid Build Coastguard Workercont:
116*9880d681SAndroid Build Coastguard Worker; CHECK: %lt = icmp slt i64 %x, %y
117*9880d681SAndroid Build Coastguard Worker    %lt = icmp slt i64 %x, %y
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %lt, i32 -1, i32 1
119*9880d681SAndroid Build Coastguard Worker    %qux = select i1 %lt, i32 0, i32 2
120*9880d681SAndroid Build Coastguard Worker    switch i32 %qux, label %bees [
121*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
122*9880d681SAndroid Build Coastguard Worker        i32 1, label %r
123*9880d681SAndroid Build Coastguard Worker        i32 2, label %r
124*9880d681SAndroid Build Coastguard Worker    ]
125*9880d681SAndroid Build Coastguard Workerr:
126*9880d681SAndroid Build Coastguard Worker    %val = phi i32 [0, %entry], [1, %cont], [1, %cont]
127*9880d681SAndroid Build Coastguard Worker    ret i32 %val
128*9880d681SAndroid Build Coastguard Workera:
129*9880d681SAndroid Build Coastguard Worker    ret i32 -1
130*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bees:
131*9880d681SAndroid Build Coastguard Workerbees:
132*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.trap()
133*9880d681SAndroid Build Coastguard Worker    unreachable
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.trap() nounwind noreturn
137*9880d681SAndroid Build Coastguard Workerdeclare void @bees.a() nounwind
138*9880d681SAndroid Build Coastguard Workerdeclare void @bees.b() nounwind
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; CHECK: attributes [[NUW]] = { nounwind }
141*9880d681SAndroid Build Coastguard Worker; CHECK: attributes #1 = { noreturn nounwind }
142