@@ -315,17 +315,108 @@ bb7: ; preds = %bb2
315
315
}
316
316
declare float @baz (i32 signext %i3 )
317
317
318
+ define void @test7 (i32 signext %arg , i32 signext %arg1 ) nounwind {
319
+ ; RV64I-LABEL: test7:
320
+ ; RV64I: # %bb.0: # %bb
321
+ ; RV64I-NEXT: addi sp, sp, -48
322
+ ; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
323
+ ; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
324
+ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
325
+ ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
326
+ ; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
327
+ ; RV64I-NEXT: lui a2, %hi(.LCPI6_0)
328
+ ; RV64I-NEXT: ld s0, %lo(.LCPI6_0)(a2)
329
+ ; RV64I-NEXT: lui a2, %hi(.LCPI6_1)
330
+ ; RV64I-NEXT: ld s1, %lo(.LCPI6_1)(a2)
331
+ ; RV64I-NEXT: lui a2, %hi(.LCPI6_2)
332
+ ; RV64I-NEXT: ld s2, %lo(.LCPI6_2)(a2)
333
+ ; RV64I-NEXT: lui a2, %hi(.LCPI6_3)
334
+ ; RV64I-NEXT: ld s3, %lo(.LCPI6_3)(a2)
335
+ ; RV64I-NEXT: sraw a0, a0, a1
336
+ ; RV64I-NEXT: .LBB6_1: # %bb2
337
+ ; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
338
+ ; RV64I-NEXT: call foo@plt
339
+ ; RV64I-NEXT: srli a1, a0, 1
340
+ ; RV64I-NEXT: and a1, a1, s0
341
+ ; RV64I-NEXT: sub a0, a0, a1
342
+ ; RV64I-NEXT: and a1, a0, s1
343
+ ; RV64I-NEXT: srli a0, a0, 2
344
+ ; RV64I-NEXT: and a0, a0, s1
345
+ ; RV64I-NEXT: add a0, a1, a0
346
+ ; RV64I-NEXT: srli a1, a0, 4
347
+ ; RV64I-NEXT: add a0, a0, a1
348
+ ; RV64I-NEXT: and a0, a0, s2
349
+ ; RV64I-NEXT: mul a0, a0, s3
350
+ ; RV64I-NEXT: srli a0, a0, 56
351
+ ; RV64I-NEXT: bnez a0, .LBB6_1
352
+ ; RV64I-NEXT: # %bb.2: # %bb7
353
+ ; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
354
+ ; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
355
+ ; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
356
+ ; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
357
+ ; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
358
+ ; RV64I-NEXT: addi sp, sp, 48
359
+ ; RV64I-NEXT: ret
360
+ ;
361
+ ; RV64ZBB-LABEL: test7:
362
+ ; RV64ZBB: # %bb.0: # %bb
363
+ ; RV64ZBB-NEXT: addi sp, sp, -16
364
+ ; RV64ZBB-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
365
+ ; RV64ZBB-NEXT: sraw a0, a0, a1
366
+ ; RV64ZBB-NEXT: .LBB6_1: # %bb2
367
+ ; RV64ZBB-NEXT: # =>This Inner Loop Header: Depth=1
368
+ ; RV64ZBB-NEXT: call foo@plt
369
+ ; RV64ZBB-NEXT: cpop a0, a0
370
+ ; RV64ZBB-NEXT: bnez a0, .LBB6_1
371
+ ; RV64ZBB-NEXT: # %bb.2: # %bb7
372
+ ; RV64ZBB-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
373
+ ; RV64ZBB-NEXT: addi sp, sp, 16
374
+ ; RV64ZBB-NEXT: ret
375
+ ;
376
+ ; NOREMOVAL-LABEL: test7:
377
+ ; NOREMOVAL: # %bb.0: # %bb
378
+ ; NOREMOVAL-NEXT: addi sp, sp, -16
379
+ ; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
380
+ ; NOREMOVAL-NEXT: sraw a0, a0, a1
381
+ ; NOREMOVAL-NEXT: .LBB6_1: # %bb2
382
+ ; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1
383
+ ; NOREMOVAL-NEXT: sext.w a0, a0
384
+ ; NOREMOVAL-NEXT: call foo@plt
385
+ ; NOREMOVAL-NEXT: cpop a0, a0
386
+ ; NOREMOVAL-NEXT: bnez a0, .LBB6_1
387
+ ; NOREMOVAL-NEXT: # %bb.2: # %bb7
388
+ ; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
389
+ ; NOREMOVAL-NEXT: addi sp, sp, 16
390
+ ; NOREMOVAL-NEXT: ret
391
+ bb:
392
+ %i = ashr i32 %arg , %arg1
393
+ br label %bb2
394
+
395
+ bb2: ; preds = %bb2, %bb
396
+ %i3 = phi i32 [ %i , %bb ], [ %i6 , %bb2 ]
397
+ %i4 = tail call signext i64 @foo (i32 signext %i3 )
398
+ %i5 = tail call i64 @llvm.ctpop.i64 (i64 %i4 )
399
+ %i6 = trunc i64 %i5 to i32
400
+ %i7 = icmp eq i32 %i6 , 0
401
+ br i1 %i7 , label %bb7 , label %bb2
402
+
403
+ bb7: ; preds = %bb2
404
+ ret void
405
+ }
406
+
407
+ declare i64 @llvm.ctpop.i64 (i64 )
408
+
318
409
define void @test8 (i32 signext %arg , i32 signext %arg1 ) nounwind {
319
410
; CHECK-LABEL: test8:
320
411
; CHECK: # %bb.0: # %bb
321
412
; CHECK-NEXT: addi sp, sp, -16
322
413
; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
323
414
; CHECK-NEXT: sraw a0, a0, a1
324
- ; CHECK-NEXT: .LBB6_1 : # %bb2
415
+ ; CHECK-NEXT: .LBB7_1 : # %bb2
325
416
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
326
417
; CHECK-NEXT: call foo@plt
327
418
; CHECK-NEXT: ori a0, a0, -256
328
- ; CHECK-NEXT: bnez a0, .LBB6_1
419
+ ; CHECK-NEXT: bnez a0, .LBB7_1
329
420
; CHECK-NEXT: # %bb.2: # %bb7
330
421
; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
331
422
; CHECK-NEXT: addi sp, sp, 16
@@ -336,12 +427,12 @@ define void @test8(i32 signext %arg, i32 signext %arg1) nounwind {
336
427
; NOREMOVAL-NEXT: addi sp, sp, -16
337
428
; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
338
429
; NOREMOVAL-NEXT: sraw a0, a0, a1
339
- ; NOREMOVAL-NEXT: .LBB6_1 : # %bb2
430
+ ; NOREMOVAL-NEXT: .LBB7_1 : # %bb2
340
431
; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1
341
432
; NOREMOVAL-NEXT: sext.w a0, a0
342
433
; NOREMOVAL-NEXT: call foo@plt
343
434
; NOREMOVAL-NEXT: ori a0, a0, -256
344
- ; NOREMOVAL-NEXT: bnez a0, .LBB6_1
435
+ ; NOREMOVAL-NEXT: bnez a0, .LBB7_1
345
436
; NOREMOVAL-NEXT: # %bb.2: # %bb7
346
437
; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
347
438
; NOREMOVAL-NEXT: addi sp, sp, 16
@@ -372,12 +463,12 @@ define void @test9(i32 signext %arg, i32 signext %arg1) nounwind {
372
463
; CHECK-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
373
464
; CHECK-NEXT: sraw a0, a0, a1
374
465
; CHECK-NEXT: li s0, 254
375
- ; CHECK-NEXT: .LBB7_1 : # %bb2
466
+ ; CHECK-NEXT: .LBB8_1 : # %bb2
376
467
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
377
468
; CHECK-NEXT: call bar@plt
378
469
; CHECK-NEXT: mv a1, a0
379
470
; CHECK-NEXT: slti a0, a0, 255
380
- ; CHECK-NEXT: blt s0, a1, .LBB7_1
471
+ ; CHECK-NEXT: blt s0, a1, .LBB8_1
381
472
; CHECK-NEXT: # %bb.2: # %bb7
382
473
; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
383
474
; CHECK-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
@@ -391,12 +482,12 @@ define void @test9(i32 signext %arg, i32 signext %arg1) nounwind {
391
482
; NOREMOVAL-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
392
483
; NOREMOVAL-NEXT: sraw a1, a0, a1
393
484
; NOREMOVAL-NEXT: li s0, 254
394
- ; NOREMOVAL-NEXT: .LBB7_1 : # %bb2
485
+ ; NOREMOVAL-NEXT: .LBB8_1 : # %bb2
395
486
; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1
396
487
; NOREMOVAL-NEXT: sext.w a0, a1
397
488
; NOREMOVAL-NEXT: call bar@plt
398
489
; NOREMOVAL-NEXT: slti a1, a0, 255
399
- ; NOREMOVAL-NEXT: blt s0, a0, .LBB7_1
490
+ ; NOREMOVAL-NEXT: blt s0, a0, .LBB8_1
400
491
; NOREMOVAL-NEXT: # %bb.2: # %bb7
401
492
; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
402
493
; NOREMOVAL-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
@@ -426,12 +517,12 @@ define void @test10(i32 signext %arg, i32 signext %arg1) nounwind {
426
517
; CHECK-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill
427
518
; CHECK-NEXT: sraw a0, a0, a1
428
519
; CHECK-NEXT: fmv.w.x fs0, zero
429
- ; CHECK-NEXT: .LBB8_1 : # %bb2
520
+ ; CHECK-NEXT: .LBB9_1 : # %bb2
430
521
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
431
522
; CHECK-NEXT: call baz@plt
432
523
; CHECK-NEXT: feq.s a1, fa0, fs0
433
524
; CHECK-NEXT: fmv.x.w a0, fa0
434
- ; CHECK-NEXT: beqz a1, .LBB8_1
525
+ ; CHECK-NEXT: beqz a1, .LBB9_1
435
526
; CHECK-NEXT: # %bb.2: # %bb7
436
527
; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
437
528
; CHECK-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload
@@ -445,13 +536,13 @@ define void @test10(i32 signext %arg, i32 signext %arg1) nounwind {
445
536
; NOREMOVAL-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill
446
537
; NOREMOVAL-NEXT: sraw a0, a0, a1
447
538
; NOREMOVAL-NEXT: fmv.w.x fs0, zero
448
- ; NOREMOVAL-NEXT: .LBB8_1 : # %bb2
539
+ ; NOREMOVAL-NEXT: .LBB9_1 : # %bb2
449
540
; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1
450
541
; NOREMOVAL-NEXT: sext.w a0, a0
451
542
; NOREMOVAL-NEXT: call baz@plt
452
543
; NOREMOVAL-NEXT: feq.s a1, fa0, fs0
453
544
; NOREMOVAL-NEXT: fmv.x.w a0, fa0
454
- ; NOREMOVAL-NEXT: beqz a1, .LBB8_1
545
+ ; NOREMOVAL-NEXT: beqz a1, .LBB9_1
455
546
; NOREMOVAL-NEXT: # %bb.2: # %bb7
456
547
; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
457
548
; NOREMOVAL-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload
0 commit comments