@@ -256,3 +256,108 @@ define { i32, i32 } @test_multi_use_add(i32 %base, i32 %offset) {
256
256
257
257
ret { i32 , i32 } %ret
258
258
}
259
+
260
+ define i32 @test_new (i32 %x , i32 %y ) {
261
+ ; CHECK-ARM-LABEL: test_new:
262
+ ; CHECK-ARM: @ %bb.0: @ %entry
263
+ ; CHECK-ARM-NEXT: movw r2, #48047
264
+ ; CHECK-ARM-NEXT: mul r1, r1, r2
265
+ ; CHECK-ARM-NEXT: add r0, r0, r1, lsl #1
266
+ ; CHECK-ARM-NEXT: bx lr
267
+ ;
268
+ ; CHECK-THUMB-LABEL: test_new:
269
+ ; CHECK-THUMB: @ %bb.0: @ %entry
270
+ ; CHECK-THUMB-NEXT: movw r2, #48047
271
+ ; CHECK-THUMB-NEXT: muls r1, r2, r1
272
+ ; CHECK-THUMB-NEXT: add.w r0, r0, r1, lsl #1
273
+ ; CHECK-THUMB-NEXT: bx lr
274
+ entry:
275
+ %mul = mul i32 %y , 96094
276
+ %conv = add i32 %mul , %x
277
+ ret i32 %conv
278
+ }
279
+
280
+ ; This test was hitting issues with deleted nodes because ComplexPatternFuncMutatesDAG
281
+ ; was not defined.
282
+ @arr_9 = external dso_local local_unnamed_addr global [15 x [25 x [18 x i8 ]]], align 1
283
+ define void @test_mutateddag (i32 %b , i32 %c , i32 %d , i1 %cc ) {
284
+ ; CHECK-THUMB-LABEL: test_mutateddag:
285
+ ; CHECK-THUMB: @ %bb.0: @ %entry
286
+ ; CHECK-THUMB-NEXT: .save {r4, lr}
287
+ ; CHECK-THUMB-NEXT: push {r4, lr}
288
+ ; CHECK-THUMB-NEXT: movw r12, #50608
289
+ ; CHECK-THUMB-NEXT: movw r4, #51512
290
+ ; CHECK-THUMB-NEXT: movt r12, #17917
291
+ ; CHECK-THUMB-NEXT: movt r4, #52
292
+ ; CHECK-THUMB-NEXT: mla r12, r1, r4, r12
293
+ ; CHECK-THUMB-NEXT: mov.w r4, #450
294
+ ; CHECK-THUMB-NEXT: lsls r3, r3, #31
295
+ ; CHECK-THUMB-NEXT: mul lr, r0, r4
296
+ ; CHECK-THUMB-NEXT: movw r0, #48047
297
+ ; CHECK-THUMB-NEXT: muls r0, r1, r0
298
+ ; CHECK-THUMB-NEXT: movw r1, :lower16:arr_9
299
+ ; CHECK-THUMB-NEXT: movt r1, :upper16:arr_9
300
+ ; CHECK-THUMB-NEXT: add.w r0, r2, r0, lsl #1
301
+ ; CHECK-THUMB-NEXT: movw r2, #24420
302
+ ; CHECK-THUMB-NEXT: movt r2, #19356
303
+ ; CHECK-THUMB-NEXT: add.w r0, r0, r0, lsl #3
304
+ ; CHECK-THUMB-NEXT: add.w r0, r1, r0, lsl #1
305
+ ; CHECK-THUMB-NEXT: movw r1, #60920
306
+ ; CHECK-THUMB-NEXT: movt r1, #64028
307
+ ; CHECK-THUMB-NEXT: add r2, r0
308
+ ; CHECK-THUMB-NEXT: add r1, r0
309
+ ; CHECK-THUMB-NEXT: movs r0, #0
310
+ ; CHECK-THUMB-NEXT: b .LBB19_2
311
+ ; CHECK-THUMB-NEXT: .LBB19_1: @ %for.cond1.for.cond.cleanup_crit_edge
312
+ ; CHECK-THUMB-NEXT: @ in Loop: Header=BB19_2 Depth=1
313
+ ; CHECK-THUMB-NEXT: add r1, lr
314
+ ; CHECK-THUMB-NEXT: add r2, lr
315
+ ; CHECK-THUMB-NEXT: .LBB19_2: @ %for.cond
316
+ ; CHECK-THUMB-NEXT: @ =>This Loop Header: Depth=1
317
+ ; CHECK-THUMB-NEXT: @ Child Loop BB19_3 Depth 2
318
+ ; CHECK-THUMB-NEXT: movs r4, #0
319
+ ; CHECK-THUMB-NEXT: .LBB19_3: @ %for.cond2.preheader
320
+ ; CHECK-THUMB-NEXT: @ Parent Loop BB19_2 Depth=1
321
+ ; CHECK-THUMB-NEXT: @ => This Inner Loop Header: Depth=2
322
+ ; CHECK-THUMB-NEXT: cmp r3, #0
323
+ ; CHECK-THUMB-NEXT: str r0, [r1, r4]
324
+ ; CHECK-THUMB-NEXT: bne .LBB19_1
325
+ ; CHECK-THUMB-NEXT: @ %bb.4: @ %for.cond2.preheader.2
326
+ ; CHECK-THUMB-NEXT: @ in Loop: Header=BB19_3 Depth=2
327
+ ; CHECK-THUMB-NEXT: str r0, [r2, r4]
328
+ ; CHECK-THUMB-NEXT: add r4, r12
329
+ ; CHECK-THUMB-NEXT: b .LBB19_3
330
+ entry:
331
+ %0 = add i32 %d , -4
332
+ %1 = mul i32 %c , 864846
333
+ %2 = add i32 %1 , 1367306604
334
+ br label %for.cond
335
+
336
+ for.cond: ; preds = %for.cond1.for.cond.cleanup_crit_edge, %for.cond.preheader
337
+ %indvar = phi i32 [ 0 , %entry ], [ %indvar.next , %for.cond1.for.cond.cleanup_crit_edge ]
338
+ %3 = mul i32 %indvar , %b
339
+ %4 = add i32 %3 , -2
340
+ br label %for.cond2.preheader
341
+
342
+ for.cond2.preheader: ; preds = %for.cond2.preheader.2, %for.cond
343
+ %indvar24 = phi i32 [ 0 , %for.cond ], [ %indvar.next25.3 , %for.cond2.preheader.2 ]
344
+ %indvar.next25 = or i32 %indvar24 , 1
345
+ %l5 = mul i32 %2 , %indvar.next25
346
+ %scevgep.1 = getelementptr [15 x [25 x [18 x i8 ]]], [15 x [25 x [18 x i8 ]]]* @arr_9 , i32 -217196 , i32 %4 , i32 %0 , i32 %l5
347
+ %l7 = bitcast i8* %scevgep.1 to i32*
348
+ store i32 0 , i32* %l7 , align 1
349
+ br i1 %cc , label %for.cond1.for.cond.cleanup_crit_edge , label %for.cond2.preheader.2
350
+
351
+ for.cond2.preheader.2 : ; preds = %for.cond2.preheader
352
+ %indvar.next25.1 = or i32 %indvar24 , 2
353
+ %l8 = mul i32 %2 , %indvar.next25.1
354
+ %scevgep.2 = getelementptr [15 x [25 x [18 x i8 ]]], [15 x [25 x [18 x i8 ]]]* @arr_9 , i32 -217196 , i32 %4 , i32 %0 , i32 %l8
355
+ %l10 = bitcast i8* %scevgep.2 to i32*
356
+ store i32 0 , i32* %l10 , align 1
357
+ %indvar.next25.3 = add i32 %indvar24 , 4
358
+ br label %for.cond2.preheader
359
+
360
+ for.cond1.for.cond.cleanup_crit_edge: ; preds = %for.cond2.preheader
361
+ %indvar.next = add i32 %indvar , 1
362
+ br label %for.cond
363
+ }
0 commit comments