brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · 850d6b2 Raw
149 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -scalable-vectorization=on -force-target-supports-scalable-vectors=true -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=1 < %s | FileCheck %s3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"5 6; Make sure we can vectorize loops which contain lifetime markers.7 8define void @test(ptr %d) {9; CHECK-LABEL: define void @test10; CHECK-SAME: (ptr [[D:%.*]]) {11; CHECK-NEXT:  entry:12; CHECK-NEXT:    [[ARR:%.*]] = alloca [1024 x i32], align 1613; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[ARR]])14; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()15; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw i64 [[TMP0]], 116; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 128, [[TMP1]]17; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]18; CHECK:       vector.ph:19; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vscale.i64()20; CHECK-NEXT:    [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 221; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 128, [[TMP3]]22; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 128, [[N_MOD_VF]]23; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]24; CHECK:       vector.body:25; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]26; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[ARR]])27; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[INDEX]]28; CHECK-NEXT:    store <vscale x 2 x i32> splat (i32 100), ptr [[TMP4]], align 829; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[ARR]])30; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]31; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]32; CHECK-NEXT:    br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]33; CHECK:       middle.block:34; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 128, [[N_VEC]]35; CHECK-NEXT:    br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]36; CHECK:       scalar.ph:37; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]38; CHECK-NEXT:    br label [[FOR_BODY:%.*]]39; CHECK:       for.body:40; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]41; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[ARR]])42; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[INDVARS_IV]]43; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX]], align 844; CHECK-NEXT:    store i32 100, ptr [[ARRAYIDX]], align 845; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[ARR]])46; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 147; CHECK-NEXT:    [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i3248; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], 12849; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP3:![0-9]+]]50; CHECK:       for.end:51; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[ARR]])52; CHECK-NEXT:    ret void53;54 55entry:56  %arr = alloca [1024 x i32], align 1657  call void @llvm.lifetime.start.p0(ptr %arr) #158  br label %for.body59 60for.body:61  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]62  call void @llvm.lifetime.end.p0(ptr %arr) #163  %arrayidx = getelementptr inbounds i32, ptr %d, i64 %indvars.iv64  %0 = load i32, ptr %arrayidx, align 865  store i32 100, ptr %arrayidx, align 866  call void @llvm.lifetime.start.p0(ptr %arr) #167  %indvars.iv.next = add i64 %indvars.iv, 168  %lftr.wideiv = trunc i64 %indvars.iv.next to i3269  %exitcond = icmp ne i32 %lftr.wideiv, 12870  br i1 %exitcond, label %for.body, label %for.end, !llvm.loop !071 72for.end:73  call void @llvm.lifetime.end.p0(ptr %arr) #174  ret void75}76 77define void @testloopvariant(ptr %d) {78; CHECK-LABEL: define void @testloopvariant79; CHECK-SAME: (ptr [[D:%.*]]) {80; CHECK-NEXT:  entry:81; CHECK-NEXT:    [[ARR:%.*]] = alloca [1024 x i32], align 1682; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()83; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw i64 [[TMP0]], 184; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 128, [[TMP1]]85; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]86; CHECK:       vector.ph:87; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vscale.i64()88; CHECK-NEXT:    [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 289; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 128, [[TMP3]]90; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 128, [[N_MOD_VF]]91; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]92; CHECK:       vector.body:93; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]94; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[ARR]])95; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[INDEX]]96; CHECK-NEXT:    store <vscale x 2 x i32> splat (i32 100), ptr [[TMP4]], align 897; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[ARR]])98; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]99; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]100; CHECK-NEXT:    br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]101; CHECK:       middle.block:102; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 128, [[N_VEC]]103; CHECK-NEXT:    br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]104; CHECK:       scalar.ph:105; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]106; CHECK-NEXT:    br label [[FOR_BODY:%.*]]107; CHECK:       for.body:108; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]109; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr [1024 x i32], ptr [[ARR]], i32 0, i64 [[INDVARS_IV]]110; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[ARR]])111; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[INDVARS_IV]]112; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX]], align 8113; CHECK-NEXT:    store i32 100, ptr [[ARRAYIDX]], align 8114; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[ARR]])115; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1116; CHECK-NEXT:    [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32117; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], 128118; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP5:![0-9]+]]119; CHECK:       for.end:120; CHECK-NEXT:    ret void121;122entry:123  %arr = alloca [1024 x i32], align 16124  br label %for.body125 126for.body:127  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]128  %0 = getelementptr [1024 x i32], ptr %arr, i32 0, i64 %indvars.iv129  call void @llvm.lifetime.end.p0(ptr %arr) #1130  %arrayidx = getelementptr inbounds i32, ptr %d, i64 %indvars.iv131  %1 = load i32, ptr %arrayidx, align 8132  store i32 100, ptr %arrayidx, align 8133  call void @llvm.lifetime.start.p0(ptr %arr) #1134  %indvars.iv.next = add i64 %indvars.iv, 1135  %lftr.wideiv = trunc i64 %indvars.iv.next to i32136  %exitcond = icmp ne i32 %lftr.wideiv, 128137  br i1 %exitcond, label %for.body, label %for.end, !llvm.loop !0138 139for.end:140  ret void141}142 143declare void @llvm.lifetime.start.p0(ptr nocapture) #1144 145declare void @llvm.lifetime.end.p0(ptr nocapture) #1146 147!0 = distinct !{!0, !1}148!1 = !{!"llvm.loop.vectorize.scalable.enable", i1 true}149