brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.6 KiB · eefde9d Raw
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