brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · 9989209 Raw
165 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --filter-out-after "^scalar.ph:"2; This is the loop in c++ being vectorize in this file with3;vector.reverse4;  #pragma clang loop vectorize_width(8, scalable) interleave_count(2)5;  for (int i = N-1; i >= 0; --i)6;    a[i] = b[i] + 1.0;7 8; RUN: opt -passes=loop-vectorize,dce,instcombine -mtriple aarch64-linux-gnu -S \9; RUN:   -prefer-predicate-over-epilogue=scalar-epilogue < %s | FileCheck %s10 11define void @vector_reverse_f64(i64 %N, ptr noalias %a, ptr noalias %b) #0{12; CHECK-LABEL: @vector_reverse_f64(13; CHECK-NEXT:  entry:14; CHECK-NEXT:    [[CMP7:%.*]] = icmp sgt i64 [[N:%.*]], 015; CHECK-NEXT:    br i1 [[CMP7]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]16; CHECK:       for.body.preheader:17; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()18; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw i64 [[TMP0]], 419; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], [[TMP1]]20; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]21; CHECK:       vector.ph:22; CHECK-NEXT:    [[TMP4:%.*]] = call i64 @llvm.vscale.i64()23; CHECK-NEXT:    [[TMP5:%.*]] = shl nuw i64 [[TMP4]], 324; CHECK-NEXT:    [[TMP6:%.*]] = shl i64 [[TMP4]], 425; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], [[TMP6]]26; CHECK-NEXT:    [[N_VEC:%.*]] = sub nsw i64 [[N]], [[N_MOD_VF]]27; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]28; CHECK:       vector.body:29; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]30; CHECK-NEXT:    [[TMP7:%.*]] = xor i64 [[INDEX]], -131; CHECK-NEXT:    [[TMP8:%.*]] = add i64 [[N]], [[TMP7]]32; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds double, ptr [[B:%.*]], i64 [[TMP8]]33; CHECK-NEXT:    [[TMP10:%.*]] = sub i64 1, [[TMP5]]34; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr inbounds double, ptr [[TMP9]], i64 [[TMP10]]35; CHECK-NEXT:    [[TMP12:%.*]] = sub i64 0, [[TMP5]]36; CHECK-NEXT:    [[TMP13:%.*]] = sub i64 1, [[TMP5]]37; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds double, ptr [[TMP9]], i64 [[TMP12]]38; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds double, ptr [[TMP14]], i64 [[TMP13]]39; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <vscale x 8 x double>, ptr [[TMP11]], align 840; CHECK-NEXT:    [[WIDE_LOAD1:%.*]] = load <vscale x 8 x double>, ptr [[TMP15]], align 841; CHECK-NEXT:    [[TMP16:%.*]] = fadd <vscale x 8 x double> [[WIDE_LOAD]], splat (double 1.000000e+00)42; CHECK-NEXT:    [[TMP17:%.*]] = fadd <vscale x 8 x double> [[WIDE_LOAD1]], splat (double 1.000000e+00)43; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr inbounds double, ptr [[A:%.*]], i64 [[TMP8]]44; CHECK-NEXT:    [[TMP19:%.*]] = sub i64 1, [[TMP5]]45; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds double, ptr [[TMP18]], i64 [[TMP19]]46; CHECK-NEXT:    [[TMP21:%.*]] = sub i64 0, [[TMP5]]47; CHECK-NEXT:    [[TMP22:%.*]] = sub i64 1, [[TMP5]]48; CHECK-NEXT:    [[TMP23:%.*]] = getelementptr inbounds double, ptr [[TMP18]], i64 [[TMP21]]49; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds double, ptr [[TMP23]], i64 [[TMP22]]50; CHECK-NEXT:    store <vscale x 8 x double> [[TMP16]], ptr [[TMP20]], align 851; CHECK-NEXT:    store <vscale x 8 x double> [[TMP17]], ptr [[TMP24]], align 852; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]53; CHECK-NEXT:    [[TMP25:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]54; CHECK-NEXT:    br i1 [[TMP25]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]55; CHECK:       middle.block:56; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N_MOD_VF]], 057; CHECK-NEXT:    br i1 [[CMP_N]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[SCALAR_PH]]58; CHECK:       scalar.ph:59;60entry:61  %cmp7 = icmp sgt i64 %N, 062  br i1 %cmp7, label %for.body, label %for.cond.cleanup63 64for.cond.cleanup:                                 ; preds = %for.body65  ret void66 67for.body:                                         ; preds = %entry, %for.body68  %i.08.in = phi i64 [ %i.08, %for.body ], [ %N, %entry ]69  %i.08 = add nsw i64 %i.08.in, -170  %arrayidx = getelementptr inbounds double, ptr %b, i64 %i.0871  %0 = load double, ptr %arrayidx, align 872  %add = fadd double %0, 1.000000e+0073  %arrayidx1 = getelementptr inbounds double, ptr %a, i64 %i.0874  store double %add, ptr %arrayidx1, align 875  %cmp = icmp sgt i64 %i.08.in, 176  br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !077}78 79 80define void @vector_reverse_i64(i64 %N, ptr %a, ptr %b) #0 {81; CHECK-LABEL: @vector_reverse_i64(82; CHECK-NEXT:  entry:83; CHECK-NEXT:    [[A2:%.*]] = ptrtoint ptr [[A:%.*]] to i6484; CHECK-NEXT:    [[B1:%.*]] = ptrtoint ptr [[B:%.*]] to i6485; CHECK-NEXT:    [[CMP8:%.*]] = icmp sgt i64 [[N:%.*]], 086; CHECK-NEXT:    br i1 [[CMP8]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]87; CHECK:       for.body.preheader:88; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()89; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw i64 [[TMP0]], 490; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], [[TMP1]]91; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]92; CHECK:       vector.memcheck:93; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vscale.i64()94; CHECK-NEXT:    [[TMP3:%.*]] = shl i64 [[TMP2]], 795; CHECK-NEXT:    [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]96; CHECK-NEXT:    [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]97; CHECK-NEXT:    br i1 [[DIFF_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]98; CHECK:       vector.ph:99; CHECK-NEXT:    [[TMP7:%.*]] = call i64 @llvm.vscale.i64()100; CHECK-NEXT:    [[TMP8:%.*]] = shl nuw i64 [[TMP7]], 3101; CHECK-NEXT:    [[TMP9:%.*]] = shl i64 [[TMP7]], 4102; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], [[TMP9]]103; CHECK-NEXT:    [[N_VEC:%.*]] = sub nsw i64 [[N]], [[N_MOD_VF]]104; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]105; CHECK:       vector.body:106; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]107; CHECK-NEXT:    [[TMP10:%.*]] = xor i64 [[INDEX]], -1108; CHECK-NEXT:    [[TMP11:%.*]] = add i64 [[N]], [[TMP10]]109; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP11]]110; CHECK-NEXT:    [[TMP13:%.*]] = sub i64 1, [[TMP8]]111; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i64, ptr [[TMP12]], i64 [[TMP13]]112; CHECK-NEXT:    [[TMP15:%.*]] = sub i64 0, [[TMP8]]113; CHECK-NEXT:    [[TMP16:%.*]] = sub i64 1, [[TMP8]]114; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[TMP12]], i64 [[TMP15]]115; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr inbounds i64, ptr [[TMP17]], i64 [[TMP16]]116; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <vscale x 8 x i64>, ptr [[TMP14]], align 8117; CHECK-NEXT:    [[WIDE_LOAD3:%.*]] = load <vscale x 8 x i64>, ptr [[TMP18]], align 8118; CHECK-NEXT:    [[TMP19:%.*]] = add <vscale x 8 x i64> [[WIDE_LOAD]], splat (i64 1)119; CHECK-NEXT:    [[TMP20:%.*]] = add <vscale x 8 x i64> [[WIDE_LOAD3]], splat (i64 1)120; CHECK-NEXT:    [[TMP21:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP11]]121; CHECK-NEXT:    [[TMP22:%.*]] = sub i64 1, [[TMP8]]122; CHECK-NEXT:    [[TMP23:%.*]] = getelementptr inbounds i64, ptr [[TMP21]], i64 [[TMP22]]123; CHECK-NEXT:    [[TMP24:%.*]] = sub i64 0, [[TMP8]]124; CHECK-NEXT:    [[TMP25:%.*]] = sub i64 1, [[TMP8]]125; CHECK-NEXT:    [[TMP26:%.*]] = getelementptr inbounds i64, ptr [[TMP21]], i64 [[TMP24]]126; CHECK-NEXT:    [[TMP27:%.*]] = getelementptr inbounds i64, ptr [[TMP26]], i64 [[TMP25]]127; CHECK-NEXT:    store <vscale x 8 x i64> [[TMP19]], ptr [[TMP23]], align 8128; CHECK-NEXT:    store <vscale x 8 x i64> [[TMP20]], ptr [[TMP27]], align 8129; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP9]]130; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]131; CHECK-NEXT:    br i1 [[TMP28]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]132; CHECK:       middle.block:133; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N_MOD_VF]], 0134; CHECK-NEXT:    br i1 [[CMP_N]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[SCALAR_PH]]135; CHECK:       scalar.ph:136;137entry:138  %cmp8 = icmp sgt i64 %N, 0139  br i1 %cmp8, label %for.body, label %for.cond.cleanup140 141for.cond.cleanup:                                 ; preds = %for.body142  ret void143 144for.body:                                         ; preds = %entry, %for.body145  %i.09.in = phi i64 [ %i.09, %for.body ], [ %N, %entry ]146  %i.09 = add nsw i64 %i.09.in, -1147  %arrayidx = getelementptr inbounds i64, ptr %b, i64 %i.09148  %0 = load i64, ptr %arrayidx, align 8149  %add = add i64 %0, 1150  %arrayidx2 = getelementptr inbounds i64, ptr %a, i64 %i.09151  store i64 %add, ptr %arrayidx2, align 8152  %cmp = icmp sgt i64 %i.09.in, 1153  br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !0154}155 156attributes #0 = { "target-cpu"="generic" "target-features"="+neon,+sve" }157 158!0 = distinct !{!0, !1, !2, !3, !4, !5}159!1 = !{!"llvm.loop.mustprogress"}160!2 = !{!"llvm.loop.vectorize.width", i32 8}161!3 = !{!"llvm.loop.vectorize.scalable.enable", i1 true}162!4 = !{!"llvm.loop.vectorize.enable", i1 true}163!5 = !{!"llvm.loop.interleave.count", i32 2}164 165