@@ -582,3 +582,58 @@ if2.end:
582
582
ret <vscale x 2 x i32 > %h
583
583
}
584
584
declare <vscale x 2 x i32 > @llvm.riscv.vwadd.w.nxv2i32.nxv2i16 (<vscale x 2 x i32 >, <vscale x 2 x i32 >, <vscale x 2 x i16 >, i64 )
585
+
586
+ ; We should only need 1 vsetvli for this code.
587
+ define void @vlmax (i64 %N , double * %c , double * %a , double * %b ) {
588
+ ; CHECK-LABEL: vlmax:
589
+ ; CHECK: # %bb.0: # %entry
590
+ ; CHECK-NEXT: vsetvli a6, zero, e64, m1, ta, mu
591
+ ; CHECK-NEXT: blez a0, .LBB11_3
592
+ ; CHECK-NEXT: # %bb.1: # %for.body.preheader
593
+ ; CHECK-NEXT: li a5, 0
594
+ ; CHECK-NEXT: li t1, 0
595
+ ; CHECK-NEXT: slli a7, a6, 3
596
+ ; CHECK-NEXT: .LBB11_2: # %for.body
597
+ ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
598
+ ; CHECK-NEXT: add t0, a2, a5
599
+ ; CHECK-NEXT: vsetvli zero, a6, e64, m1, ta, mu
600
+ ; CHECK-NEXT: vle64.v v8, (t0)
601
+ ; CHECK-NEXT: add a4, a3, a5
602
+ ; CHECK-NEXT: vle64.v v9, (a4)
603
+ ; CHECK-NEXT: vfadd.vv v8, v8, v9
604
+ ; CHECK-NEXT: add a4, a1, a5
605
+ ; CHECK-NEXT: vse64.v v8, (a4)
606
+ ; CHECK-NEXT: add t1, t1, a6
607
+ ; CHECK-NEXT: add a5, a5, a7
608
+ ; CHECK-NEXT: blt t1, a0, .LBB11_2
609
+ ; CHECK-NEXT: .LBB11_3: # %for.end
610
+ ; CHECK-NEXT: ret
611
+ entry:
612
+ %0 = tail call i64 @llvm.riscv.vsetvlimax.i64 (i64 3 , i64 0 )
613
+ %cmp13 = icmp sgt i64 %N , 0
614
+ br i1 %cmp13 , label %for.body , label %for.end
615
+
616
+ for.body: ; preds = %entry, %for.body
617
+ %i.014 = phi i64 [ %add , %for.body ], [ 0 , %entry ]
618
+ %arrayidx = getelementptr inbounds double , double * %a , i64 %i.014
619
+ %1 = bitcast double * %arrayidx to <vscale x 1 x double >*
620
+ %2 = tail call <vscale x 1 x double > @llvm.riscv.vle.nxv1f64.i64 (<vscale x 1 x double > undef , <vscale x 1 x double >* %1 , i64 %0 )
621
+ %arrayidx1 = getelementptr inbounds double , double * %b , i64 %i.014
622
+ %3 = bitcast double * %arrayidx1 to <vscale x 1 x double >*
623
+ %4 = tail call <vscale x 1 x double > @llvm.riscv.vle.nxv1f64.i64 (<vscale x 1 x double > undef , <vscale x 1 x double >* %3 , i64 %0 )
624
+ %5 = tail call <vscale x 1 x double > @llvm.riscv.vfadd.nxv1f64.nxv1f64.i64 (<vscale x 1 x double > undef , <vscale x 1 x double > %2 , <vscale x 1 x double > %4 , i64 %0 )
625
+ %arrayidx2 = getelementptr inbounds double , double * %c , i64 %i.014
626
+ %6 = bitcast double * %arrayidx2 to <vscale x 1 x double >*
627
+ tail call void @llvm.riscv.vse.nxv1f64.i64 (<vscale x 1 x double > %5 , <vscale x 1 x double >* %6 , i64 %0 )
628
+ %add = add nuw nsw i64 %i.014 , %0
629
+ %cmp = icmp slt i64 %add , %N
630
+ br i1 %cmp , label %for.body , label %for.end
631
+
632
+ for.end: ; preds = %for.body, %entry
633
+ ret void
634
+ }
635
+
636
+ declare i64 @llvm.riscv.vsetvlimax.i64 (i64 , i64 )
637
+ declare <vscale x 1 x double > @llvm.riscv.vle.nxv1f64.i64 (<vscale x 1 x double >, <vscale x 1 x double >* nocapture , i64 )
638
+ declare <vscale x 1 x double > @llvm.riscv.vfadd.nxv1f64.nxv1f64.i64 (<vscale x 1 x double >, <vscale x 1 x double >, <vscale x 1 x double >, i64 )
639
+ declare void @llvm.riscv.vse.nxv1f64.i64 (<vscale x 1 x double >, <vscale x 1 x double >* nocapture , i64 )
0 commit comments