@@ -5498,3 +5498,87 @@ vector.body: ; preds = %vector.body, %entry
5498
5498
for.cond.cleanup: ; preds = %vector.body
5499
5499
ret void
5500
5500
}
5501
+
5502
+ define void @sink_splat_vp_select_op1 (ptr %a , i32 %x , i32 %vl ) {
5503
+ ; CHECK-LABEL: sink_splat_vp_select_op1:
5504
+ ; CHECK: # %bb.0: # %entry
5505
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
5506
+ ; CHECK-NEXT: vmv.v.x v8, a1
5507
+ ; CHECK-NEXT: lui a3, 1
5508
+ ; CHECK-NEXT: li a1, 42
5509
+ ; CHECK-NEXT: slli a4, a2, 32
5510
+ ; CHECK-NEXT: add a2, a0, a3
5511
+ ; CHECK-NEXT: srli a3, a4, 32
5512
+ ; CHECK-NEXT: .LBB119_1: # %vector.body
5513
+ ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
5514
+ ; CHECK-NEXT: vle32.v v9, (a0)
5515
+ ; CHECK-NEXT: vmseq.vx v0, v9, a1
5516
+ ; CHECK-NEXT: vsetvli zero, a3, e32, m1, ta, ma
5517
+ ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
5518
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
5519
+ ; CHECK-NEXT: vse32.v v9, (a0)
5520
+ ; CHECK-NEXT: addi a0, a0, 16
5521
+ ; CHECK-NEXT: bne a0, a2, .LBB119_1
5522
+ ; CHECK-NEXT: # %bb.2: # %for.cond.cleanup
5523
+ ; CHECK-NEXT: ret
5524
+ entry:
5525
+ %broadcast.splatinsert = insertelement <4 x i32 > poison, i32 %x , i32 0
5526
+ %broadcast.splat = shufflevector <4 x i32 > %broadcast.splatinsert , <4 x i32 > poison, <4 x i32 > zeroinitializer
5527
+ br label %vector.body
5528
+
5529
+ vector.body:
5530
+ %index = phi i64 [ 0 , %entry ], [ %index.next , %vector.body ]
5531
+ %0 = getelementptr inbounds i32 , ptr %a , i64 %index
5532
+ %load = load <4 x i32 >, ptr %0 , align 4
5533
+ %cond = icmp eq <4 x i32 > %load , splat (i32 42 )
5534
+ %1 = call <4 x i32 > @llvm.vp.select (<4 x i1 > %cond , <4 x i32 > %broadcast.splat , <4 x i32 > %load , i32 %vl )
5535
+ store <4 x i32 > %1 , ptr %0 , align 4
5536
+ %index.next = add nuw i64 %index , 4
5537
+ %2 = icmp eq i64 %index.next , 1024
5538
+ br i1 %2 , label %for.cond.cleanup , label %vector.body
5539
+
5540
+ for.cond.cleanup:
5541
+ ret void
5542
+ }
5543
+
5544
+ define void @sink_splat_vp_select_op2 (ptr %a , i32 %x , i32 %vl ) {
5545
+ ; CHECK-LABEL: sink_splat_vp_select_op2:
5546
+ ; CHECK: # %bb.0: # %entry
5547
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
5548
+ ; CHECK-NEXT: vmv.v.x v8, a1
5549
+ ; CHECK-NEXT: lui a3, 1
5550
+ ; CHECK-NEXT: li a1, 42
5551
+ ; CHECK-NEXT: slli a4, a2, 32
5552
+ ; CHECK-NEXT: add a2, a0, a3
5553
+ ; CHECK-NEXT: srli a3, a4, 32
5554
+ ; CHECK-NEXT: .LBB120_1: # %vector.body
5555
+ ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
5556
+ ; CHECK-NEXT: vle32.v v9, (a0)
5557
+ ; CHECK-NEXT: vmseq.vx v0, v9, a1
5558
+ ; CHECK-NEXT: vsetvli zero, a3, e32, m1, ta, ma
5559
+ ; CHECK-NEXT: vmerge.vvm v9, v8, v9, v0
5560
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
5561
+ ; CHECK-NEXT: vse32.v v9, (a0)
5562
+ ; CHECK-NEXT: addi a0, a0, 16
5563
+ ; CHECK-NEXT: bne a0, a2, .LBB120_1
5564
+ ; CHECK-NEXT: # %bb.2: # %for.cond.cleanup
5565
+ ; CHECK-NEXT: ret
5566
+ entry:
5567
+ %broadcast.splatinsert = insertelement <4 x i32 > poison, i32 %x , i32 0
5568
+ %broadcast.splat = shufflevector <4 x i32 > %broadcast.splatinsert , <4 x i32 > poison, <4 x i32 > zeroinitializer
5569
+ br label %vector.body
5570
+
5571
+ vector.body:
5572
+ %index = phi i64 [ 0 , %entry ], [ %index.next , %vector.body ]
5573
+ %0 = getelementptr inbounds i32 , ptr %a , i64 %index
5574
+ %load = load <4 x i32 >, ptr %0 , align 4
5575
+ %cond = icmp eq <4 x i32 > %load , splat (i32 42 )
5576
+ %1 = call <4 x i32 > @llvm.vp.select (<4 x i1 > %cond , <4 x i32 > %load , <4 x i32 > %broadcast.splat , i32 %vl )
5577
+ store <4 x i32 > %1 , ptr %0 , align 4
5578
+ %index.next = add nuw i64 %index , 4
5579
+ %2 = icmp eq i64 %index.next , 1024
5580
+ br i1 %2 , label %for.cond.cleanup , label %vector.body
5581
+
5582
+ for.cond.cleanup:
5583
+ ret void
5584
+ }
0 commit comments