| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes=loop-vectorize -mtriple=arm64-apple-ios -S -mcpu=cyclone -enable-interleaved-mem-accesses=false < %s | FileCheck %s |
| target 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-n32:64-S128" |
| |
| @kernel = global [512 x float] zeroinitializer, align 16 |
| @kernel2 = global [512 x float] zeroinitializer, align 16 |
| @kernel3 = global [512 x float] zeroinitializer, align 16 |
| @kernel4 = global [512 x float] zeroinitializer, align 16 |
| @src_data = global [1536 x float] zeroinitializer, align 16 |
| |
| ; The cost of gathers in the loop gets offset by the vector math. |
| |
| define float @_Z4testmm(i64 %size, i64 %offset) { |
| ; CHECK-LABEL: define float @_Z4testmm( |
| ; CHECK-SAME: i64 [[SIZE:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0:[0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[SIZE]], 4 |
| ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] |
| ; CHECK: [[VECTOR_PH]]: |
| ; CHECK-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ult i64 [[SIZE]], 16 |
| ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1]], label %[[VEC_EPILOG_PH:.*]], label %[[VECTOR_PH1:.*]] |
| ; CHECK: [[VECTOR_PH1]]: |
| ; CHECK-NEXT: [[N_MOD_VF:%.*]] = and i64 [[SIZE]], 15 |
| ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[SIZE]], [[N_MOD_VF]] |
| ; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] |
| ; CHECK: [[VECTOR_BODY]]: |
| ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH1]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP64:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI1:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP65:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI6:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP151:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI9:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP152:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI2:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP106:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI3:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP107:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI7:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP213:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI8:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP214:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI4:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP148:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI5:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP149:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI11:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP297:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[VEC_PHI12:%.*]] = phi <4 x float> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP298:%.*]], %[[VECTOR_BODY]] ] |
| ; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[INDEX]], 1 |
| ; CHECK-NEXT: [[TMP16:%.*]] = add i64 [[INDEX]], 2 |
| ; CHECK-NEXT: [[TMP24:%.*]] = add i64 [[INDEX]], 3 |
| ; CHECK-NEXT: [[TMP32:%.*]] = add i64 [[INDEX]], 4 |
| ; CHECK-NEXT: [[TMP48:%.*]] = add i64 [[INDEX]], 5 |
| ; CHECK-NEXT: [[TMP155:%.*]] = add i64 [[INDEX]], 6 |
| ; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[INDEX]], 7 |
| ; CHECK-NEXT: [[TMP153:%.*]] = add i64 [[INDEX]], 8 |
| ; CHECK-NEXT: [[TMP163:%.*]] = add i64 [[INDEX]], 9 |
| ; CHECK-NEXT: [[TMP164:%.*]] = add i64 [[INDEX]], 10 |
| ; CHECK-NEXT: [[TMP165:%.*]] = add i64 [[INDEX]], 11 |
| ; CHECK-NEXT: [[TMP166:%.*]] = add i64 [[INDEX]], 12 |
| ; CHECK-NEXT: [[TMP167:%.*]] = add i64 [[INDEX]], 13 |
| ; CHECK-NEXT: [[TMP168:%.*]] = add i64 [[INDEX]], 14 |
| ; CHECK-NEXT: [[TMP169:%.*]] = add i64 [[INDEX]], 15 |
| ; CHECK-NEXT: [[ADD:%.*]] = add i64 [[INDEX]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP9:%.*]] = add i64 [[TMP8]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[TMP16]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP24]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[TMP32]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP13:%.*]] = add i64 [[TMP48]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP14:%.*]] = add i64 [[TMP155]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP7]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP170:%.*]] = add i64 [[TMP153]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP171:%.*]] = add i64 [[TMP163]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP172:%.*]] = add i64 [[TMP164]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP173:%.*]] = add i64 [[TMP165]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP174:%.*]] = add i64 [[TMP166]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP175:%.*]] = add i64 [[TMP167]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP176:%.*]] = add i64 [[TMP168]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP177:%.*]] = add i64 [[TMP169]], [[OFFSET]] |
| ; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[ADD]], 3 |
| ; CHECK-NEXT: [[TMP17:%.*]] = mul i64 [[TMP9]], 3 |
| ; CHECK-NEXT: [[TMP18:%.*]] = mul i64 [[TMP10]], 3 |
| ; CHECK-NEXT: [[TMP19:%.*]] = mul i64 [[TMP11]], 3 |
| ; CHECK-NEXT: [[TMP20:%.*]] = mul i64 [[TMP12]], 3 |
| ; CHECK-NEXT: [[TMP21:%.*]] = mul i64 [[TMP13]], 3 |
| ; CHECK-NEXT: [[TMP22:%.*]] = mul i64 [[TMP14]], 3 |
| ; CHECK-NEXT: [[TMP23:%.*]] = mul i64 [[TMP15]], 3 |
| ; CHECK-NEXT: [[TMP178:%.*]] = mul i64 [[TMP170]], 3 |
| ; CHECK-NEXT: [[TMP195:%.*]] = mul i64 [[TMP171]], 3 |
| ; CHECK-NEXT: [[TMP196:%.*]] = mul i64 [[TMP172]], 3 |
| ; CHECK-NEXT: [[TMP199:%.*]] = mul i64 [[TMP173]], 3 |
| ; CHECK-NEXT: [[TMP200:%.*]] = mul i64 [[TMP174]], 3 |
| ; CHECK-NEXT: [[TMP203:%.*]] = mul i64 [[TMP175]], 3 |
| ; CHECK-NEXT: [[TMP204:%.*]] = mul i64 [[TMP176]], 3 |
| ; CHECK-NEXT: [[TMP207:%.*]] = mul i64 [[TMP177]], 3 |
| ; CHECK-NEXT: [[GEP_SRC_DATA:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[MUL]] |
| ; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP17]] |
| ; CHECK-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP18]] |
| ; CHECK-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP19]] |
| ; CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP20]] |
| ; CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP21]] |
| ; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP22]] |
| ; CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP23]] |
| ; CHECK-NEXT: [[TMP208:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP178]] |
| ; CHECK-NEXT: [[TMP211:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP195]] |
| ; CHECK-NEXT: [[TMP212:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP196]] |
| ; CHECK-NEXT: [[TMP215:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP199]] |
| ; CHECK-NEXT: [[TMP216:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP200]] |
| ; CHECK-NEXT: [[TMP217:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP203]] |
| ; CHECK-NEXT: [[TMP218:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP204]] |
| ; CHECK-NEXT: [[TMP219:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP207]] |
| ; CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[GEP_SRC_DATA]], align 4 |
| ; CHECK-NEXT: [[TMP33:%.*]] = load float, ptr [[TMP25]], align 4 |
| ; CHECK-NEXT: [[TMP34:%.*]] = load float, ptr [[TMP26]], align 4 |
| ; CHECK-NEXT: [[TMP35:%.*]] = load float, ptr [[TMP27]], align 4 |
| ; CHECK-NEXT: [[TMP36:%.*]] = insertelement <4 x float> poison, float [[TMP0]], i64 0 |
| ; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP36]], float [[TMP33]], i64 1 |
| ; CHECK-NEXT: [[TMP38:%.*]] = insertelement <4 x float> [[TMP37]], float [[TMP34]], i64 2 |
| ; CHECK-NEXT: [[TMP39:%.*]] = insertelement <4 x float> [[TMP38]], float [[TMP35]], i64 3 |
| ; CHECK-NEXT: [[TMP40:%.*]] = load float, ptr [[TMP28]], align 4 |
| ; CHECK-NEXT: [[TMP41:%.*]] = load float, ptr [[TMP29]], align 4 |
| ; CHECK-NEXT: [[TMP42:%.*]] = load float, ptr [[TMP30]], align 4 |
| ; CHECK-NEXT: [[TMP43:%.*]] = load float, ptr [[TMP31]], align 4 |
| ; CHECK-NEXT: [[TMP44:%.*]] = insertelement <4 x float> poison, float [[TMP40]], i64 0 |
| ; CHECK-NEXT: [[TMP45:%.*]] = insertelement <4 x float> [[TMP44]], float [[TMP41]], i64 1 |
| ; CHECK-NEXT: [[TMP46:%.*]] = insertelement <4 x float> [[TMP45]], float [[TMP42]], i64 2 |
| ; CHECK-NEXT: [[TMP47:%.*]] = insertelement <4 x float> [[TMP46]], float [[TMP43]], i64 3 |
| ; CHECK-NEXT: [[TMP220:%.*]] = load float, ptr [[TMP208]], align 4 |
| ; CHECK-NEXT: [[TMP221:%.*]] = load float, ptr [[TMP211]], align 4 |
| ; CHECK-NEXT: [[TMP222:%.*]] = load float, ptr [[TMP212]], align 4 |
| ; CHECK-NEXT: [[TMP231:%.*]] = load float, ptr [[TMP215]], align 4 |
| ; CHECK-NEXT: [[TMP232:%.*]] = insertelement <4 x float> poison, float [[TMP220]], i64 0 |
| ; CHECK-NEXT: [[TMP233:%.*]] = insertelement <4 x float> [[TMP232]], float [[TMP221]], i64 1 |
| ; CHECK-NEXT: [[TMP234:%.*]] = insertelement <4 x float> [[TMP233]], float [[TMP222]], i64 2 |
| ; CHECK-NEXT: [[TMP235:%.*]] = insertelement <4 x float> [[TMP234]], float [[TMP231]], i64 3 |
| ; CHECK-NEXT: [[TMP236:%.*]] = load float, ptr [[TMP216]], align 4 |
| ; CHECK-NEXT: [[TMP237:%.*]] = load float, ptr [[TMP217]], align 4 |
| ; CHECK-NEXT: [[TMP238:%.*]] = load float, ptr [[TMP218]], align 4 |
| ; CHECK-NEXT: [[TMP247:%.*]] = load float, ptr [[TMP219]], align 4 |
| ; CHECK-NEXT: [[TMP248:%.*]] = insertelement <4 x float> poison, float [[TMP236]], i64 0 |
| ; CHECK-NEXT: [[TMP249:%.*]] = insertelement <4 x float> [[TMP248]], float [[TMP237]], i64 1 |
| ; CHECK-NEXT: [[TMP250:%.*]] = insertelement <4 x float> [[TMP249]], float [[TMP238]], i64 2 |
| ; CHECK-NEXT: [[TMP251:%.*]] = insertelement <4 x float> [[TMP250]], float [[TMP247]], i64 3 |
| ; CHECK-NEXT: [[GEP_KERNEL:%.*]] = getelementptr inbounds [512 x float], ptr @kernel, i64 0, i64 [[INDEX]] |
| ; CHECK-NEXT: [[TMP49:%.*]] = getelementptr inbounds float, ptr [[GEP_KERNEL]], i64 4 |
| ; CHECK-NEXT: [[TMP252:%.*]] = getelementptr inbounds float, ptr [[GEP_KERNEL]], i64 8 |
| ; CHECK-NEXT: [[TMP253:%.*]] = getelementptr inbounds float, ptr [[GEP_KERNEL]], i64 12 |
| ; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[GEP_KERNEL]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD6:%.*]] = load <4 x float>, ptr [[TMP49]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD14:%.*]] = load <4 x float>, ptr [[TMP252]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD15:%.*]] = load <4 x float>, ptr [[TMP253]], align 4 |
| ; CHECK-NEXT: [[TMP50:%.*]] = fmul fast <4 x float> [[TMP39]], [[WIDE_LOAD]] |
| ; CHECK-NEXT: [[TMP51:%.*]] = fmul fast <4 x float> [[TMP47]], [[WIDE_LOAD6]] |
| ; CHECK-NEXT: [[TMP254:%.*]] = fmul fast <4 x float> [[TMP235]], [[WIDE_LOAD14]] |
| ; CHECK-NEXT: [[TMP255:%.*]] = fmul fast <4 x float> [[TMP251]], [[WIDE_LOAD15]] |
| ; CHECK-NEXT: [[TMP52:%.*]] = getelementptr inbounds [512 x float], ptr @kernel2, i64 0, i64 [[INDEX]] |
| ; CHECK-NEXT: [[TMP53:%.*]] = getelementptr inbounds float, ptr [[TMP52]], i64 4 |
| ; CHECK-NEXT: [[TMP256:%.*]] = getelementptr inbounds float, ptr [[TMP52]], i64 8 |
| ; CHECK-NEXT: [[TMP257:%.*]] = getelementptr inbounds float, ptr [[TMP52]], i64 12 |
| ; CHECK-NEXT: [[WIDE_LOAD7:%.*]] = load <4 x float>, ptr [[TMP52]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD8:%.*]] = load <4 x float>, ptr [[TMP53]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD18:%.*]] = load <4 x float>, ptr [[TMP256]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD19:%.*]] = load <4 x float>, ptr [[TMP257]], align 4 |
| ; CHECK-NEXT: [[TMP54:%.*]] = fmul fast <4 x float> [[TMP50]], [[WIDE_LOAD7]] |
| ; CHECK-NEXT: [[TMP55:%.*]] = fmul fast <4 x float> [[TMP51]], [[WIDE_LOAD8]] |
| ; CHECK-NEXT: [[TMP258:%.*]] = fmul fast <4 x float> [[TMP254]], [[WIDE_LOAD18]] |
| ; CHECK-NEXT: [[TMP259:%.*]] = fmul fast <4 x float> [[TMP255]], [[WIDE_LOAD19]] |
| ; CHECK-NEXT: [[TMP56:%.*]] = getelementptr inbounds [512 x float], ptr @kernel3, i64 0, i64 [[INDEX]] |
| ; CHECK-NEXT: [[TMP57:%.*]] = getelementptr inbounds float, ptr [[TMP56]], i64 4 |
| ; CHECK-NEXT: [[TMP260:%.*]] = getelementptr inbounds float, ptr [[TMP56]], i64 8 |
| ; CHECK-NEXT: [[TMP261:%.*]] = getelementptr inbounds float, ptr [[TMP56]], i64 12 |
| ; CHECK-NEXT: [[WIDE_LOAD9:%.*]] = load <4 x float>, ptr [[TMP56]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD10:%.*]] = load <4 x float>, ptr [[TMP57]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD22:%.*]] = load <4 x float>, ptr [[TMP260]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD23:%.*]] = load <4 x float>, ptr [[TMP261]], align 4 |
| ; CHECK-NEXT: [[TMP58:%.*]] = fmul fast <4 x float> [[TMP54]], [[WIDE_LOAD9]] |
| ; CHECK-NEXT: [[TMP59:%.*]] = fmul fast <4 x float> [[TMP55]], [[WIDE_LOAD10]] |
| ; CHECK-NEXT: [[TMP262:%.*]] = fmul fast <4 x float> [[TMP258]], [[WIDE_LOAD22]] |
| ; CHECK-NEXT: [[TMP279:%.*]] = fmul fast <4 x float> [[TMP259]], [[WIDE_LOAD23]] |
| ; CHECK-NEXT: [[TMP60:%.*]] = getelementptr inbounds [512 x float], ptr @kernel4, i64 0, i64 [[INDEX]] |
| ; CHECK-NEXT: [[TMP61:%.*]] = getelementptr inbounds float, ptr [[TMP60]], i64 4 |
| ; CHECK-NEXT: [[TMP280:%.*]] = getelementptr inbounds float, ptr [[TMP60]], i64 8 |
| ; CHECK-NEXT: [[TMP283:%.*]] = getelementptr inbounds float, ptr [[TMP60]], i64 12 |
| ; CHECK-NEXT: [[WIDE_LOAD11:%.*]] = load <4 x float>, ptr [[TMP60]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD12:%.*]] = load <4 x float>, ptr [[TMP61]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD26:%.*]] = load <4 x float>, ptr [[TMP280]], align 4 |
| ; CHECK-NEXT: [[WIDE_LOAD27:%.*]] = load <4 x float>, ptr [[TMP283]], align 4 |
| ; CHECK-NEXT: [[TMP62:%.*]] = fmul fast <4 x float> [[TMP58]], [[WIDE_LOAD11]] |
| ; CHECK-NEXT: [[TMP63:%.*]] = fmul fast <4 x float> [[TMP59]], [[WIDE_LOAD12]] |
| ; CHECK-NEXT: [[TMP284:%.*]] = fmul fast <4 x float> [[TMP262]], [[WIDE_LOAD26]] |
| ; CHECK-NEXT: [[TMP287:%.*]] = fmul fast <4 x float> [[TMP279]], [[WIDE_LOAD27]] |
| ; CHECK-NEXT: [[TMP64]] = fadd fast <4 x float> [[VEC_PHI]], [[TMP62]] |
| ; CHECK-NEXT: [[TMP65]] = fadd fast <4 x float> [[VEC_PHI1]], [[TMP63]] |
| ; CHECK-NEXT: [[TMP151]] = fadd fast <4 x float> [[VEC_PHI6]], [[TMP284]] |
| ; CHECK-NEXT: [[TMP152]] = fadd fast <4 x float> [[VEC_PHI9]], [[TMP287]] |
| ; CHECK-NEXT: [[TMP66:%.*]] = add i64 [[MUL]], 1 |
| ; CHECK-NEXT: [[TMP67:%.*]] = add i64 [[TMP17]], 1 |
| ; CHECK-NEXT: [[TMP68:%.*]] = add i64 [[TMP18]], 1 |
| ; CHECK-NEXT: [[TMP69:%.*]] = add i64 [[TMP19]], 1 |
| ; CHECK-NEXT: [[TMP70:%.*]] = add i64 [[TMP20]], 1 |
| ; CHECK-NEXT: [[TMP71:%.*]] = add i64 [[TMP21]], 1 |
| ; CHECK-NEXT: [[TMP72:%.*]] = add i64 [[TMP22]], 1 |
| ; CHECK-NEXT: [[TMP73:%.*]] = add i64 [[TMP23]], 1 |
| ; CHECK-NEXT: [[TMP288:%.*]] = add i64 [[TMP178]], 1 |
| ; CHECK-NEXT: [[TMP291:%.*]] = add i64 [[TMP195]], 1 |
| ; CHECK-NEXT: [[TMP292:%.*]] = add i64 [[TMP196]], 1 |
| ; CHECK-NEXT: [[TMP295:%.*]] = add i64 [[TMP199]], 1 |
| ; CHECK-NEXT: [[TMP296:%.*]] = add i64 [[TMP200]], 1 |
| ; CHECK-NEXT: [[TMP299:%.*]] = add i64 [[TMP203]], 1 |
| ; CHECK-NEXT: [[TMP309:%.*]] = add i64 [[TMP204]], 1 |
| ; CHECK-NEXT: [[TMP313:%.*]] = add i64 [[TMP207]], 1 |
| ; CHECK-NEXT: [[TMP74:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP66]] |
| ; CHECK-NEXT: [[TMP75:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP67]] |
| ; CHECK-NEXT: [[TMP76:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP68]] |
| ; CHECK-NEXT: [[TMP77:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP69]] |
| ; CHECK-NEXT: [[TMP78:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP70]] |
| ; CHECK-NEXT: [[TMP79:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP71]] |
| ; CHECK-NEXT: [[TMP80:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP72]] |
| ; CHECK-NEXT: [[TMP81:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP73]] |
| ; CHECK-NEXT: [[TMP317:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP288]] |
| ; CHECK-NEXT: [[TMP156:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP291]] |
| ; CHECK-NEXT: [[TMP157:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP292]] |
| ; CHECK-NEXT: [[TMP158:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP295]] |
| ; CHECK-NEXT: [[TMP159:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP296]] |
| ; CHECK-NEXT: [[TMP160:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP299]] |
| ; CHECK-NEXT: [[TMP161:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP309]] |
| ; CHECK-NEXT: [[TMP162:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP313]] |
| ; CHECK-NEXT: [[TMP82:%.*]] = load float, ptr [[TMP74]], align 4 |
| ; CHECK-NEXT: [[TMP83:%.*]] = load float, ptr [[TMP75]], align 4 |
| ; CHECK-NEXT: [[TMP84:%.*]] = load float, ptr [[TMP76]], align 4 |
| ; CHECK-NEXT: [[TMP85:%.*]] = load float, ptr [[TMP77]], align 4 |
| ; CHECK-NEXT: [[TMP86:%.*]] = insertelement <4 x float> poison, float [[TMP82]], i64 0 |
| ; CHECK-NEXT: [[TMP87:%.*]] = insertelement <4 x float> [[TMP86]], float [[TMP83]], i64 1 |
| ; CHECK-NEXT: [[TMP88:%.*]] = insertelement <4 x float> [[TMP87]], float [[TMP84]], i64 2 |
| ; CHECK-NEXT: [[TMP89:%.*]] = insertelement <4 x float> [[TMP88]], float [[TMP85]], i64 3 |
| ; CHECK-NEXT: [[TMP90:%.*]] = load float, ptr [[TMP78]], align 4 |
| ; CHECK-NEXT: [[TMP91:%.*]] = load float, ptr [[TMP79]], align 4 |
| ; CHECK-NEXT: [[TMP92:%.*]] = load float, ptr [[TMP80]], align 4 |
| ; CHECK-NEXT: [[TMP93:%.*]] = load float, ptr [[TMP81]], align 4 |
| ; CHECK-NEXT: [[TMP94:%.*]] = insertelement <4 x float> poison, float [[TMP90]], i64 0 |
| ; CHECK-NEXT: [[TMP95:%.*]] = insertelement <4 x float> [[TMP94]], float [[TMP91]], i64 1 |
| ; CHECK-NEXT: [[TMP96:%.*]] = insertelement <4 x float> [[TMP95]], float [[TMP92]], i64 2 |
| ; CHECK-NEXT: [[TMP97:%.*]] = insertelement <4 x float> [[TMP96]], float [[TMP93]], i64 3 |
| ; CHECK-NEXT: [[TMP179:%.*]] = load float, ptr [[TMP317]], align 4 |
| ; CHECK-NEXT: [[TMP180:%.*]] = load float, ptr [[TMP156]], align 4 |
| ; CHECK-NEXT: [[TMP181:%.*]] = load float, ptr [[TMP157]], align 4 |
| ; CHECK-NEXT: [[TMP182:%.*]] = load float, ptr [[TMP158]], align 4 |
| ; CHECK-NEXT: [[TMP183:%.*]] = insertelement <4 x float> poison, float [[TMP179]], i64 0 |
| ; CHECK-NEXT: [[TMP184:%.*]] = insertelement <4 x float> [[TMP183]], float [[TMP180]], i64 1 |
| ; CHECK-NEXT: [[TMP185:%.*]] = insertelement <4 x float> [[TMP184]], float [[TMP181]], i64 2 |
| ; CHECK-NEXT: [[TMP186:%.*]] = insertelement <4 x float> [[TMP185]], float [[TMP182]], i64 3 |
| ; CHECK-NEXT: [[TMP187:%.*]] = load float, ptr [[TMP159]], align 4 |
| ; CHECK-NEXT: [[TMP188:%.*]] = load float, ptr [[TMP160]], align 4 |
| ; CHECK-NEXT: [[TMP189:%.*]] = load float, ptr [[TMP161]], align 4 |
| ; CHECK-NEXT: [[TMP190:%.*]] = load float, ptr [[TMP162]], align 4 |
| ; CHECK-NEXT: [[TMP191:%.*]] = insertelement <4 x float> poison, float [[TMP187]], i64 0 |
| ; CHECK-NEXT: [[TMP192:%.*]] = insertelement <4 x float> [[TMP191]], float [[TMP188]], i64 1 |
| ; CHECK-NEXT: [[TMP193:%.*]] = insertelement <4 x float> [[TMP192]], float [[TMP189]], i64 2 |
| ; CHECK-NEXT: [[TMP194:%.*]] = insertelement <4 x float> [[TMP193]], float [[TMP190]], i64 3 |
| ; CHECK-NEXT: [[TMP98:%.*]] = fmul fast <4 x float> [[WIDE_LOAD]], [[TMP89]] |
| ; CHECK-NEXT: [[TMP99:%.*]] = fmul fast <4 x float> [[WIDE_LOAD6]], [[TMP97]] |
| ; CHECK-NEXT: [[TMP197:%.*]] = fmul fast <4 x float> [[WIDE_LOAD14]], [[TMP186]] |
| ; CHECK-NEXT: [[TMP198:%.*]] = fmul fast <4 x float> [[WIDE_LOAD15]], [[TMP194]] |
| ; CHECK-NEXT: [[TMP100:%.*]] = fmul fast <4 x float> [[WIDE_LOAD7]], [[TMP98]] |
| ; CHECK-NEXT: [[TMP101:%.*]] = fmul fast <4 x float> [[WIDE_LOAD8]], [[TMP99]] |
| ; CHECK-NEXT: [[TMP201:%.*]] = fmul fast <4 x float> [[WIDE_LOAD18]], [[TMP197]] |
| ; CHECK-NEXT: [[TMP202:%.*]] = fmul fast <4 x float> [[WIDE_LOAD19]], [[TMP198]] |
| ; CHECK-NEXT: [[TMP102:%.*]] = fmul fast <4 x float> [[WIDE_LOAD9]], [[TMP100]] |
| ; CHECK-NEXT: [[TMP103:%.*]] = fmul fast <4 x float> [[WIDE_LOAD10]], [[TMP101]] |
| ; CHECK-NEXT: [[TMP205:%.*]] = fmul fast <4 x float> [[WIDE_LOAD22]], [[TMP201]] |
| ; CHECK-NEXT: [[TMP206:%.*]] = fmul fast <4 x float> [[WIDE_LOAD23]], [[TMP202]] |
| ; CHECK-NEXT: [[TMP104:%.*]] = fmul fast <4 x float> [[WIDE_LOAD11]], [[TMP102]] |
| ; CHECK-NEXT: [[TMP105:%.*]] = fmul fast <4 x float> [[WIDE_LOAD12]], [[TMP103]] |
| ; CHECK-NEXT: [[TMP209:%.*]] = fmul fast <4 x float> [[WIDE_LOAD26]], [[TMP205]] |
| ; CHECK-NEXT: [[TMP210:%.*]] = fmul fast <4 x float> [[WIDE_LOAD27]], [[TMP206]] |
| ; CHECK-NEXT: [[TMP106]] = fadd fast <4 x float> [[VEC_PHI2]], [[TMP104]] |
| ; CHECK-NEXT: [[TMP107]] = fadd fast <4 x float> [[VEC_PHI3]], [[TMP105]] |
| ; CHECK-NEXT: [[TMP213]] = fadd fast <4 x float> [[VEC_PHI7]], [[TMP209]] |
| ; CHECK-NEXT: [[TMP214]] = fadd fast <4 x float> [[VEC_PHI8]], [[TMP210]] |
| ; CHECK-NEXT: [[TMP108:%.*]] = add i64 [[MUL]], 2 |
| ; CHECK-NEXT: [[TMP109:%.*]] = add i64 [[TMP17]], 2 |
| ; CHECK-NEXT: [[TMP110:%.*]] = add i64 [[TMP18]], 2 |
| ; CHECK-NEXT: [[TMP111:%.*]] = add i64 [[TMP19]], 2 |
| ; CHECK-NEXT: [[TMP112:%.*]] = add i64 [[TMP20]], 2 |
| ; CHECK-NEXT: [[TMP113:%.*]] = add i64 [[TMP21]], 2 |
| ; CHECK-NEXT: [[TMP114:%.*]] = add i64 [[TMP22]], 2 |
| ; CHECK-NEXT: [[TMP115:%.*]] = add i64 [[TMP23]], 2 |
| ; CHECK-NEXT: [[TMP223:%.*]] = add i64 [[TMP178]], 2 |
| ; CHECK-NEXT: [[TMP224:%.*]] = add i64 [[TMP195]], 2 |
| ; CHECK-NEXT: [[TMP225:%.*]] = add i64 [[TMP196]], 2 |
| ; CHECK-NEXT: [[TMP226:%.*]] = add i64 [[TMP199]], 2 |
| ; CHECK-NEXT: [[TMP227:%.*]] = add i64 [[TMP200]], 2 |
| ; CHECK-NEXT: [[TMP228:%.*]] = add i64 [[TMP203]], 2 |
| ; CHECK-NEXT: [[TMP229:%.*]] = add i64 [[TMP204]], 2 |
| ; CHECK-NEXT: [[TMP230:%.*]] = add i64 [[TMP207]], 2 |
| ; CHECK-NEXT: [[TMP116:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP108]] |
| ; CHECK-NEXT: [[TMP117:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP109]] |
| ; CHECK-NEXT: [[TMP118:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP110]] |
| ; CHECK-NEXT: [[TMP119:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP111]] |
| ; CHECK-NEXT: [[TMP120:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP112]] |
| ; CHECK-NEXT: [[TMP121:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP113]] |
| ; CHECK-NEXT: [[TMP122:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP114]] |
| ; CHECK-NEXT: [[TMP123:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP115]] |
| ; CHECK-NEXT: [[TMP239:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP223]] |
| ; CHECK-NEXT: [[TMP240:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP224]] |
| ; CHECK-NEXT: [[TMP241:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP225]] |
| ; CHECK-NEXT: [[TMP242:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP226]] |
| ; CHECK-NEXT: [[TMP243:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP227]] |
| ; CHECK-NEXT: [[TMP244:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP228]] |
| ; CHECK-NEXT: [[TMP245:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP229]] |
| ; CHECK-NEXT: [[TMP246:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP230]] |
| ; CHECK-NEXT: [[TMP124:%.*]] = load float, ptr [[TMP116]], align 4 |
| ; CHECK-NEXT: [[TMP125:%.*]] = load float, ptr [[TMP117]], align 4 |
| ; CHECK-NEXT: [[TMP126:%.*]] = load float, ptr [[TMP118]], align 4 |
| ; CHECK-NEXT: [[TMP127:%.*]] = load float, ptr [[TMP119]], align 4 |
| ; CHECK-NEXT: [[TMP128:%.*]] = insertelement <4 x float> poison, float [[TMP124]], i64 0 |
| ; CHECK-NEXT: [[TMP129:%.*]] = insertelement <4 x float> [[TMP128]], float [[TMP125]], i64 1 |
| ; CHECK-NEXT: [[TMP130:%.*]] = insertelement <4 x float> [[TMP129]], float [[TMP126]], i64 2 |
| ; CHECK-NEXT: [[TMP131:%.*]] = insertelement <4 x float> [[TMP130]], float [[TMP127]], i64 3 |
| ; CHECK-NEXT: [[TMP132:%.*]] = load float, ptr [[TMP120]], align 4 |
| ; CHECK-NEXT: [[TMP133:%.*]] = load float, ptr [[TMP121]], align 4 |
| ; CHECK-NEXT: [[TMP134:%.*]] = load float, ptr [[TMP122]], align 4 |
| ; CHECK-NEXT: [[TMP135:%.*]] = load float, ptr [[TMP123]], align 4 |
| ; CHECK-NEXT: [[TMP136:%.*]] = insertelement <4 x float> poison, float [[TMP132]], i64 0 |
| ; CHECK-NEXT: [[TMP137:%.*]] = insertelement <4 x float> [[TMP136]], float [[TMP133]], i64 1 |
| ; CHECK-NEXT: [[TMP138:%.*]] = insertelement <4 x float> [[TMP137]], float [[TMP134]], i64 2 |
| ; CHECK-NEXT: [[TMP139:%.*]] = insertelement <4 x float> [[TMP138]], float [[TMP135]], i64 3 |
| ; CHECK-NEXT: [[TMP263:%.*]] = load float, ptr [[TMP239]], align 4 |
| ; CHECK-NEXT: [[TMP264:%.*]] = load float, ptr [[TMP240]], align 4 |
| ; CHECK-NEXT: [[TMP265:%.*]] = load float, ptr [[TMP241]], align 4 |
| ; CHECK-NEXT: [[TMP266:%.*]] = load float, ptr [[TMP242]], align 4 |
| ; CHECK-NEXT: [[TMP267:%.*]] = insertelement <4 x float> poison, float [[TMP263]], i64 0 |
| ; CHECK-NEXT: [[TMP268:%.*]] = insertelement <4 x float> [[TMP267]], float [[TMP264]], i64 1 |
| ; CHECK-NEXT: [[TMP269:%.*]] = insertelement <4 x float> [[TMP268]], float [[TMP265]], i64 2 |
| ; CHECK-NEXT: [[TMP270:%.*]] = insertelement <4 x float> [[TMP269]], float [[TMP266]], i64 3 |
| ; CHECK-NEXT: [[TMP271:%.*]] = load float, ptr [[TMP243]], align 4 |
| ; CHECK-NEXT: [[TMP272:%.*]] = load float, ptr [[TMP244]], align 4 |
| ; CHECK-NEXT: [[TMP273:%.*]] = load float, ptr [[TMP245]], align 4 |
| ; CHECK-NEXT: [[TMP274:%.*]] = load float, ptr [[TMP246]], align 4 |
| ; CHECK-NEXT: [[TMP275:%.*]] = insertelement <4 x float> poison, float [[TMP271]], i64 0 |
| ; CHECK-NEXT: [[TMP276:%.*]] = insertelement <4 x float> [[TMP275]], float [[TMP272]], i64 1 |
| ; CHECK-NEXT: [[TMP277:%.*]] = insertelement <4 x float> [[TMP276]], float [[TMP273]], i64 2 |
| ; CHECK-NEXT: [[TMP278:%.*]] = insertelement <4 x float> [[TMP277]], float [[TMP274]], i64 3 |
| ; CHECK-NEXT: [[TMP140:%.*]] = fmul fast <4 x float> [[WIDE_LOAD]], [[TMP131]] |
| ; CHECK-NEXT: [[TMP141:%.*]] = fmul fast <4 x float> [[WIDE_LOAD6]], [[TMP139]] |
| ; CHECK-NEXT: [[TMP281:%.*]] = fmul fast <4 x float> [[WIDE_LOAD14]], [[TMP270]] |
| ; CHECK-NEXT: [[TMP282:%.*]] = fmul fast <4 x float> [[WIDE_LOAD15]], [[TMP278]] |
| ; CHECK-NEXT: [[TMP142:%.*]] = fmul fast <4 x float> [[WIDE_LOAD7]], [[TMP140]] |
| ; CHECK-NEXT: [[TMP143:%.*]] = fmul fast <4 x float> [[WIDE_LOAD8]], [[TMP141]] |
| ; CHECK-NEXT: [[TMP285:%.*]] = fmul fast <4 x float> [[WIDE_LOAD18]], [[TMP281]] |
| ; CHECK-NEXT: [[TMP286:%.*]] = fmul fast <4 x float> [[WIDE_LOAD19]], [[TMP282]] |
| ; CHECK-NEXT: [[TMP144:%.*]] = fmul fast <4 x float> [[WIDE_LOAD9]], [[TMP142]] |
| ; CHECK-NEXT: [[TMP145:%.*]] = fmul fast <4 x float> [[WIDE_LOAD10]], [[TMP143]] |
| ; CHECK-NEXT: [[TMP289:%.*]] = fmul fast <4 x float> [[WIDE_LOAD22]], [[TMP285]] |
| ; CHECK-NEXT: [[TMP290:%.*]] = fmul fast <4 x float> [[WIDE_LOAD23]], [[TMP286]] |
| ; CHECK-NEXT: [[TMP146:%.*]] = fmul fast <4 x float> [[WIDE_LOAD11]], [[TMP144]] |
| ; CHECK-NEXT: [[TMP147:%.*]] = fmul fast <4 x float> [[WIDE_LOAD12]], [[TMP145]] |
| ; CHECK-NEXT: [[TMP293:%.*]] = fmul fast <4 x float> [[WIDE_LOAD26]], [[TMP289]] |
| ; CHECK-NEXT: [[TMP294:%.*]] = fmul fast <4 x float> [[WIDE_LOAD27]], [[TMP290]] |
| ; CHECK-NEXT: [[TMP148]] = fadd fast <4 x float> [[VEC_PHI4]], [[TMP146]] |
| ; CHECK-NEXT: [[TMP149]] = fadd fast <4 x float> [[VEC_PHI5]], [[TMP147]] |
| ; CHECK-NEXT: [[TMP297]] = fadd fast <4 x float> [[VEC_PHI11]], [[TMP293]] |
| ; CHECK-NEXT: [[TMP298]] = fadd fast <4 x float> [[VEC_PHI12]], [[TMP294]] |
| ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16 |
| ; CHECK-NEXT: [[TMP150:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] |
| ; CHECK-NEXT: br i1 [[TMP150]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] |
| ; CHECK: [[MIDDLE_BLOCK]]: |
| ; CHECK-NEXT: [[BIN_RDX:%.*]] = fadd fast <4 x float> [[TMP65]], [[TMP64]] |
| ; CHECK-NEXT: [[BIN_RDX28:%.*]] = fadd fast <4 x float> [[TMP151]], [[BIN_RDX]] |
| ; CHECK-NEXT: [[BIN_RDX29:%.*]] = fadd fast <4 x float> [[TMP152]], [[BIN_RDX28]] |
| ; CHECK-NEXT: [[TMP300:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[BIN_RDX29]]) |
| ; CHECK-NEXT: [[BIN_RDX13:%.*]] = fadd fast <4 x float> [[TMP107]], [[TMP106]] |
| ; CHECK-NEXT: [[BIN_RDX31:%.*]] = fadd fast <4 x float> [[TMP213]], [[BIN_RDX13]] |
| ; CHECK-NEXT: [[BIN_RDX32:%.*]] = fadd fast <4 x float> [[TMP214]], [[BIN_RDX31]] |
| ; CHECK-NEXT: [[TMP301:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[BIN_RDX32]]) |
| ; CHECK-NEXT: [[BIN_RDX14:%.*]] = fadd fast <4 x float> [[TMP149]], [[TMP148]] |
| ; CHECK-NEXT: [[BIN_RDX34:%.*]] = fadd fast <4 x float> [[TMP297]], [[BIN_RDX14]] |
| ; CHECK-NEXT: [[BIN_RDX35:%.*]] = fadd fast <4 x float> [[TMP298]], [[BIN_RDX34]] |
| ; CHECK-NEXT: [[TMP302:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[BIN_RDX35]]) |
| ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[SIZE]], [[N_VEC]] |
| ; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[VEC_EPILOG_ITER_CHECK:.*]] |
| ; CHECK: [[VEC_EPILOG_ITER_CHECK]]: |
| ; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_MOD_VF]], 4 |
| ; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label %[[SCALAR_PH]], label %[[VEC_EPILOG_PH]], !prof [[PROF3:![0-9]+]] |
| ; CHECK: [[VEC_EPILOG_PH]]: |
| ; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[VECTOR_PH]] ] |
| ; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP300]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0.000000e+00, %[[VECTOR_PH]] ] |
| ; CHECK-NEXT: [[BC_MERGE_RDX36:%.*]] = phi float [ [[TMP301]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0.000000e+00, %[[VECTOR_PH]] ] |
| ; CHECK-NEXT: [[BC_MERGE_RDX37:%.*]] = phi float [ [[TMP302]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0.000000e+00, %[[VECTOR_PH]] ] |
| ; CHECK-NEXT: [[N_MOD_VF38:%.*]] = and i64 [[SIZE]], 3 |
| ; CHECK-NEXT: [[N_VEC39:%.*]] = sub i64 [[SIZE]], [[N_MOD_VF38]] |
| ; CHECK-NEXT: [[TMP303:%.*]] = insertelement <4 x float> zeroinitializer, float [[BC_MERGE_RDX]], i64 0 |
| ; CHECK-NEXT: [[TMP304:%.*]] = insertelement <4 x float> zeroinitializer, float [[BC_MERGE_RDX36]], i64 0 |
| ; CHECK-NEXT: [[TMP305:%.*]] = insertelement <4 x float> zeroinitializer, float [[BC_MERGE_RDX37]], i64 0 |
| ; CHECK-NEXT: br label %[[LOOP:.*]] |
| ; CHECK: [[LOOP]]: |
| ; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], %[[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT48:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[VEC_PHI41:%.*]] = phi <4 x float> [ [[TMP303]], %[[VEC_EPILOG_PH]] ], [ [[TMP337:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[VEC_PHI42:%.*]] = phi <4 x float> [ [[TMP304]], %[[VEC_EPILOG_PH]] ], [ [[TMP358:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[VEC_PHI43:%.*]] = phi <4 x float> [ [[TMP305]], %[[VEC_EPILOG_PH]] ], [ [[TMP379:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[TMP306:%.*]] = add i64 [[IV1]], 1 |
| ; CHECK-NEXT: [[TMP307:%.*]] = add i64 [[IV1]], 2 |
| ; CHECK-NEXT: [[TMP308:%.*]] = add i64 [[IV1]], 3 |
| ; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[IV1]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP310:%.*]] = add i64 [[TMP306]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP311:%.*]] = add i64 [[TMP307]], [[OFFSET]] |
| ; CHECK-NEXT: [[TMP312:%.*]] = add i64 [[TMP308]], [[OFFSET]] |
| ; CHECK-NEXT: [[MUL1:%.*]] = mul i64 [[ADD1]], 3 |
| ; CHECK-NEXT: [[TMP314:%.*]] = mul i64 [[TMP310]], 3 |
| ; CHECK-NEXT: [[TMP315:%.*]] = mul i64 [[TMP311]], 3 |
| ; CHECK-NEXT: [[TMP316:%.*]] = mul i64 [[TMP312]], 3 |
| ; CHECK-NEXT: [[GEP_SRC_DATA1:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[MUL1]] |
| ; CHECK-NEXT: [[TMP318:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP314]] |
| ; CHECK-NEXT: [[TMP319:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP315]] |
| ; CHECK-NEXT: [[TMP320:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP316]] |
| ; CHECK-NEXT: [[TMP321:%.*]] = load float, ptr [[GEP_SRC_DATA1]], align 4 |
| ; CHECK-NEXT: [[TMP322:%.*]] = load float, ptr [[TMP318]], align 4 |
| ; CHECK-NEXT: [[TMP323:%.*]] = load float, ptr [[TMP319]], align 4 |
| ; CHECK-NEXT: [[TMP324:%.*]] = load float, ptr [[TMP320]], align 4 |
| ; CHECK-NEXT: [[TMP325:%.*]] = insertelement <4 x float> poison, float [[TMP321]], i64 0 |
| ; CHECK-NEXT: [[TMP326:%.*]] = insertelement <4 x float> [[TMP325]], float [[TMP322]], i64 1 |
| ; CHECK-NEXT: [[TMP327:%.*]] = insertelement <4 x float> [[TMP326]], float [[TMP323]], i64 2 |
| ; CHECK-NEXT: [[TMP328:%.*]] = insertelement <4 x float> [[TMP327]], float [[TMP324]], i64 3 |
| ; CHECK-NEXT: [[GEP_KERNEL1:%.*]] = getelementptr inbounds [512 x float], ptr @kernel, i64 0, i64 [[IV1]] |
| ; CHECK-NEXT: [[WIDE_LOAD44:%.*]] = load <4 x float>, ptr [[GEP_KERNEL1]], align 4 |
| ; CHECK-NEXT: [[TMP330:%.*]] = fmul fast <4 x float> [[TMP328]], [[WIDE_LOAD44]] |
| ; CHECK-NEXT: [[TMP331:%.*]] = getelementptr inbounds [512 x float], ptr @kernel2, i64 0, i64 [[IV1]] |
| ; CHECK-NEXT: [[WIDE_LOAD45:%.*]] = load <4 x float>, ptr [[TMP331]], align 4 |
| ; CHECK-NEXT: [[TMP332:%.*]] = fmul fast <4 x float> [[TMP330]], [[WIDE_LOAD45]] |
| ; CHECK-NEXT: [[TMP333:%.*]] = getelementptr inbounds [512 x float], ptr @kernel3, i64 0, i64 [[IV1]] |
| ; CHECK-NEXT: [[WIDE_LOAD46:%.*]] = load <4 x float>, ptr [[TMP333]], align 4 |
| ; CHECK-NEXT: [[TMP334:%.*]] = fmul fast <4 x float> [[TMP332]], [[WIDE_LOAD46]] |
| ; CHECK-NEXT: [[TMP335:%.*]] = getelementptr inbounds [512 x float], ptr @kernel4, i64 0, i64 [[IV1]] |
| ; CHECK-NEXT: [[WIDE_LOAD47:%.*]] = load <4 x float>, ptr [[TMP335]], align 4 |
| ; CHECK-NEXT: [[TMP336:%.*]] = fmul fast <4 x float> [[TMP334]], [[WIDE_LOAD47]] |
| ; CHECK-NEXT: [[TMP337]] = fadd fast <4 x float> [[VEC_PHI41]], [[TMP336]] |
| ; CHECK-NEXT: [[TMP338:%.*]] = add i64 [[MUL1]], 1 |
| ; CHECK-NEXT: [[TMP339:%.*]] = add i64 [[TMP314]], 1 |
| ; CHECK-NEXT: [[TMP340:%.*]] = add i64 [[TMP315]], 1 |
| ; CHECK-NEXT: [[TMP341:%.*]] = add i64 [[TMP316]], 1 |
| ; CHECK-NEXT: [[TMP342:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP338]] |
| ; CHECK-NEXT: [[TMP343:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP339]] |
| ; CHECK-NEXT: [[TMP344:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP340]] |
| ; CHECK-NEXT: [[TMP345:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP341]] |
| ; CHECK-NEXT: [[TMP346:%.*]] = load float, ptr [[TMP342]], align 4 |
| ; CHECK-NEXT: [[TMP347:%.*]] = load float, ptr [[TMP343]], align 4 |
| ; CHECK-NEXT: [[TMP348:%.*]] = load float, ptr [[TMP344]], align 4 |
| ; CHECK-NEXT: [[TMP349:%.*]] = load float, ptr [[TMP345]], align 4 |
| ; CHECK-NEXT: [[TMP350:%.*]] = insertelement <4 x float> poison, float [[TMP346]], i64 0 |
| ; CHECK-NEXT: [[TMP351:%.*]] = insertelement <4 x float> [[TMP350]], float [[TMP347]], i64 1 |
| ; CHECK-NEXT: [[TMP352:%.*]] = insertelement <4 x float> [[TMP351]], float [[TMP348]], i64 2 |
| ; CHECK-NEXT: [[TMP353:%.*]] = insertelement <4 x float> [[TMP352]], float [[TMP349]], i64 3 |
| ; CHECK-NEXT: [[TMP354:%.*]] = fmul fast <4 x float> [[WIDE_LOAD44]], [[TMP353]] |
| ; CHECK-NEXT: [[TMP355:%.*]] = fmul fast <4 x float> [[WIDE_LOAD45]], [[TMP354]] |
| ; CHECK-NEXT: [[TMP356:%.*]] = fmul fast <4 x float> [[WIDE_LOAD46]], [[TMP355]] |
| ; CHECK-NEXT: [[TMP357:%.*]] = fmul fast <4 x float> [[WIDE_LOAD47]], [[TMP356]] |
| ; CHECK-NEXT: [[TMP358]] = fadd fast <4 x float> [[VEC_PHI42]], [[TMP357]] |
| ; CHECK-NEXT: [[TMP359:%.*]] = add i64 [[MUL1]], 2 |
| ; CHECK-NEXT: [[TMP360:%.*]] = add i64 [[TMP314]], 2 |
| ; CHECK-NEXT: [[TMP361:%.*]] = add i64 [[TMP315]], 2 |
| ; CHECK-NEXT: [[TMP362:%.*]] = add i64 [[TMP316]], 2 |
| ; CHECK-NEXT: [[TMP363:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP359]] |
| ; CHECK-NEXT: [[TMP364:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP360]] |
| ; CHECK-NEXT: [[TMP365:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP361]] |
| ; CHECK-NEXT: [[TMP366:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[TMP362]] |
| ; CHECK-NEXT: [[TMP367:%.*]] = load float, ptr [[TMP363]], align 4 |
| ; CHECK-NEXT: [[TMP368:%.*]] = load float, ptr [[TMP364]], align 4 |
| ; CHECK-NEXT: [[TMP369:%.*]] = load float, ptr [[TMP365]], align 4 |
| ; CHECK-NEXT: [[TMP370:%.*]] = load float, ptr [[TMP366]], align 4 |
| ; CHECK-NEXT: [[TMP371:%.*]] = insertelement <4 x float> poison, float [[TMP367]], i64 0 |
| ; CHECK-NEXT: [[TMP372:%.*]] = insertelement <4 x float> [[TMP371]], float [[TMP368]], i64 1 |
| ; CHECK-NEXT: [[TMP373:%.*]] = insertelement <4 x float> [[TMP372]], float [[TMP369]], i64 2 |
| ; CHECK-NEXT: [[TMP374:%.*]] = insertelement <4 x float> [[TMP373]], float [[TMP370]], i64 3 |
| ; CHECK-NEXT: [[TMP375:%.*]] = fmul fast <4 x float> [[WIDE_LOAD44]], [[TMP374]] |
| ; CHECK-NEXT: [[TMP376:%.*]] = fmul fast <4 x float> [[WIDE_LOAD45]], [[TMP375]] |
| ; CHECK-NEXT: [[TMP377:%.*]] = fmul fast <4 x float> [[WIDE_LOAD46]], [[TMP376]] |
| ; CHECK-NEXT: [[TMP378:%.*]] = fmul fast <4 x float> [[WIDE_LOAD47]], [[TMP377]] |
| ; CHECK-NEXT: [[TMP379]] = fadd fast <4 x float> [[VEC_PHI43]], [[TMP378]] |
| ; CHECK-NEXT: [[INDEX_NEXT48]] = add nuw i64 [[IV1]], 4 |
| ; CHECK-NEXT: [[TMP380:%.*]] = icmp eq i64 [[INDEX_NEXT48]], [[N_VEC39]] |
| ; CHECK-NEXT: br i1 [[TMP380]], label %[[VEC_EPILOG_MIDDLE_BLOCK:.*]], label %[[LOOP]], !llvm.loop [[LOOP4:![0-9]+]] |
| ; CHECK: [[VEC_EPILOG_MIDDLE_BLOCK]]: |
| ; CHECK-NEXT: [[TMP381:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[TMP337]]) |
| ; CHECK-NEXT: [[TMP382:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[TMP358]]) |
| ; CHECK-NEXT: [[TMP383:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[TMP379]]) |
| ; CHECK-NEXT: [[CMP_N49:%.*]] = icmp eq i64 [[SIZE]], [[N_VEC39]] |
| ; CHECK-NEXT: br i1 [[CMP_N49]], label %[[EXIT]], label %[[SCALAR_PH]] |
| ; CHECK: [[SCALAR_PH]]: |
| ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC39]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[ENTRY]] ] |
| ; CHECK-NEXT: [[BC_MERGE_RDX49:%.*]] = phi float [ [[TMP381]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[TMP300]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0.000000e+00, %[[ENTRY]] ] |
| ; CHECK-NEXT: [[BC_MERGE_RDX50:%.*]] = phi float [ [[TMP382]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[TMP301]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0.000000e+00, %[[ENTRY]] ] |
| ; CHECK-NEXT: [[BC_MERGE_RDX51:%.*]] = phi float [ [[TMP383]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[TMP302]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0.000000e+00, %[[ENTRY]] ] |
| ; CHECK-NEXT: br label %[[LOOP1:.*]] |
| ; CHECK: [[LOOP1]]: |
| ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP1]] ] |
| ; CHECK-NEXT: [[RDX_0:%.*]] = phi float [ [[BC_MERGE_RDX49]], %[[SCALAR_PH]] ], [ [[RDX_0_NEXT:%.*]], %[[LOOP1]] ] |
| ; CHECK-NEXT: [[RDX_1:%.*]] = phi float [ [[BC_MERGE_RDX50]], %[[SCALAR_PH]] ], [ [[RDX_1_NEXT:%.*]], %[[LOOP1]] ] |
| ; CHECK-NEXT: [[RED_2:%.*]] = phi float [ [[BC_MERGE_RDX51]], %[[SCALAR_PH]] ], [ [[RDX_2_NEXT:%.*]], %[[LOOP1]] ] |
| ; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[IV]], [[OFFSET]] |
| ; CHECK-NEXT: [[MUL2:%.*]] = mul i64 [[ADD2]], 3 |
| ; CHECK-NEXT: [[GEP_SRC_DATA2:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[MUL2]] |
| ; CHECK-NEXT: [[TMP154:%.*]] = load float, ptr [[GEP_SRC_DATA2]], align 4 |
| ; CHECK-NEXT: [[GEP_KERNEL5:%.*]] = getelementptr inbounds [512 x float], ptr @kernel, i64 0, i64 [[IV]] |
| ; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[GEP_KERNEL5]], align 4 |
| ; CHECK-NEXT: [[MUL3:%.*]] = fmul fast float [[TMP154]], [[TMP1]] |
| ; CHECK-NEXT: [[GEP_KERNEL2:%.*]] = getelementptr inbounds [512 x float], ptr @kernel2, i64 0, i64 [[IV]] |
| ; CHECK-NEXT: [[TMP2:%.*]] = load float, ptr [[GEP_KERNEL2]], align 4 |
| ; CHECK-NEXT: [[MUL5:%.*]] = fmul fast float [[MUL3]], [[TMP2]] |
| ; CHECK-NEXT: [[GEP_KERNEL3:%.*]] = getelementptr inbounds [512 x float], ptr @kernel3, i64 0, i64 [[IV]] |
| ; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[GEP_KERNEL3]], align 4 |
| ; CHECK-NEXT: [[MUL7:%.*]] = fmul fast float [[MUL5]], [[TMP3]] |
| ; CHECK-NEXT: [[GEP_KERNEL4:%.*]] = getelementptr inbounds [512 x float], ptr @kernel4, i64 0, i64 [[IV]] |
| ; CHECK-NEXT: [[TMP4:%.*]] = load float, ptr [[GEP_KERNEL4]], align 4 |
| ; CHECK-NEXT: [[MUL9:%.*]] = fmul fast float [[MUL7]], [[TMP4]] |
| ; CHECK-NEXT: [[RDX_0_NEXT]] = fadd fast float [[RDX_0]], [[MUL9]] |
| ; CHECK-NEXT: [[GEP_SRC_DATA_SUM:%.*]] = add i64 [[MUL2]], 1 |
| ; CHECK-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[GEP_SRC_DATA_SUM]] |
| ; CHECK-NEXT: [[TMP5:%.*]] = load float, ptr [[ARRAYIDX11]], align 4 |
| ; CHECK-NEXT: [[MUL13:%.*]] = fmul fast float [[TMP1]], [[TMP5]] |
| ; CHECK-NEXT: [[MUL15:%.*]] = fmul fast float [[TMP2]], [[MUL13]] |
| ; CHECK-NEXT: [[MUL17:%.*]] = fmul fast float [[TMP3]], [[MUL15]] |
| ; CHECK-NEXT: [[MUL19:%.*]] = fmul fast float [[TMP4]], [[MUL17]] |
| ; CHECK-NEXT: [[RDX_1_NEXT]] = fadd fast float [[RDX_1]], [[MUL19]] |
| ; CHECK-NEXT: [[GEP_SRC_DATA_SUM52:%.*]] = add i64 [[MUL2]], 2 |
| ; CHECK-NEXT: [[ARRAYIDX21:%.*]] = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 [[GEP_SRC_DATA_SUM52]] |
| ; CHECK-NEXT: [[TMP6:%.*]] = load float, ptr [[ARRAYIDX21]], align 4 |
| ; CHECK-NEXT: [[MUL23:%.*]] = fmul fast float [[TMP1]], [[TMP6]] |
| ; CHECK-NEXT: [[MUL25:%.*]] = fmul fast float [[TMP2]], [[MUL23]] |
| ; CHECK-NEXT: [[MUL27:%.*]] = fmul fast float [[TMP3]], [[MUL25]] |
| ; CHECK-NEXT: [[MUL29:%.*]] = fmul fast float [[TMP4]], [[MUL27]] |
| ; CHECK-NEXT: [[RDX_2_NEXT]] = fadd fast float [[RED_2]], [[MUL29]] |
| ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1 |
| ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[SIZE]] |
| ; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP1]], label %[[EXIT]], !llvm.loop [[LOOP5:![0-9]+]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: [[RDX_0_NEXT_LCSSA:%.*]] = phi float [ [[RDX_0_NEXT]], %[[LOOP1]] ], [ [[TMP300]], %[[MIDDLE_BLOCK]] ], [ [[TMP381]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ] |
| ; CHECK-NEXT: [[RDX_1_NEXT_LCSSA:%.*]] = phi float [ [[RDX_1_NEXT]], %[[LOOP1]] ], [ [[TMP301]], %[[MIDDLE_BLOCK]] ], [ [[TMP382]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ] |
| ; CHECK-NEXT: [[RDX_2_NEXT_LCSSA:%.*]] = phi float [ [[RDX_2_NEXT]], %[[LOOP1]] ], [ [[TMP302]], %[[MIDDLE_BLOCK]] ], [ [[TMP383]], %[[VEC_EPILOG_MIDDLE_BLOCK]] ] |
| ; CHECK-NEXT: [[RES_0:%.*]] = fadd float [[RDX_0_NEXT_LCSSA]], [[RDX_1_NEXT_LCSSA]] |
| ; CHECK-NEXT: [[RES_1:%.*]] = fadd float [[RES_0]], [[RDX_2_NEXT_LCSSA]] |
| ; CHECK-NEXT: ret float [[RES_1]] |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] |
| %rdx.0 = phi float [ 0.000000e+00, %entry ], [ %rdx.0.next, %loop ] |
| %rdx.1 = phi float [ 0.000000e+00, %entry ], [ %rdx.1.next, %loop ] |
| %red.2 = phi float [ 0.000000e+00, %entry ], [ %rdx.2.next, %loop ] |
| %add = add i64 %iv, %offset |
| %mul = mul i64 %add, 3 |
| %gep.src_data = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 %mul |
| %0 = load float, ptr %gep.src_data, align 4 |
| %gep.kernel = getelementptr inbounds [512 x float], ptr @kernel, i64 0, i64 %iv |
| %1 = load float, ptr %gep.kernel, align 4 |
| %mul3 = fmul fast float %0, %1 |
| %gep.kernel2 = getelementptr inbounds [512 x float], ptr @kernel2, i64 0, i64 %iv |
| %2 = load float, ptr %gep.kernel2, align 4 |
| %mul5 = fmul fast float %mul3, %2 |
| %gep.kernel3 = getelementptr inbounds [512 x float], ptr @kernel3, i64 0, i64 %iv |
| %3 = load float, ptr %gep.kernel3, align 4 |
| %mul7 = fmul fast float %mul5, %3 |
| %gep.kernel4 = getelementptr inbounds [512 x float], ptr @kernel4, i64 0, i64 %iv |
| %4 = load float, ptr %gep.kernel4, align 4 |
| %mul9 = fmul fast float %mul7, %4 |
| %rdx.0.next = fadd fast float %rdx.0, %mul9 |
| %gep.src_data.sum = add i64 %mul, 1 |
| %arrayidx11 = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 %gep.src_data.sum |
| %5 = load float, ptr %arrayidx11, align 4 |
| %mul13 = fmul fast float %1, %5 |
| %mul15 = fmul fast float %2, %mul13 |
| %mul17 = fmul fast float %3, %mul15 |
| %mul19 = fmul fast float %4, %mul17 |
| %rdx.1.next = fadd fast float %rdx.1, %mul19 |
| %gep.src_data.sum52 = add i64 %mul, 2 |
| %arrayidx21 = getelementptr inbounds [1536 x float], ptr @src_data, i64 0, i64 %gep.src_data.sum52 |
| %6 = load float, ptr %arrayidx21, align 4 |
| %mul23 = fmul fast float %1, %6 |
| %mul25 = fmul fast float %2, %mul23 |
| %mul27 = fmul fast float %3, %mul25 |
| %mul29 = fmul fast float %4, %mul27 |
| %rdx.2.next = fadd fast float %red.2, %mul29 |
| %iv.next = add i64 %iv, 1 |
| %exitcond = icmp ne i64 %iv.next, %size |
| br i1 %exitcond, label %loop, label %exit |
| |
| exit: |
| %res.0 = fadd float %rdx.0.next, %rdx.1.next |
| %res.1 = fadd float %res.0, %rdx.2.next |
| ret float %res.1 |
| } |
| ;. |
| ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]} |
| ; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1} |
| ; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"} |
| ; CHECK: [[PROF3]] = !{!"branch_weights", i32 4, i32 12} |
| ; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]} |
| ; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]} |
| ;. |