270 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -O3 < %s | FileCheck %s3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"5target triple = "aarch64"6 7; This function (a more complex reduction of (a[i] - b[i]) * itself) should be vectorized successfully.8 9define dso_local noundef nofpclass(nan inf) float @_Z4testPKfS0_ii(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3) {10; CHECK-LABEL: define dso_local noundef nofpclass(nan inf) float @_Z4testPKfS0_ii11; CHECK-SAME: (ptr noundef readonly captures(none) [[TMP0:%.*]], ptr noundef readonly captures(none) [[TMP1:%.*]], i32 noundef [[TMP2:%.*]], i32 noundef [[TMP3:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {12; CHECK-NEXT: .preheader.i:13; CHECK-NEXT: [[TMP4:%.*]] = sext i32 [[TMP3]] to i6414; CHECK-NEXT: [[TMP5:%.*]] = sext i32 [[TMP2]] to i6415; CHECK-NEXT: [[TMP6:%.*]] = load <20 x float>, ptr [[TMP0]], align 4, !tbaa [[TBAA4:![0-9]+]]16; CHECK-NEXT: [[TMP7:%.*]] = load <20 x float>, ptr [[TMP1]], align 4, !tbaa [[TBAA4]]17; CHECK-NEXT: [[TMP8:%.*]] = fsub fast <20 x float> [[TMP6]], [[TMP7]]18; CHECK-NEXT: [[TMP9:%.*]] = fmul fast <20 x float> [[TMP8]], [[TMP8]]19; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0]], i64 8020; CHECK-NEXT: [[TMP11:%.*]] = load float, ptr [[TMP10]], align 4, !tbaa [[TBAA4]]21; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP1]], i64 8022; CHECK-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP12]], align 4, !tbaa [[TBAA4]]23; CHECK-NEXT: [[TMP14:%.*]] = fsub fast float [[TMP11]], [[TMP13]]24; CHECK-NEXT: [[TMP15:%.*]] = fmul fast float [[TMP14]], [[TMP14]]25; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds float, ptr [[TMP0]], i64 [[TMP5]]26; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i64 [[TMP4]]27; CHECK-NEXT: [[OP_RDX:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP15]], <20 x float> [[TMP9]])28; CHECK-NEXT: [[TMP18:%.*]] = load <20 x float>, ptr [[TMP16]], align 4, !tbaa [[TBAA4]]29; CHECK-NEXT: [[TMP19:%.*]] = load <20 x float>, ptr [[TMP17]], align 4, !tbaa [[TBAA4]]30; CHECK-NEXT: [[TMP20:%.*]] = fsub fast <20 x float> [[TMP18]], [[TMP19]]31; CHECK-NEXT: [[TMP21:%.*]] = fmul fast <20 x float> [[TMP20]], [[TMP20]]32; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP16]], i64 8033; CHECK-NEXT: [[TMP23:%.*]] = load float, ptr [[TMP22]], align 4, !tbaa [[TBAA4]]34; CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP17]], i64 8035; CHECK-NEXT: [[TMP25:%.*]] = load float, ptr [[TMP24]], align 4, !tbaa [[TBAA4]]36; CHECK-NEXT: [[TMP26:%.*]] = fsub fast float [[TMP23]], [[TMP25]]37; CHECK-NEXT: [[TMP27:%.*]] = fmul fast float [[TMP26]], [[TMP26]]38; CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds float, ptr [[TMP16]], i64 [[TMP5]]39; CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds float, ptr [[TMP17]], i64 [[TMP4]]40; CHECK-NEXT: [[OP_RDX_1:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP27]], <20 x float> [[TMP21]])41; CHECK-NEXT: [[OP_RDX3_1:%.*]] = fadd fast float [[OP_RDX_1]], [[OP_RDX]]42; CHECK-NEXT: [[TMP30:%.*]] = load <20 x float>, ptr [[TMP28]], align 4, !tbaa [[TBAA4]]43; CHECK-NEXT: [[TMP31:%.*]] = load <20 x float>, ptr [[TMP29]], align 4, !tbaa [[TBAA4]]44; CHECK-NEXT: [[TMP32:%.*]] = fsub fast <20 x float> [[TMP30]], [[TMP31]]45; CHECK-NEXT: [[TMP33:%.*]] = fmul fast <20 x float> [[TMP32]], [[TMP32]]46; CHECK-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP28]], i64 8047; CHECK-NEXT: [[TMP35:%.*]] = load float, ptr [[TMP34]], align 4, !tbaa [[TBAA4]]48; CHECK-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP29]], i64 8049; CHECK-NEXT: [[TMP37:%.*]] = load float, ptr [[TMP36]], align 4, !tbaa [[TBAA4]]50; CHECK-NEXT: [[TMP38:%.*]] = fsub fast float [[TMP35]], [[TMP37]]51; CHECK-NEXT: [[TMP39:%.*]] = fmul fast float [[TMP38]], [[TMP38]]52; CHECK-NEXT: [[TMP40:%.*]] = getelementptr inbounds float, ptr [[TMP28]], i64 [[TMP5]]53; CHECK-NEXT: [[TMP41:%.*]] = getelementptr inbounds float, ptr [[TMP29]], i64 [[TMP4]]54; CHECK-NEXT: [[OP_RDX_2:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP39]], <20 x float> [[TMP33]])55; CHECK-NEXT: [[OP_RDX3_2:%.*]] = fadd fast float [[OP_RDX_2]], [[OP_RDX3_1]]56; CHECK-NEXT: [[TMP42:%.*]] = load <20 x float>, ptr [[TMP40]], align 4, !tbaa [[TBAA4]]57; CHECK-NEXT: [[TMP43:%.*]] = load <20 x float>, ptr [[TMP41]], align 4, !tbaa [[TBAA4]]58; CHECK-NEXT: [[TMP44:%.*]] = fsub fast <20 x float> [[TMP42]], [[TMP43]]59; CHECK-NEXT: [[TMP45:%.*]] = fmul fast <20 x float> [[TMP44]], [[TMP44]]60; CHECK-NEXT: [[TMP46:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP40]], i64 8061; CHECK-NEXT: [[TMP47:%.*]] = load float, ptr [[TMP46]], align 4, !tbaa [[TBAA4]]62; CHECK-NEXT: [[TMP48:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP41]], i64 8063; CHECK-NEXT: [[TMP49:%.*]] = load float, ptr [[TMP48]], align 4, !tbaa [[TBAA4]]64; CHECK-NEXT: [[TMP50:%.*]] = fsub fast float [[TMP47]], [[TMP49]]65; CHECK-NEXT: [[TMP51:%.*]] = fmul fast float [[TMP50]], [[TMP50]]66; CHECK-NEXT: [[TMP52:%.*]] = getelementptr inbounds float, ptr [[TMP40]], i64 [[TMP5]]67; CHECK-NEXT: [[TMP53:%.*]] = getelementptr inbounds float, ptr [[TMP41]], i64 [[TMP4]]68; CHECK-NEXT: [[OP_RDX_3:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP51]], <20 x float> [[TMP45]])69; CHECK-NEXT: [[OP_RDX3_3:%.*]] = fadd fast float [[OP_RDX_3]], [[OP_RDX3_2]]70; CHECK-NEXT: [[TMP54:%.*]] = load <20 x float>, ptr [[TMP52]], align 4, !tbaa [[TBAA4]]71; CHECK-NEXT: [[TMP55:%.*]] = load <20 x float>, ptr [[TMP53]], align 4, !tbaa [[TBAA4]]72; CHECK-NEXT: [[TMP56:%.*]] = fsub fast <20 x float> [[TMP54]], [[TMP55]]73; CHECK-NEXT: [[TMP57:%.*]] = fmul fast <20 x float> [[TMP56]], [[TMP56]]74; CHECK-NEXT: [[TMP58:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP52]], i64 8075; CHECK-NEXT: [[TMP59:%.*]] = load float, ptr [[TMP58]], align 4, !tbaa [[TBAA4]]76; CHECK-NEXT: [[TMP60:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP53]], i64 8077; CHECK-NEXT: [[TMP61:%.*]] = load float, ptr [[TMP60]], align 4, !tbaa [[TBAA4]]78; CHECK-NEXT: [[TMP62:%.*]] = fsub fast float [[TMP59]], [[TMP61]]79; CHECK-NEXT: [[TMP63:%.*]] = fmul fast float [[TMP62]], [[TMP62]]80; CHECK-NEXT: [[TMP64:%.*]] = getelementptr inbounds float, ptr [[TMP52]], i64 [[TMP5]]81; CHECK-NEXT: [[TMP65:%.*]] = getelementptr inbounds float, ptr [[TMP53]], i64 [[TMP4]]82; CHECK-NEXT: [[OP_RDX_4:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP63]], <20 x float> [[TMP57]])83; CHECK-NEXT: [[OP_RDX3_4:%.*]] = fadd fast float [[OP_RDX_4]], [[OP_RDX3_3]]84; CHECK-NEXT: [[TMP66:%.*]] = load <20 x float>, ptr [[TMP64]], align 4, !tbaa [[TBAA4]]85; CHECK-NEXT: [[TMP67:%.*]] = load <20 x float>, ptr [[TMP65]], align 4, !tbaa [[TBAA4]]86; CHECK-NEXT: [[TMP68:%.*]] = fsub fast <20 x float> [[TMP66]], [[TMP67]]87; CHECK-NEXT: [[TMP69:%.*]] = fmul fast <20 x float> [[TMP68]], [[TMP68]]88; CHECK-NEXT: [[TMP70:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP64]], i64 8089; CHECK-NEXT: [[TMP71:%.*]] = load float, ptr [[TMP70]], align 4, !tbaa [[TBAA4]]90; CHECK-NEXT: [[TMP72:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP65]], i64 8091; CHECK-NEXT: [[TMP73:%.*]] = load float, ptr [[TMP72]], align 4, !tbaa [[TBAA4]]92; CHECK-NEXT: [[TMP74:%.*]] = fsub fast float [[TMP71]], [[TMP73]]93; CHECK-NEXT: [[TMP75:%.*]] = fmul fast float [[TMP74]], [[TMP74]]94; CHECK-NEXT: [[TMP76:%.*]] = getelementptr inbounds float, ptr [[TMP64]], i64 [[TMP5]]95; CHECK-NEXT: [[TMP77:%.*]] = getelementptr inbounds float, ptr [[TMP65]], i64 [[TMP4]]96; CHECK-NEXT: [[OP_RDX_5:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP75]], <20 x float> [[TMP69]])97; CHECK-NEXT: [[OP_RDX3_5:%.*]] = fadd fast float [[OP_RDX_5]], [[OP_RDX3_4]]98; CHECK-NEXT: [[TMP78:%.*]] = load <20 x float>, ptr [[TMP76]], align 4, !tbaa [[TBAA4]]99; CHECK-NEXT: [[TMP79:%.*]] = load <20 x float>, ptr [[TMP77]], align 4, !tbaa [[TBAA4]]100; CHECK-NEXT: [[TMP80:%.*]] = fsub fast <20 x float> [[TMP78]], [[TMP79]]101; CHECK-NEXT: [[TMP81:%.*]] = fmul fast <20 x float> [[TMP80]], [[TMP80]]102; CHECK-NEXT: [[TMP82:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP76]], i64 80103; CHECK-NEXT: [[TMP83:%.*]] = load float, ptr [[TMP82]], align 4, !tbaa [[TBAA4]]104; CHECK-NEXT: [[TMP84:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP77]], i64 80105; CHECK-NEXT: [[TMP85:%.*]] = load float, ptr [[TMP84]], align 4, !tbaa [[TBAA4]]106; CHECK-NEXT: [[TMP86:%.*]] = fsub fast float [[TMP83]], [[TMP85]]107; CHECK-NEXT: [[TMP87:%.*]] = fmul fast float [[TMP86]], [[TMP86]]108; CHECK-NEXT: [[OP_RDX_6:%.*]] = tail call fast float @llvm.vector.reduce.fadd.v20f32(float [[TMP87]], <20 x float> [[TMP81]])109; CHECK-NEXT: [[OP_RDX3_6:%.*]] = fadd fast float [[OP_RDX_6]], [[OP_RDX3_5]]110; CHECK-NEXT: ret float [[OP_RDX3_6]]111;112 %5 = alloca ptr, align 8113 %6 = alloca ptr, align 8114 %7 = alloca i32, align 4115 %8 = alloca i32, align 4116 store ptr %0, ptr %5, align 8, !tbaa !4117 store ptr %1, ptr %6, align 8, !tbaa !4118 store i32 %2, ptr %7, align 4, !tbaa !9119 store i32 %3, ptr %8, align 4, !tbaa !9120 %9 = load ptr, ptr %5, align 8, !tbaa !4121 %10 = load ptr, ptr %6, align 8, !tbaa !4122 %11 = load i32, ptr %7, align 4, !tbaa !9123 %12 = load i32, ptr %8, align 4, !tbaa !9124 %13 = call fast noundef nofpclass(nan inf) float @_ZL6reduceILi7EEfPKfS1_ii(ptr noundef %9, ptr noundef %10, i32 noundef %11, i32 noundef %12)125 ret float %13126}127 128define internal noundef nofpclass(nan inf) float @_ZL6reduceILi7EEfPKfS1_ii(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3) {129 %5 = alloca ptr, align 8130 %6 = alloca ptr, align 8131 %7 = alloca i32, align 4132 %8 = alloca i32, align 4133 %9 = alloca i32, align 4134 %10 = alloca i32, align 4135 %11 = alloca i32, align 4136 %12 = alloca float, align 4137 %13 = alloca i32, align 4138 %14 = alloca i32, align 4139 %15 = alloca float, align 4140 %16 = alloca i32, align 4141 %17 = alloca float, align 4142 store ptr %0, ptr %5, align 8, !tbaa !4143 store ptr %1, ptr %6, align 8, !tbaa !4144 store i32 %2, ptr %7, align 4, !tbaa !9145 store i32 %3, ptr %8, align 4, !tbaa !9146 call void @llvm.lifetime.start.p0(ptr %9)147 store i32 3, ptr %9, align 4, !tbaa !9148 call void @llvm.lifetime.start.p0(ptr %10)149 store i32 3, ptr %10, align 4, !tbaa !9150 call void @llvm.lifetime.start.p0(ptr %11)151 store i32 7, ptr %11, align 4, !tbaa !9152 call void @llvm.lifetime.start.p0(ptr %12)153 store float 0.000000e+00, ptr %12, align 4, !tbaa !11154 call void @llvm.lifetime.start.p0(ptr %13)155 store i32 0, ptr %13, align 4, !tbaa !9156 br label %18157 15818: ; preds = %59, %4159 %19 = load i32, ptr %13, align 4, !tbaa !9160 %20 = icmp slt i32 %19, 7161 br i1 %20, label %22, label %21162 16321: ; preds = %18164 store i32 2, ptr %14, align 4165 call void @llvm.lifetime.end.p0(ptr %13)166 br label %62167 16822: ; preds = %18169 call void @llvm.lifetime.start.p0(ptr %15)170 store float 0.000000e+00, ptr %15, align 4, !tbaa !11171 call void @llvm.lifetime.start.p0(ptr %16)172 store i32 0, ptr %16, align 4, !tbaa !9173 br label %23174 17523: ; preds = %44, %22176 %24 = load i32, ptr %16, align 4, !tbaa !9177 %25 = icmp slt i32 %24, 21178 br i1 %25, label %27, label %26179 18026: ; preds = %23181 store i32 5, ptr %14, align 4182 call void @llvm.lifetime.end.p0(ptr %16)183 br label %47184 18527: ; preds = %23186 call void @llvm.lifetime.start.p0(ptr %17)187 %28 = load ptr, ptr %5, align 8, !tbaa !4188 %29 = load i32, ptr %16, align 4, !tbaa !9189 %30 = sext i32 %29 to i64190 %31 = getelementptr inbounds float, ptr %28, i64 %30191 %32 = load float, ptr %31, align 4, !tbaa !11192 %33 = load ptr, ptr %6, align 8, !tbaa !4193 %34 = load i32, ptr %16, align 4, !tbaa !9194 %35 = sext i32 %34 to i64195 %36 = getelementptr inbounds float, ptr %33, i64 %35196 %37 = load float, ptr %36, align 4, !tbaa !11197 %38 = fsub fast float %32, %37198 store float %38, ptr %17, align 4, !tbaa !11199 %39 = load float, ptr %17, align 4, !tbaa !11200 %40 = load float, ptr %17, align 4, !tbaa !11201 %41 = fmul fast float %39, %40202 %42 = load float, ptr %15, align 4, !tbaa !11203 %43 = fadd fast float %42, %41204 store float %43, ptr %15, align 4, !tbaa !11205 call void @llvm.lifetime.end.p0(ptr %17)206 br label %44207 20844: ; preds = %27209 %45 = load i32, ptr %16, align 4, !tbaa !9210 %46 = add nsw i32 %45, 1211 store i32 %46, ptr %16, align 4, !tbaa !9212 br label %23, !llvm.loop !13213 21447: ; preds = %26215 %48 = load i32, ptr %7, align 4, !tbaa !9216 %49 = load ptr, ptr %5, align 8, !tbaa !4217 %50 = sext i32 %48 to i64218 %51 = getelementptr inbounds float, ptr %49, i64 %50219 store ptr %51, ptr %5, align 8, !tbaa !4220 %52 = load i32, ptr %8, align 4, !tbaa !9221 %53 = load ptr, ptr %6, align 8, !tbaa !4222 %54 = sext i32 %52 to i64223 %55 = getelementptr inbounds float, ptr %53, i64 %54224 store ptr %55, ptr %6, align 8, !tbaa !4225 %56 = load float, ptr %15, align 4, !tbaa !11226 %57 = load float, ptr %12, align 4, !tbaa !11227 %58 = fadd fast float %57, %56228 store float %58, ptr %12, align 4, !tbaa !11229 call void @llvm.lifetime.end.p0(ptr %15)230 br label %59231 23259: ; preds = %47233 %60 = load i32, ptr %13, align 4, !tbaa !9234 %61 = add nsw i32 %60, 1235 store i32 %61, ptr %13, align 4, !tbaa !9236 br label %18, !llvm.loop !15237 23862: ; preds = %21239 %63 = load float, ptr %12, align 4, !tbaa !11240 store i32 1, ptr %14, align 4241 call void @llvm.lifetime.end.p0(ptr %12)242 call void @llvm.lifetime.end.p0(ptr %11)243 call void @llvm.lifetime.end.p0(ptr %10)244 call void @llvm.lifetime.end.p0(ptr %9)245 ret float %63246}247 248declare void @llvm.lifetime.start.p0(ptr captures(none))249declare void @llvm.lifetime.end.p0(ptr captures(none))250 251!llvm.module.flags = !{!0, !1, !2}252!llvm.ident = !{!3}253 254!0 = !{i32 1, !"wchar_size", i32 4}255!1 = !{i32 7, !"uwtable", i32 2}256!2 = !{i32 7, !"frame-pointer", i32 1}257!3 = !{!"clang version 22.0.0git"}258!4 = !{!5, !5, i64 0}259!5 = !{!"p1 float", !6, i64 0}260!6 = !{!"any pointer", !7, i64 0}261!7 = !{!"omnipotent char", !8, i64 0}262!8 = !{!"Simple C++ TBAA"}263!9 = !{!10, !10, i64 0}264!10 = !{!"int", !7, i64 0}265!11 = !{!12, !12, i64 0}266!12 = !{!"float", !7, i64 0}267!13 = distinct !{!13, !14}268!14 = !{!"llvm.loop.mustprogress"}269!15 = distinct !{!15, !14}270