4
4
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n64-S128"
5
5
target triple = "riscv64-unknown-elf"
6
6
7
+ ; The table for @f
8
+ ; CHECK: @switch.table.f = private unnamed_addr constant [7 x i32] [i32 55, i32 123, i32 0, i32 -1, i32 27, i32 62, i32 1], align 4
9
+
10
+ ; The char table for char
11
+ ; CHECK: @switch.table.char = private unnamed_addr constant [9 x i8] c"7{\00\FF\1B>\01!T", align 1
12
+
13
+ ; The float table for @h
14
+ ; CHECK: @switch.table.h = private unnamed_addr constant [4 x float] [float 0x40091EB860000000, float 0x3FF3BE76C0000000, float 0x4012449BA0000000, float 0x4001AE1480000000], align 4
15
+
7
16
; The table for @foostring
8
17
; CHECK: @switch.table.foostring = private unnamed_addr constant [4 x i8*] [i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str3, i64 0, i64 0)], align 8
9
18
@@ -15,31 +24,15 @@ target triple = "riscv64-unknown-elf"
15
24
define i32 @f (i32 %c ) {
16
25
; CHECK-LABEL: @f(
17
26
; CHECK-NEXT: entry:
18
- ; CHECK-NEXT: switch i32 [[C:%.*]], label [[SW_DEFAULT:%.*]] [
19
- ; CHECK-NEXT: i32 42, label [[RETURN:%.*]]
20
- ; CHECK-NEXT: i32 43, label [[SW_BB1:%.*]]
21
- ; CHECK-NEXT: i32 44, label [[SW_BB2:%.*]]
22
- ; CHECK-NEXT: i32 45, label [[SW_BB3:%.*]]
23
- ; CHECK-NEXT: i32 46, label [[SW_BB4:%.*]]
24
- ; CHECK-NEXT: i32 47, label [[SW_BB5:%.*]]
25
- ; CHECK-NEXT: i32 48, label [[SW_BB6:%.*]]
26
- ; CHECK-NEXT: ]
27
- ; CHECK: sw.bb1:
28
- ; CHECK-NEXT: br label [[RETURN]]
29
- ; CHECK: sw.bb2:
30
- ; CHECK-NEXT: br label [[RETURN]]
31
- ; CHECK: sw.bb3:
32
- ; CHECK-NEXT: br label [[RETURN]]
33
- ; CHECK: sw.bb4:
34
- ; CHECK-NEXT: br label [[RETURN]]
35
- ; CHECK: sw.bb5:
36
- ; CHECK-NEXT: br label [[RETURN]]
37
- ; CHECK: sw.bb6:
38
- ; CHECK-NEXT: br label [[RETURN]]
39
- ; CHECK: sw.default:
27
+ ; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[C:%.*]], 42
28
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 7
29
+ ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
30
+ ; CHECK: switch.lookup:
31
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.f, i32 0, i32 [[SWITCH_TABLEIDX]]
32
+ ; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
40
33
; CHECK-NEXT: br label [[RETURN]]
41
34
; CHECK: return:
42
- ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 15, [[SW_DEFAULT]] ] , [ 1, [[SW_BB6 ]] ], [ 62, [[SW_BB5]] ], [ 27, [[SW_BB4]] ], [ -1, [[SW_BB3]] ], [ 0, [[SW_BB2]] ], [ 123, [[SW_BB1]] ], [ 55 , [[ENTRY:%.*]] ]
35
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[SWITCH_LOAD]] , [[SWITCH_LOOKUP ]] ], [ 15 , [[ENTRY:%.*]] ]
43
36
; CHECK-NEXT: ret i32 [[RETVAL_0]]
44
37
;
45
38
entry:
@@ -71,37 +64,15 @@ return:
71
64
define i8 @char (i32 %c ) {
72
65
; CHECK-LABEL: @char(
73
66
; CHECK-NEXT: entry:
74
- ; CHECK-NEXT: switch i32 [[C:%.*]], label [[SW_DEFAULT:%.*]] [
75
- ; CHECK-NEXT: i32 42, label [[RETURN:%.*]]
76
- ; CHECK-NEXT: i32 43, label [[SW_BB1:%.*]]
77
- ; CHECK-NEXT: i32 44, label [[SW_BB2:%.*]]
78
- ; CHECK-NEXT: i32 45, label [[SW_BB3:%.*]]
79
- ; CHECK-NEXT: i32 46, label [[SW_BB4:%.*]]
80
- ; CHECK-NEXT: i32 47, label [[SW_BB5:%.*]]
81
- ; CHECK-NEXT: i32 48, label [[SW_BB6:%.*]]
82
- ; CHECK-NEXT: i32 49, label [[SW_BB7:%.*]]
83
- ; CHECK-NEXT: i32 50, label [[SW_BB8:%.*]]
84
- ; CHECK-NEXT: ]
85
- ; CHECK: sw.bb1:
86
- ; CHECK-NEXT: br label [[RETURN]]
87
- ; CHECK: sw.bb2:
88
- ; CHECK-NEXT: br label [[RETURN]]
89
- ; CHECK: sw.bb3:
90
- ; CHECK-NEXT: br label [[RETURN]]
91
- ; CHECK: sw.bb4:
92
- ; CHECK-NEXT: br label [[RETURN]]
93
- ; CHECK: sw.bb5:
94
- ; CHECK-NEXT: br label [[RETURN]]
95
- ; CHECK: sw.bb6:
96
- ; CHECK-NEXT: br label [[RETURN]]
97
- ; CHECK: sw.bb7:
98
- ; CHECK-NEXT: br label [[RETURN]]
99
- ; CHECK: sw.bb8:
100
- ; CHECK-NEXT: br label [[RETURN]]
101
- ; CHECK: sw.default:
67
+ ; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[C:%.*]], 42
68
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 9
69
+ ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
70
+ ; CHECK: switch.lookup:
71
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [9 x i8], [9 x i8]* @switch.table.char, i32 0, i32 [[SWITCH_TABLEIDX]]
72
+ ; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i8, i8* [[SWITCH_GEP]], align 1
102
73
; CHECK-NEXT: br label [[RETURN]]
103
74
; CHECK: return:
104
- ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i8 [ 15, [[SW_DEFAULT]] ] , [ 84, [[SW_BB8 ]] ], [ 33, [[SW_BB7]] ], [ 1, [[SW_BB6]] ], [ 62, [[SW_BB5]] ], [ 27, [[SW_BB4]] ], [ -1, [[SW_BB3]] ], [ 0, [[SW_BB2]] ], [ 123, [[SW_BB1]] ], [ 55 , [[ENTRY:%.*]] ]
75
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i8 [ [[SWITCH_LOAD]] , [[SWITCH_LOOKUP ]] ], [ 15 , [[ENTRY:%.*]] ]
105
76
; CHECK-NEXT: ret i8 [[RETVAL_0]]
106
77
;
107
78
entry:
@@ -138,23 +109,18 @@ declare void @dummy(i8 signext, float)
138
109
define void @h (i32 %x ) {
139
110
; CHECK-LABEL: @h(
140
111
; CHECK-NEXT: entry:
141
- ; CHECK-NEXT: switch i32 [[X:%.*]], label [[SW_DEFAULT:%.*]] [
142
- ; CHECK-NEXT: i32 0, label [[SW_EPILOG:%.*]]
143
- ; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
144
- ; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
145
- ; CHECK-NEXT: i32 3, label [[SW_BB3:%.*]]
146
- ; CHECK-NEXT: ]
147
- ; CHECK: sw.bb1:
148
- ; CHECK-NEXT: br label [[SW_EPILOG]]
149
- ; CHECK: sw.bb2:
150
- ; CHECK-NEXT: br label [[SW_EPILOG]]
151
- ; CHECK: sw.bb3:
152
- ; CHECK-NEXT: br label [[SW_EPILOG]]
153
- ; CHECK: sw.default:
112
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X:%.*]], 4
113
+ ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[SW_EPILOG:%.*]]
114
+ ; CHECK: switch.lookup:
115
+ ; CHECK-NEXT: [[SWITCH_SHIFTAMT:%.*]] = mul i32 [[X]], 8
116
+ ; CHECK-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i32 89655594, [[SWITCH_SHIFTAMT]]
117
+ ; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = trunc i32 [[SWITCH_DOWNSHIFT]] to i8
118
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x float], [4 x float]* @switch.table.h, i32 0, i32 [[X]]
119
+ ; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load float, float* [[SWITCH_GEP]], align 4
154
120
; CHECK-NEXT: br label [[SW_EPILOG]]
155
121
; CHECK: sw.epilog:
156
- ; CHECK-NEXT: [[A_0:%.*]] = phi i8 [ 7, [[SW_DEFAULT]] ] , [ 5, [[SW_BB3 ]] ], [ 88, [[SW_BB2]] ], [ 9, [[SW_BB1]] ], [ 42 , [[ENTRY:%.*]] ]
157
- ; CHECK-NEXT: [[B_0:%.*]] = phi float [ 0x4023FAE140000000, [[SW_DEFAULT]] ] , [ 0x4001AE1480000000, [[SW_BB3 ]] ], [ 0x4012449BA0000000, [[SW_BB2]] ], [ 0x3FF3BE76C0000000, [[SW_BB1]] ], [ 0x40091EB860000000 , [[ENTRY]] ]
122
+ ; CHECK-NEXT: [[A_0:%.*]] = phi i8 [ [[SWITCH_MASKED]] , [[SWITCH_LOOKUP ]] ], [ 7 , [[ENTRY:%.*]] ]
123
+ ; CHECK-NEXT: [[B_0:%.*]] = phi float [ [[SWITCH_LOAD]] , [[SWITCH_LOOKUP ]] ], [ 0x4023FAE140000000 , [[ENTRY]] ]
158
124
; CHECK-NEXT: call void @dummy(i8 signext [[A_0]], float [[B_0]])
159
125
; CHECK-NEXT: ret void
160
126
;
0 commit comments