xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/X86/switch-to-lookup-gep.ll (revision 07b9d231ff9baa6473b0dd588a3ce5330d3e4871)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes
2; RUN: opt -passes=simplifycfg --switch-to-lookup -S < %s | FileCheck %s
3target triple = "x86_64-unknown-linux-gnu"
4
5@alloc0 = private unnamed_addr constant <{ [2 x i8] }> <{ [2 x i8] c"A1" }>, align 1
6@alloc1 = private unnamed_addr constant <{ [2 x i8] }> <{ [2 x i8] c"B2" }>, align 1
7@alloc2 = private unnamed_addr constant <{ [2 x i8] }> <{ [2 x i8] c"C3" }>, align 1
8
9define { ptr, i64 } @switch_to_lookup_gep(i8 %0) unnamed_addr {
10; CHECK-LABEL: @switch_to_lookup_gep(
11; CHECK-NEXT:  start:
12; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x ptr], ptr @switch.table.switch_to_lookup_gep, i32 0, i8 [[TMP0:%.*]]
13; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load ptr, ptr [[SWITCH_GEP]], align 8
14; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr, i64 } undef, ptr [[SWITCH_LOAD]], 0
15; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue { ptr, i64 } [[TMP1]], i64 1, 1
16; CHECK-NEXT:    ret { ptr, i64 } [[TMP2]]
17;
18start:
19  switch i8 %0, label %default [
20  i8 0, label %bb0
21  i8 1, label %bb1
22  i8 2, label %bb2
23  ]
24
25bb0:
26  br label %end
27
28bb1:
29  br label %end
30
31bb2:
32  br label %end
33
34default:
35  unreachable
36
37end:
38  %.sroa.0.0 = phi ptr [ getelementptr inbounds (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i32 1), %bb0 ], [ getelementptr inbounds (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i32 1), %bb1 ], [ getelementptr inbounds (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i32 1), %bb2 ]
39  %1 = insertvalue { ptr, i64 } undef, ptr %.sroa.0.0, 0
40  %2 = insertvalue { ptr, i64 } %1, i64 1, 1
41  ret { ptr, i64 } %2
42}
43
44define { ptr, i64 } @switch_to_lookup_gep_oob(i8 %0) unnamed_addr {
45; CHECK-LABEL: @switch_to_lookup_gep_oob(
46; CHECK-NEXT:  start:
47; CHECK-NEXT:    switch i8 [[TMP0:%.*]], label [[DEFAULT:%.*]] [
48; CHECK-NEXT:      i8 0, label [[END:%.*]]
49; CHECK-NEXT:      i8 1, label [[BB1:%.*]]
50; CHECK-NEXT:      i8 2, label [[BB2:%.*]]
51; CHECK-NEXT:    ]
52; CHECK:       bb1:
53; CHECK-NEXT:    br label [[END]]
54; CHECK:       bb2:
55; CHECK-NEXT:    br label [[END]]
56; CHECK:       default:
57; CHECK-NEXT:    unreachable
58; CHECK:       end:
59; CHECK-NEXT:    [[DOTSROA_0_0:%.*]] = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i32 4), [[BB1]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i32 4), [[BB2]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i32 4), [[START:%.*]] ]
60; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr, i64 } undef, ptr [[DOTSROA_0_0]], 0
61; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue { ptr, i64 } [[TMP1]], i64 1, 1
62; CHECK-NEXT:    ret { ptr, i64 } [[TMP2]]
63;
64start:
65  switch i8 %0, label %default [
66  i8 0, label %bb0
67  i8 1, label %bb1
68  i8 2, label %bb2
69  ]
70
71bb0:
72  br label %end
73
74bb1:
75  br label %end
76
77bb2:
78  br label %end
79
80default:
81  unreachable
82
83end:
84  %.sroa.0.0 = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i32 4), %bb0 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i32 4), %bb1 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i32 4), %bb2 ]
85  %1 = insertvalue { ptr, i64 } undef, ptr %.sroa.0.0, 0
86  %2 = insertvalue { ptr, i64 } %1, i64 1, 1
87  ret { ptr, i64 } %2
88}
89
90define { ptr, i64 } @switch_to_lookup_gep_ptrtoint(i8 %0) unnamed_addr {
91; CHECK-LABEL: @switch_to_lookup_gep_ptrtoint(
92; CHECK-NEXT:  start:
93; CHECK-NEXT:    switch i8 [[TMP0:%.*]], label [[DEFAULT:%.*]] [
94; CHECK-NEXT:      i8 0, label [[END:%.*]]
95; CHECK-NEXT:      i8 1, label [[BB1:%.*]]
96; CHECK-NEXT:      i8 2, label [[BB2:%.*]]
97; CHECK-NEXT:    ]
98; CHECK:       bb1:
99; CHECK-NEXT:    br label [[END]]
100; CHECK:       bb2:
101; CHECK-NEXT:    br label [[END]]
102; CHECK:       default:
103; CHECK-NEXT:    unreachable
104; CHECK:       end:
105; CHECK-NEXT:    [[DOTSROA_0_0:%.*]] = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), [[BB1]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), [[BB2]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), [[START:%.*]] ]
106; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr, i64 } undef, ptr [[DOTSROA_0_0]], 0
107; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue { ptr, i64 } [[TMP1]], i64 1, 1
108; CHECK-NEXT:    ret { ptr, i64 } [[TMP2]]
109;
110start:
111  switch i8 %0, label %default [
112  i8 0, label %bb0
113  i8 1, label %bb1
114  i8 2, label %bb2
115  ]
116
117bb0:
118  br label %end
119
120bb1:
121  br label %end
122
123bb2:
124  br label %end
125
126default:
127  unreachable
128
129end:
130  %.sroa.0.0 = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), %bb0 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), %bb1 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), %bb2 ]
131  %1 = insertvalue { ptr, i64 } undef, ptr %.sroa.0.0, 0
132  %2 = insertvalue { ptr, i64 } %1, i64 1, 1
133  ret { ptr, i64 } %2
134}
135