xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/sink-and-convert-switch.ll (revision 419c53477eae62c716ca8f4e18109342f0398d95)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -S -passes='simplifycfg<sink-common-insts;switch-to-lookup>' < %s | FileCheck %s
3
4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
5
6define void @pr104567(i8 %x, ptr %f) {
7; CHECK-LABEL: define void @pr104567(
8; CHECK-SAME: i8 [[X:%.*]], ptr [[F:%.*]]) {
9; CHECK-NEXT:  [[START:.*:]]
10; CHECK-NEXT:    [[Y:%.*]] = alloca [1 x i8], align 1
11; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr nonnull [[Y]])
12; CHECK-NEXT:    [[SWITCH_OFFSET:%.*]] = add nsw i8 [[X]], 4
13; CHECK-NEXT:    store i8 [[SWITCH_OFFSET]], ptr [[Y]], align 1
14; CHECK-NEXT:    call void [[F]](ptr [[Y]])
15; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 1, ptr nonnull [[Y]])
16; CHECK-NEXT:    ret void
17;
18start:
19  %y = alloca [1 x i8], align 1
20  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %y)
21  switch i8 %x, label %default.unreachable [
22  i8 0, label %bb4
23  i8 1, label %bb3
24  i8 2, label %bb2
25  ]
26
27default.unreachable:
28  unreachable
29
30bb4:
31  store i8 4, ptr %y, align 1
32  br label %bb5
33
34bb3:
35  store i8 5, ptr %y, align 1
36  br label %bb5
37
38bb2:
39  store i8 6, ptr %y, align 1
40  br label %bb5
41
42bb5:
43  call void %f(ptr %y)
44  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %y)
45  ret void
46}
47
48define i64 @dont_make_div_variable(i64 noundef %x, i64 noundef %i) {
49; CHECK-LABEL: define i64 @dont_make_div_variable(
50; CHECK-SAME: i64 noundef [[X:%.*]], i64 noundef [[I:%.*]]) {
51; CHECK-NEXT:  [[ENTRY:.*:]]
52; CHECK-NEXT:    switch i64 [[I]], label %[[SW_DEFAULT:.*]] [
53; CHECK-NEXT:      i64 9, label %[[SW_BB:.*]]
54; CHECK-NEXT:      i64 10, label %[[SW_BB1:.*]]
55; CHECK-NEXT:      i64 11, label %[[SW_BB3:.*]]
56; CHECK-NEXT:      i64 12, label %[[SW_BB5:.*]]
57; CHECK-NEXT:    ]
58; CHECK:       [[SW_BB]]:
59; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], 9
60; CHECK-NEXT:    br label %[[RETURN:.*]]
61; CHECK:       [[SW_BB1]]:
62; CHECK-NEXT:    [[DIV2:%.*]] = udiv i64 [[X]], 10
63; CHECK-NEXT:    br label %[[RETURN]]
64; CHECK:       [[SW_BB3]]:
65; CHECK-NEXT:    [[DIV4:%.*]] = udiv i64 [[X]], 11
66; CHECK-NEXT:    br label %[[RETURN]]
67; CHECK:       [[SW_BB5]]:
68; CHECK-NEXT:    [[DIV7:%.*]] = udiv i64 [[X]], 12
69; CHECK-NEXT:    br label %[[RETURN]]
70; CHECK:       [[SW_DEFAULT]]:
71; CHECK-NEXT:    unreachable
72; CHECK:       [[RETURN]]:
73; CHECK-NEXT:    [[DIV6:%.*]] = phi i64 [ [[DIV7]], %[[SW_BB5]] ], [ [[DIV4]], %[[SW_BB3]] ], [ [[DIV2]], %[[SW_BB1]] ], [ [[DIV]], %[[SW_BB]] ]
74; CHECK-NEXT:    ret i64 [[DIV6]]
75;
76entry:
77  switch i64 %i, label %sw.default [
78  i64 9, label %sw.bb
79  i64 10, label %sw.bb1
80  i64 11, label %sw.bb3
81  i64 12, label %sw.bb5
82  ]
83
84sw.bb:
85  %div = udiv i64 %x, 9
86  br label %return
87
88sw.bb1:
89  %div2 = udiv i64 %x, 10
90  br label %return
91
92sw.bb3:
93  %div4 = udiv i64 %x, 11
94  br label %return
95
96sw.bb5:
97  %div6 = udiv i64 %x, 12
98  br label %return
99
100sw.default:
101  unreachable
102
103return:
104  %retval.0 = phi i64 [ %div6, %sw.bb5 ], [ %div4, %sw.bb3 ], [ %div2, %sw.bb1 ], [ %div, %sw.bb ]
105  ret i64 %retval.0
106}
107
108define i64 @okay_to_make_div_variable(i64 noundef %x, i64 noundef %i) {
109; CHECK-LABEL: define i64 @okay_to_make_div_variable(
110; CHECK-SAME: i64 noundef [[X:%.*]], i64 noundef [[I:%.*]]) {
111; CHECK-NEXT:  [[ENTRY:.*:]]
112; CHECK-NEXT:    [[SWITCH_TABLEIDX:%.*]] = sub nsw i64 [[I]], 9
113; CHECK-NEXT:    [[SWITCH_OFFSET:%.*]] = add nsw i64 [[SWITCH_TABLEIDX]], 9
114; CHECK-NEXT:    [[DIV6:%.*]] = udiv i64 [[SWITCH_OFFSET]], [[X]]
115; CHECK-NEXT:    ret i64 [[DIV6]]
116;
117entry:
118  switch i64 %i, label %sw.default [
119  i64 9, label %sw.bb
120  i64 10, label %sw.bb1
121  i64 11, label %sw.bb3
122  i64 12, label %sw.bb5
123  ]
124
125sw.bb:
126  %div = udiv i64 9, %x
127  br label %return
128
129sw.bb1:
130  %div2 = udiv i64 10, %x
131  br label %return
132
133sw.bb3:
134  %div4 = udiv i64 11, %x
135  br label %return
136
137sw.bb5:
138  %div6 = udiv i64 12, %x
139  br label %return
140
141sw.default:
142  unreachable
143
144return:
145  %retval.0 = phi i64 [ %div6, %sw.bb5 ], [ %div4, %sw.bb3 ], [ %div2, %sw.bb1 ], [ %div, %sw.bb ]
146  ret i64 %retval.0
147}
148