xref: /llvm-project/llvm/test/Transforms/LoopVectorize/RISCV/scalable-tailfold.ll (revision 82821254f532c1dbdfd5d985ef7130511efaaa83)
10f49d9e8SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2be51fa45SRoman Lebedev; RUN: opt < %s -passes=loop-vectorize -scalable-vectorization=on -prefer-predicate-over-epilogue=predicate-dont-vectorize -mtriple riscv64-linux-gnu -mattr=+v,+f -S 2>%t | FileCheck %s -check-prefix=CHECK
30f49d9e8SPhilip Reames
40f49d9e8SPhilip Reames; Exercise tail folding on RISCV w/scalable vectors.
50f49d9e8SPhilip Reames
60f49d9e8SPhilip Reamestarget datalayout = "e-m:e-p:64:64-i64:64-i128:128-n64-S128"
70f49d9e8SPhilip Reamestarget triple = "riscv64"
80f49d9e8SPhilip Reames
90f49d9e8SPhilip Reamesdefine void @vector_add(ptr noalias nocapture %a, i64 %v, i64 %n) {
100f49d9e8SPhilip Reames; CHECK-LABEL: @vector_add(
110f49d9e8SPhilip Reames; CHECK-NEXT:  entry:
12c41b41ebSSander de Smalen; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
130f49d9e8SPhilip Reames; CHECK:       vector.ph:
14c41b41ebSSander de Smalen; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
158d16c680SLuke Lau; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[TMP0]], 2
16c46a6e6cSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[TMP1]], 1
17bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 1025, [[TMP4]]
188d16c680SLuke Lau; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
190f49d9e8SPhilip Reames; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
205ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
215ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = mul i64 [[TMP5]], 2
22a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[V:%.*]], i64 0
23a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
240f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
250f49d9e8SPhilip Reames; CHECK:       vector.body:
260f49d9e8SPhilip Reames; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
275ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 0
285ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[TMP7]], i64 1025)
295ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP7]]
305ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0
315ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 2 x i64> @llvm.masked.load.nxv2i64.p0(ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i64> poison)
325ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = add <vscale x 2 x i64> [[WIDE_MASKED_LOAD]], [[BROADCAST_SPLAT]]
335ea6a3fcSFlorian Hahn; CHECK-NEXT:    call void @llvm.masked.store.nxv2i64.p0(<vscale x 2 x i64> [[TMP10]], ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
34*82821254SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]
358d16c680SLuke Lau; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
368d16c680SLuke Lau; CHECK-NEXT:    br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
370f49d9e8SPhilip Reames; CHECK:       middle.block:
380f49d9e8SPhilip Reames; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
390f49d9e8SPhilip Reames; CHECK:       scalar.ph:
400f49d9e8SPhilip Reames; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
410f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
420f49d9e8SPhilip Reames; CHECK:       for.body:
430f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
440f49d9e8SPhilip Reames; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[IV]]
450f49d9e8SPhilip Reames; CHECK-NEXT:    [[ELEM:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
460f49d9e8SPhilip Reames; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[ELEM]], [[V]]
470f49d9e8SPhilip Reames; CHECK-NEXT:    store i64 [[ADD]], ptr [[ARRAYIDX]], align 8
480f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
49bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1025
50c41b41ebSSander de Smalen; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
510f49d9e8SPhilip Reames; CHECK:       for.end:
520f49d9e8SPhilip Reames; CHECK-NEXT:    ret void
530f49d9e8SPhilip Reames;
540f49d9e8SPhilip Reamesentry:
550f49d9e8SPhilip Reames  br label %for.body
560f49d9e8SPhilip Reames
570f49d9e8SPhilip Reamesfor.body:
580f49d9e8SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
590f49d9e8SPhilip Reames  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
600f49d9e8SPhilip Reames  %elem = load i64, ptr %arrayidx
610f49d9e8SPhilip Reames  %add = add i64 %elem, %v
620f49d9e8SPhilip Reames  store i64 %add, ptr %arrayidx
630f49d9e8SPhilip Reames  %iv.next = add nuw nsw i64 %iv, 1
64bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1025
650f49d9e8SPhilip Reames  br i1 %exitcond.not, label %for.end, label %for.body
660f49d9e8SPhilip Reames
670f49d9e8SPhilip Reamesfor.end:
680f49d9e8SPhilip Reames  ret void
690f49d9e8SPhilip Reames}
700f49d9e8SPhilip Reames
710f49d9e8SPhilip Reames
720f49d9e8SPhilip Reames; a[b[i]] = v, exercise scatter support
730f49d9e8SPhilip Reamesdefine void @indexed_store(ptr noalias nocapture %a, ptr noalias nocapture %b, i64 %v, i64 %n) {
740f49d9e8SPhilip Reames; CHECK-LABEL: @indexed_store(
750f49d9e8SPhilip Reames; CHECK-NEXT:  entry:
76c41b41ebSSander de Smalen; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
774d875910SPhilip Reames; CHECK:       vector.ph:
78c41b41ebSSander de Smalen; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
798d16c680SLuke Lau; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[TMP0]], 2
80c46a6e6cSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[TMP1]], 1
81bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 1025, [[TMP4]]
828d16c680SLuke Lau; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
834d875910SPhilip Reames; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
845ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
855ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = mul i64 [[TMP5]], 2
86a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[V:%.*]], i64 0
87a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
884d875910SPhilip Reames; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
894d875910SPhilip Reames; CHECK:       vector.body:
904d875910SPhilip Reames; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
915ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 0
925ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[TMP7]], i64 1025)
935ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[B:%.*]], i64 [[TMP7]]
945ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0
955ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 2 x i64> @llvm.masked.load.nxv2i64.p0(ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i64> poison)
965ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], <vscale x 2 x i64> [[WIDE_MASKED_LOAD]]
975ea6a3fcSFlorian Hahn; CHECK-NEXT:    call void @llvm.masked.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64> [[BROADCAST_SPLAT]], <vscale x 2 x ptr> [[TMP10]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
98*82821254SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]
998d16c680SLuke Lau; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
1008d16c680SLuke Lau; CHECK-NEXT:    br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
1014d875910SPhilip Reames; CHECK:       middle.block:
1024d875910SPhilip Reames; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
1034d875910SPhilip Reames; CHECK:       scalar.ph:
1044d875910SPhilip Reames; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1050f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
1060f49d9e8SPhilip Reames; CHECK:       for.body:
1074d875910SPhilip Reames; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
1084d875910SPhilip Reames; CHECK-NEXT:    [[BADDR:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[IV]]
1090f49d9e8SPhilip Reames; CHECK-NEXT:    [[AIDX:%.*]] = load i64, ptr [[BADDR]], align 8
1104d875910SPhilip Reames; CHECK-NEXT:    [[AADDR:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[AIDX]]
1114d875910SPhilip Reames; CHECK-NEXT:    store i64 [[V]], ptr [[AADDR]], align 8
1120f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
113bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1025
1144d875910SPhilip Reames; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
1150f49d9e8SPhilip Reames; CHECK:       for.end:
1160f49d9e8SPhilip Reames; CHECK-NEXT:    ret void
1170f49d9e8SPhilip Reames;
1180f49d9e8SPhilip Reamesentry:
1190f49d9e8SPhilip Reames  br label %for.body
1200f49d9e8SPhilip Reames
1210f49d9e8SPhilip Reamesfor.body:
1220f49d9e8SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
1230f49d9e8SPhilip Reames  %baddr = getelementptr inbounds i64, ptr %b, i64 %iv
1240f49d9e8SPhilip Reames  %aidx = load i64, ptr %baddr
1250f49d9e8SPhilip Reames  %aaddr = getelementptr inbounds i64, ptr %a, i64 %aidx
1260f49d9e8SPhilip Reames  store i64 %v, ptr %aaddr
1270f49d9e8SPhilip Reames  %iv.next = add nuw nsw i64 %iv, 1
128bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1025
1290f49d9e8SPhilip Reames  br i1 %exitcond.not, label %for.end, label %for.body
1300f49d9e8SPhilip Reames
1310f49d9e8SPhilip Reamesfor.end:
1320f49d9e8SPhilip Reames  ret void
1330f49d9e8SPhilip Reames}
1340f49d9e8SPhilip Reames
1350f49d9e8SPhilip Reamesdefine i64 @indexed_load(ptr noalias nocapture %a, ptr noalias nocapture %b, i64 %v, i64 %n) {
1360f49d9e8SPhilip Reames; CHECK-LABEL: @indexed_load(
1370f49d9e8SPhilip Reames; CHECK-NEXT:  entry:
138c41b41ebSSander de Smalen; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
1394d875910SPhilip Reames; CHECK:       vector.ph:
140c41b41ebSSander de Smalen; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
1418d16c680SLuke Lau; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[TMP0]], 2
142c46a6e6cSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[TMP1]], 1
143bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 1025, [[TMP4]]
1448d16c680SLuke Lau; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
1454d875910SPhilip Reames; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
1465ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
1475ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = mul i64 [[TMP5]], 2
1484d875910SPhilip Reames; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
1494d875910SPhilip Reames; CHECK:       vector.body:
1504d875910SPhilip Reames; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
1515ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <vscale x 2 x i64> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP11:%.*]], [[VECTOR_BODY]] ]
1525ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 0
1535ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[TMP7]], i64 1025)
1545ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[B:%.*]], i64 [[TMP7]]
1555ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0
1565ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 2 x i64> @llvm.masked.load.nxv2i64.p0(ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i64> poison)
1575ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], <vscale x 2 x i64> [[WIDE_MASKED_LOAD]]
1585ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <vscale x 2 x i64> @llvm.masked.gather.nxv2i64.nxv2p0(<vscale x 2 x ptr> [[TMP10]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i64> poison)
1595ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP11]] = add <vscale x 2 x i64> [[VEC_PHI]], [[WIDE_MASKED_GATHER]]
1605ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP12:%.*]] = select <vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i64> [[TMP11]], <vscale x 2 x i64> [[VEC_PHI]]
161*82821254SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]
1628d16c680SLuke Lau; CHECK-NEXT:    [[TMP13:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
1638d16c680SLuke Lau; CHECK-NEXT:    br i1 [[TMP13]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
1644d875910SPhilip Reames; CHECK:       middle.block:
1655ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP14:%.*]] = call i64 @llvm.vector.reduce.add.nxv2i64(<vscale x 2 x i64> [[TMP12]])
1664d875910SPhilip Reames; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
1674d875910SPhilip Reames; CHECK:       scalar.ph:
1684d875910SPhilip Reames; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
16999d6c6d9SFlorian Hahn; CHECK-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i64 [ [[TMP14]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
1700f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
1710f49d9e8SPhilip Reames; CHECK:       for.body:
1724d875910SPhilip Reames; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
1734d875910SPhilip Reames; CHECK-NEXT:    [[SUM:%.*]] = phi i64 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[SUM_NEXT:%.*]], [[FOR_BODY]] ]
1744d875910SPhilip Reames; CHECK-NEXT:    [[BADDR:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[IV]]
1750f49d9e8SPhilip Reames; CHECK-NEXT:    [[AIDX:%.*]] = load i64, ptr [[BADDR]], align 8
1764d875910SPhilip Reames; CHECK-NEXT:    [[AADDR:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[AIDX]]
1770f49d9e8SPhilip Reames; CHECK-NEXT:    [[ELEM:%.*]] = load i64, ptr [[AADDR]], align 8
1780f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
1790f49d9e8SPhilip Reames; CHECK-NEXT:    [[SUM_NEXT]] = add i64 [[SUM]], [[ELEM]]
180bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1025
1814d875910SPhilip Reames; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
1820f49d9e8SPhilip Reames; CHECK:       for.end:
1838d16c680SLuke Lau; CHECK-NEXT:    [[SUM_NEXT_LCSSA:%.*]] = phi i64 [ [[SUM_NEXT]], [[FOR_BODY]] ], [ [[TMP14]], [[MIDDLE_BLOCK]] ]
1840f49d9e8SPhilip Reames; CHECK-NEXT:    ret i64 [[SUM_NEXT_LCSSA]]
1850f49d9e8SPhilip Reames;
1860f49d9e8SPhilip Reamesentry:
1870f49d9e8SPhilip Reames  br label %for.body
1880f49d9e8SPhilip Reames
1890f49d9e8SPhilip Reamesfor.body:
1900f49d9e8SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
1910f49d9e8SPhilip Reames  %sum = phi i64 [0, %entry], [%sum.next, %for.body]
1920f49d9e8SPhilip Reames  %baddr = getelementptr inbounds i64, ptr %b, i64 %iv
1930f49d9e8SPhilip Reames  %aidx = load i64, ptr %baddr
1940f49d9e8SPhilip Reames  %aaddr = getelementptr inbounds i64, ptr %a, i64 %aidx
1950f49d9e8SPhilip Reames  %elem = load i64, ptr %aaddr
1960f49d9e8SPhilip Reames  %iv.next = add nuw nsw i64 %iv, 1
1970f49d9e8SPhilip Reames  %sum.next = add i64 %sum, %elem
198bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1025
1990f49d9e8SPhilip Reames  br i1 %exitcond.not, label %for.end, label %for.body
2000f49d9e8SPhilip Reames
2010f49d9e8SPhilip Reamesfor.end:
2020f49d9e8SPhilip Reames  ret i64 %sum.next
2030f49d9e8SPhilip Reames}
2040f49d9e8SPhilip Reames
2050f49d9e8SPhilip Reamesdefine void @splat_int(ptr noalias nocapture %a, i64 %v, i64 %n) {
2060f49d9e8SPhilip Reames; CHECK-LABEL: @splat_int(
2070f49d9e8SPhilip Reames; CHECK-NEXT:  entry:
208c41b41ebSSander de Smalen; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
2090f49d9e8SPhilip Reames; CHECK:       vector.ph:
210c41b41ebSSander de Smalen; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
2118d16c680SLuke Lau; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[TMP0]], 2
212c46a6e6cSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[TMP1]], 1
213bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 1025, [[TMP4]]
2148d16c680SLuke Lau; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
2150f49d9e8SPhilip Reames; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
2165ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
2175ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = mul i64 [[TMP5]], 2
218a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[V:%.*]], i64 0
219a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
2200f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
2210f49d9e8SPhilip Reames; CHECK:       vector.body:
2220f49d9e8SPhilip Reames; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
2235ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 0
2245ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[TMP7]], i64 1025)
2255ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP7]]
2265ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0
2275ea6a3fcSFlorian Hahn; CHECK-NEXT:    call void @llvm.masked.store.nxv2i64.p0(<vscale x 2 x i64> [[BROADCAST_SPLAT]], ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
228*82821254SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]
2298d16c680SLuke Lau; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
2308d16c680SLuke Lau; CHECK-NEXT:    br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
2310f49d9e8SPhilip Reames; CHECK:       middle.block:
2320f49d9e8SPhilip Reames; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
2330f49d9e8SPhilip Reames; CHECK:       scalar.ph:
2340f49d9e8SPhilip Reames; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
2350f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
2360f49d9e8SPhilip Reames; CHECK:       for.body:
2370f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
2380f49d9e8SPhilip Reames; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[IV]]
2390f49d9e8SPhilip Reames; CHECK-NEXT:    store i64 [[V]], ptr [[ARRAYIDX]], align 8
2400f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
241bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1025
2424d875910SPhilip Reames; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
2430f49d9e8SPhilip Reames; CHECK:       for.end:
2440f49d9e8SPhilip Reames; CHECK-NEXT:    ret void
2450f49d9e8SPhilip Reames;
2460f49d9e8SPhilip Reamesentry:
2470f49d9e8SPhilip Reames  br label %for.body
2480f49d9e8SPhilip Reames
2490f49d9e8SPhilip Reamesfor.body:
2500f49d9e8SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
2510f49d9e8SPhilip Reames  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
2520f49d9e8SPhilip Reames  store i64 %v, ptr %arrayidx
2530f49d9e8SPhilip Reames  %iv.next = add nuw nsw i64 %iv, 1
254bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1025
2550f49d9e8SPhilip Reames  br i1 %exitcond.not, label %for.end, label %for.body
2560f49d9e8SPhilip Reames
2570f49d9e8SPhilip Reamesfor.end:
2580f49d9e8SPhilip Reames  ret void
2590f49d9e8SPhilip Reames}
2600f49d9e8SPhilip Reames
2610f49d9e8SPhilip Reamesdefine void @uniform_store(ptr noalias nocapture %a, ptr noalias nocapture %b, i64 %v, i64 %n) {
2620f49d9e8SPhilip Reames; CHECK-LABEL: @uniform_store(
2630f49d9e8SPhilip Reames; CHECK-NEXT:  entry:
264c41b41ebSSander de Smalen; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
2650b47615fSPhilip Reames; CHECK:       vector.ph:
266c41b41ebSSander de Smalen; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
2678d16c680SLuke Lau; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[TMP0]], 2
268c46a6e6cSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[TMP1]], 1
269bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 1025, [[TMP4]]
2708d16c680SLuke Lau; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
2710b47615fSPhilip Reames; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
2725ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
2735ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = mul i64 [[TMP5]], 2
274a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[V:%.*]], i64 0
275a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
2760b47615fSPhilip Reames; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
2770b47615fSPhilip Reames; CHECK:       vector.body:
2780b47615fSPhilip Reames; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
2795ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 0
2805ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[TMP7]], i64 1025)
2810b47615fSPhilip Reames; CHECK-NEXT:    store i64 [[V]], ptr [[B:%.*]], align 8
2825ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP7]]
2835ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0
2845ea6a3fcSFlorian Hahn; CHECK-NEXT:    call void @llvm.masked.store.nxv2i64.p0(<vscale x 2 x i64> [[BROADCAST_SPLAT]], ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
285*82821254SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]
2868d16c680SLuke Lau; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
2878d16c680SLuke Lau; CHECK-NEXT:    br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
2880b47615fSPhilip Reames; CHECK:       middle.block:
2890b47615fSPhilip Reames; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
2900b47615fSPhilip Reames; CHECK:       scalar.ph:
2910b47615fSPhilip Reames; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
2920f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
2930f49d9e8SPhilip Reames; CHECK:       for.body:
2940b47615fSPhilip Reames; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
2950b47615fSPhilip Reames; CHECK-NEXT:    store i64 [[V]], ptr [[B]], align 8
2960b47615fSPhilip Reames; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[IV]]
2970f49d9e8SPhilip Reames; CHECK-NEXT:    store i64 [[V]], ptr [[ARRAYIDX]], align 8
2980f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
299bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1025
3004d875910SPhilip Reames; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
3010f49d9e8SPhilip Reames; CHECK:       for.end:
3020f49d9e8SPhilip Reames; CHECK-NEXT:    ret void
3030f49d9e8SPhilip Reames;
3040f49d9e8SPhilip Reamesentry:
3050f49d9e8SPhilip Reames  br label %for.body
3060f49d9e8SPhilip Reames
3070f49d9e8SPhilip Reamesfor.body:
3080f49d9e8SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
3090f49d9e8SPhilip Reames  store i64 %v, ptr %b, align 8
3100f49d9e8SPhilip Reames  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
3110f49d9e8SPhilip Reames  store i64 %v, ptr %arrayidx
3120f49d9e8SPhilip Reames  %iv.next = add nuw nsw i64 %iv, 1
313bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1025
3140f49d9e8SPhilip Reames  br i1 %exitcond.not, label %for.end, label %for.body
3150f49d9e8SPhilip Reames
3160f49d9e8SPhilip Reamesfor.end:
3170f49d9e8SPhilip Reames  ret void
3180f49d9e8SPhilip Reames}
3190f49d9e8SPhilip Reames
3200f49d9e8SPhilip Reamesdefine i64 @uniform_load(ptr noalias nocapture %a, ptr noalias nocapture %b, i64 %n) {
3210f49d9e8SPhilip Reames; CHECK-LABEL: @uniform_load(
3220f49d9e8SPhilip Reames; CHECK-NEXT:  entry:
3230f49d9e8SPhilip Reames; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
3240f49d9e8SPhilip Reames; CHECK:       for.body:
3250f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
3260f49d9e8SPhilip Reames; CHECK-NEXT:    [[V:%.*]] = load i64, ptr [[B:%.*]], align 8
3270f49d9e8SPhilip Reames; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[IV]]
3280f49d9e8SPhilip Reames; CHECK-NEXT:    store i64 [[V]], ptr [[ARRAYIDX]], align 8
3290f49d9e8SPhilip Reames; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
330bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1025
3310f49d9e8SPhilip Reames; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY]]
3320f49d9e8SPhilip Reames; CHECK:       for.end:
3330f49d9e8SPhilip Reames; CHECK-NEXT:    [[V_LCSSA:%.*]] = phi i64 [ [[V]], [[FOR_BODY]] ]
3340f49d9e8SPhilip Reames; CHECK-NEXT:    ret i64 [[V_LCSSA]]
3350f49d9e8SPhilip Reames;
3360f49d9e8SPhilip Reamesentry:
3370f49d9e8SPhilip Reames  br label %for.body
3380f49d9e8SPhilip Reames
3390f49d9e8SPhilip Reamesfor.body:
3400f49d9e8SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
3410f49d9e8SPhilip Reames  %v = load i64, ptr %b, align 8
3420f49d9e8SPhilip Reames  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
3430f49d9e8SPhilip Reames  store i64 %v, ptr %arrayidx
3440f49d9e8SPhilip Reames  %iv.next = add nuw nsw i64 %iv, 1
345bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1025
3460f49d9e8SPhilip Reames  br i1 %exitcond.not, label %for.end, label %for.body
3470f49d9e8SPhilip Reames
3480f49d9e8SPhilip Reamesfor.end:
3490f49d9e8SPhilip Reames  ret i64 %v
3500f49d9e8SPhilip Reames}
351bd0c281fSDavid Sherwood
352bd0c281fSDavid Sherwood
353bd0c281fSDavid Sherwooddefine void @vector_add_trip1024(ptr noalias nocapture %a, i64 %v, i64 %n) {
354bd0c281fSDavid Sherwood; CHECK-LABEL: @vector_add_trip1024(
355bd0c281fSDavid Sherwood; CHECK-NEXT:  entry:
356bd0c281fSDavid Sherwood; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
357bd0c281fSDavid Sherwood; CHECK:       vector.ph:
358bd0c281fSDavid Sherwood; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
359bd0c281fSDavid Sherwood; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[TMP0]], 2
360c46a6e6cSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[TMP1]], 1
361bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 1024, [[TMP4]]
362bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
363bd0c281fSDavid Sherwood; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
3645ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
3655ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = mul i64 [[TMP5]], 2
366a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[V:%.*]], i64 0
367a5891fa4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
368bd0c281fSDavid Sherwood; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
369bd0c281fSDavid Sherwood; CHECK:       vector.body:
370bd0c281fSDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
3715ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 0
3725ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[TMP7]], i64 1024)
3735ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP7]]
3745ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[TMP8]], i32 0
3755ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 2 x i64> @llvm.masked.load.nxv2i64.p0(ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i64> poison)
3765ea6a3fcSFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = add <vscale x 2 x i64> [[WIDE_MASKED_LOAD]], [[BROADCAST_SPLAT]]
3775ea6a3fcSFlorian Hahn; CHECK-NEXT:    call void @llvm.masked.store.nxv2i64.p0(<vscale x 2 x i64> [[TMP10]], ptr [[TMP9]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
378*82821254SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]
379bd0c281fSDavid Sherwood; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
380bd0c281fSDavid Sherwood; CHECK-NEXT:    br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
381bd0c281fSDavid Sherwood; CHECK:       middle.block:
382bd0c281fSDavid Sherwood; CHECK-NEXT:    br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
383bd0c281fSDavid Sherwood; CHECK:       scalar.ph:
384bd0c281fSDavid Sherwood; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
385bd0c281fSDavid Sherwood; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
386bd0c281fSDavid Sherwood; CHECK:       for.body:
387bd0c281fSDavid Sherwood; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_BODY]] ]
388bd0c281fSDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[IV]]
389bd0c281fSDavid Sherwood; CHECK-NEXT:    [[ELEM:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
390bd0c281fSDavid Sherwood; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[ELEM]], [[V]]
391bd0c281fSDavid Sherwood; CHECK-NEXT:    store i64 [[ADD]], ptr [[ARRAYIDX]], align 8
392bd0c281fSDavid Sherwood; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
393bd0c281fSDavid Sherwood; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 1024
394bd0c281fSDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
395bd0c281fSDavid Sherwood; CHECK:       for.end:
396bd0c281fSDavid Sherwood; CHECK-NEXT:    ret void
397bd0c281fSDavid Sherwood;
398bd0c281fSDavid Sherwoodentry:
399bd0c281fSDavid Sherwood  br label %for.body
400bd0c281fSDavid Sherwood
401bd0c281fSDavid Sherwoodfor.body:
402bd0c281fSDavid Sherwood  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
403bd0c281fSDavid Sherwood  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
404bd0c281fSDavid Sherwood  %elem = load i64, ptr %arrayidx
405bd0c281fSDavid Sherwood  %add = add i64 %elem, %v
406bd0c281fSDavid Sherwood  store i64 %add, ptr %arrayidx
407bd0c281fSDavid Sherwood  %iv.next = add nuw nsw i64 %iv, 1
408bd0c281fSDavid Sherwood  %exitcond.not = icmp eq i64 %iv.next, 1024
409bd0c281fSDavid Sherwood  br i1 %exitcond.not, label %for.end, label %for.body
410bd0c281fSDavid Sherwood
411bd0c281fSDavid Sherwoodfor.end:
412bd0c281fSDavid Sherwood  ret void
413bd0c281fSDavid Sherwood}
414