@@ -59,6 +59,76 @@ return: ; preds = %entry, %sw.bb4, %sw
59
59
ret i32 %retval.0
60
60
}
61
61
62
+ ; We should not forward `%m` to 1, as this does not simplify the CFG.
63
+ define i32 @forward_one (i32 %m ) {
64
+ ; NO_FWD-LABEL: @forward_one(
65
+ ; NO_FWD-NEXT: entry:
66
+ ; NO_FWD-NEXT: switch i32 [[M:%.*]], label [[SW_BB4:%.*]] [
67
+ ; NO_FWD-NEXT: i32 0, label [[RETURN:%.*]]
68
+ ; NO_FWD-NEXT: i32 1, label [[SW_BB1:%.*]]
69
+ ; NO_FWD-NEXT: i32 2, label [[SW_BB2:%.*]]
70
+ ; NO_FWD-NEXT: i32 3, label [[SW_BB3:%.*]]
71
+ ; NO_FWD-NEXT: ]
72
+ ; NO_FWD: sw.bb1:
73
+ ; NO_FWD-NEXT: br label [[RETURN]]
74
+ ; NO_FWD: sw.bb2:
75
+ ; NO_FWD-NEXT: br label [[RETURN]]
76
+ ; NO_FWD: sw.bb3:
77
+ ; NO_FWD-NEXT: br label [[RETURN]]
78
+ ; NO_FWD: sw.bb4:
79
+ ; NO_FWD-NEXT: br label [[RETURN]]
80
+ ; NO_FWD: return:
81
+ ; NO_FWD-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 4, [[SW_BB4]] ], [ 5, [[SW_BB3]] ], [ 6, [[SW_BB2]] ], [ 1, [[SW_BB1]] ], [ 8, [[ENTRY:%.*]] ]
82
+ ; NO_FWD-NEXT: ret i32 [[RETVAL_0]]
83
+ ;
84
+ ; FWD-LABEL: @forward_one(
85
+ ; FWD-NEXT: entry:
86
+ ; FWD-NEXT: switch i32 [[M:%.*]], label [[SW_BB4:%.*]] [
87
+ ; FWD-NEXT: i32 0, label [[RETURN:%.*]]
88
+ ; FWD-NEXT: i32 1, label [[SW_BB1:%.*]]
89
+ ; FWD-NEXT: i32 2, label [[SW_BB2:%.*]]
90
+ ; FWD-NEXT: i32 3, label [[SW_BB3:%.*]]
91
+ ; FWD-NEXT: ]
92
+ ; FWD: sw.bb1:
93
+ ; FWD-NEXT: br label [[RETURN]]
94
+ ; FWD: sw.bb2:
95
+ ; FWD-NEXT: br label [[RETURN]]
96
+ ; FWD: sw.bb3:
97
+ ; FWD-NEXT: br label [[RETURN]]
98
+ ; FWD: sw.bb4:
99
+ ; FWD-NEXT: br label [[RETURN]]
100
+ ; FWD: return:
101
+ ; FWD-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 4, [[SW_BB4]] ], [ 5, [[SW_BB3]] ], [ 6, [[SW_BB2]] ], [ 1, [[SW_BB1]] ], [ 8, [[ENTRY:%.*]] ]
102
+ ; FWD-NEXT: ret i32 [[RETVAL_0]]
103
+ ;
104
+ entry:
105
+ switch i32 %m , label %sw.bb4 [
106
+ i32 0 , label %sw.bb0
107
+ i32 1 , label %sw.bb1
108
+ i32 2 , label %sw.bb2
109
+ i32 3 , label %sw.bb3
110
+ ]
111
+
112
+ sw.bb0: ; preds = %entry
113
+ br label %return
114
+
115
+ sw.bb1: ; preds = %entry
116
+ br label %return
117
+
118
+ sw.bb2: ; preds = %entry
119
+ br label %return
120
+
121
+ sw.bb3: ; preds = %entry
122
+ br label %return
123
+
124
+ sw.bb4: ; preds = %entry
125
+ br label %return
126
+
127
+ return: ; preds = %entry, %sw.bb4, %sw.bb3, %sw.bb2, %sw.bb1
128
+ %retval.0 = phi i32 [ 4 , %sw.bb4 ], [ 5 , %sw.bb3 ], [ 6 , %sw.bb2 ], [ 1 , %sw.bb1 ], [ 8 , %sw.bb0 ]
129
+ ret i32 %retval.0
130
+ }
131
+
62
132
; If 1 incoming phi value is a case constant of a switch, convert it to the switch condition:
63
133
; https://bugs.llvm.org/show_bug.cgi?id=34471
64
134
; This then subsequently should allow squashing of the other trivial case blocks.
@@ -115,3 +185,60 @@ return:
115
185
ret i32 %r
116
186
}
117
187
188
+ ; We can replace `[ 1, %bb2 ]` with `[ %arg1, %bb2 ]`.
189
+ define { i64 , i64 } @PR95919 (i64 noundef %arg , i64 noundef %arg1 ) {
190
+ ; NO_FWD-LABEL: @PR95919(
191
+ ; NO_FWD-NEXT: bb:
192
+ ; NO_FWD-NEXT: switch i64 [[ARG1:%.*]], label [[BB3:%.*]] [
193
+ ; NO_FWD-NEXT: i64 0, label [[BB5:%.*]]
194
+ ; NO_FWD-NEXT: i64 1, label [[BB2:%.*]]
195
+ ; NO_FWD-NEXT: ]
196
+ ; NO_FWD: bb2:
197
+ ; NO_FWD-NEXT: br label [[BB5]]
198
+ ; NO_FWD: bb3:
199
+ ; NO_FWD-NEXT: [[I:%.*]] = udiv i64 [[ARG:%.*]], [[ARG1]]
200
+ ; NO_FWD-NEXT: [[I4:%.*]] = shl nuw i64 [[I]], 1
201
+ ; NO_FWD-NEXT: br label [[BB5]]
202
+ ; NO_FWD: bb5:
203
+ ; NO_FWD-NEXT: [[I6:%.*]] = phi i64 [ [[I4]], [[BB3]] ], [ [[ARG]], [[BB2]] ], [ undef, [[BB:%.*]] ]
204
+ ; NO_FWD-NEXT: [[I7:%.*]] = phi i64 [ 1, [[BB3]] ], [ 1, [[BB2]] ], [ [[ARG1]], [[BB]] ]
205
+ ; NO_FWD-NEXT: [[I8:%.*]] = insertvalue { i64, i64 } poison, i64 [[I7]], 0
206
+ ; NO_FWD-NEXT: [[I9:%.*]] = insertvalue { i64, i64 } [[I8]], i64 [[I6]], 1
207
+ ; NO_FWD-NEXT: ret { i64, i64 } [[I9]]
208
+ ;
209
+ ; FWD-LABEL: @PR95919(
210
+ ; FWD-NEXT: bb:
211
+ ; FWD-NEXT: [[SWITCH:%.*]] = icmp ult i64 [[ARG1:%.*]], 2
212
+ ; FWD-NEXT: br i1 [[SWITCH]], label [[BB5:%.*]], label [[BB3:%.*]]
213
+ ; FWD: bb3:
214
+ ; FWD-NEXT: [[I:%.*]] = udiv i64 [[ARG:%.*]], [[ARG1]]
215
+ ; FWD-NEXT: [[I4:%.*]] = shl nuw i64 [[I]], 1
216
+ ; FWD-NEXT: br label [[BB5]]
217
+ ; FWD: bb5:
218
+ ; FWD-NEXT: [[I6:%.*]] = phi i64 [ [[I4]], [[BB3]] ], [ [[ARG]], [[BB:%.*]] ]
219
+ ; FWD-NEXT: [[I7:%.*]] = phi i64 [ 1, [[BB3]] ], [ [[ARG1]], [[BB]] ]
220
+ ; FWD-NEXT: [[I8:%.*]] = insertvalue { i64, i64 } poison, i64 [[I7]], 0
221
+ ; FWD-NEXT: [[I9:%.*]] = insertvalue { i64, i64 } [[I8]], i64 [[I6]], 1
222
+ ; FWD-NEXT: ret { i64, i64 } [[I9]]
223
+ ;
224
+ bb:
225
+ switch i64 %arg1 , label %bb3 [
226
+ i64 0 , label %bb5
227
+ i64 1 , label %bb2
228
+ ]
229
+
230
+ bb2: ; preds = %bb
231
+ br label %bb5
232
+
233
+ bb3: ; preds = %bb
234
+ %i = udiv i64 %arg , %arg1
235
+ %i4 = shl nuw i64 %i , 1
236
+ br label %bb5
237
+
238
+ bb5: ; preds = %bb3, %bb2, %bb
239
+ %i6 = phi i64 [ %i4 , %bb3 ], [ %arg , %bb2 ], [ undef , %bb ]
240
+ %i7 = phi i64 [ 1 , %bb3 ], [ 1 , %bb2 ], [ %arg1 , %bb ]
241
+ %i8 = insertvalue { i64 , i64 } poison, i64 %i7 , 0
242
+ %i9 = insertvalue { i64 , i64 } %i8 , i64 %i6 , 1
243
+ ret { i64 , i64 } %i9
244
+ }
0 commit comments