173 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -S -passes=loop-vectorize -enable-vplan-native-path -force-vector-interleave=1 -force-vector-width=4 | FileCheck %s3 4target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"5 6define void @foo(ptr %h) !dbg !4 {7; CHECK-LABEL: define void @foo(8; CHECK-SAME: ptr [[H:%.*]]) !dbg [[DBG4:![0-9]+]] {9; CHECK-NEXT: [[ENTRY:.*:]]10; CHECK-NEXT: #dbg_value(i64 0, [[META11:![0-9]+]], !DIExpression(), [[META20:![0-9]+]])11; CHECK-NEXT: br label %[[VECTOR_PH:.*]], !dbg [[DBG21:![0-9]+]]12; CHECK: [[VECTOR_PH]]:13; CHECK-NEXT: br label %[[VECTOR_BODY:.*]], !dbg [[DBG21]]14; CHECK: [[VECTOR_BODY]]:15; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_LATCH:.*]] ], !dbg [[DBG22:![0-9]+]]16; CHECK-NEXT: br label %[[FOR_COND5_PREHEADER1:.*]], !dbg [[DBG21]]17; CHECK: [[FOR_COND5_PREHEADER1]]:18; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i64> [ zeroinitializer, %[[VECTOR_BODY]] ], [ [[TMP5:%.*]], %[[FOR_COND5_PREHEADER1]] ], !dbg [[DBG23:![0-9]+]]19; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[H]], <4 x i64> [[VEC_PHI]]20; CHECK-NEXT: call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> zeroinitializer, <4 x ptr> align 4 [[TMP0]], <4 x i1> splat (i1 true)), !dbg [[DBG24:![0-9]+]]21; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, <4 x ptr> [[TMP0]], i64 1, !dbg [[DBG26:![0-9]+]]22; CHECK-NEXT: call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> splat (i32 1), <4 x ptr> align 4 [[TMP2]], <4 x i1> splat (i1 true)), !dbg [[DBG24]]23; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i32, <4 x ptr> [[TMP0]], i64 2, !dbg [[DBG26]]24; CHECK-NEXT: call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> splat (i32 2), <4 x ptr> align 4 [[TMP3]], <4 x i1> splat (i1 true)), !dbg [[DBG24]]25; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i32, <4 x ptr> [[TMP0]], i64 3, !dbg [[DBG26]]26; CHECK-NEXT: call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> splat (i32 3), <4 x ptr> align 4 [[TMP4]], <4 x i1> splat (i1 true)), !dbg [[DBG24]]27; CHECK-NEXT: [[TMP5]] = add nuw nsw <4 x i64> [[VEC_PHI]], splat (i64 1), !dbg [[DBG27:![0-9]+]]28; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <4 x i64> [[TMP5]], splat (i64 5), !dbg [[DBG28:![0-9]+]]29; CHECK-NEXT: [[TMP7:%.*]] = extractelement <4 x i1> [[TMP6]], i32 0, !dbg [[DBG29:![0-9]+]]30; CHECK-NEXT: br i1 [[TMP7]], label %[[VECTOR_LATCH]], label %[[FOR_COND5_PREHEADER1]], !dbg [[DBG29]]31; CHECK: [[VECTOR_LATCH]]:32; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4, !dbg [[DBG22]]33; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 20, !dbg [[DBG21]]34; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !dbg [[DBG21]], !llvm.loop [[LOOP30:![0-9]+]]35; CHECK: [[MIDDLE_BLOCK]]:36; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH:.*]], !dbg [[DBG21]]37; CHECK: [[SCALAR_PH]]:38; CHECK-NEXT: br label %[[FOR_COND1_PREHEADER:.*]], !dbg [[DBG21]]39; CHECK: [[FOR_COND1_PREHEADER]]:40; CHECK-NEXT: [[I_023:%.*]] = phi i64 [ 20, %[[SCALAR_PH]] ], [ [[INC13:%.*]], %[[FOR_COND_CLEANUP3:.*]] ]41; CHECK-NEXT: #dbg_value(i64 [[I_023]], [[META11]], !DIExpression(), [[META20]])42; CHECK-NEXT: br label %[[FOR_COND5_PREHEADER:.*]], !dbg [[DBG29]]43; CHECK: [[FOR_COND5_PREHEADER]]:44; CHECK-NEXT: [[L_022:%.*]] = phi i64 [ 0, %[[FOR_COND1_PREHEADER]] ], [ [[INC10:%.*]], %[[FOR_COND5_PREHEADER]] ], !dbg [[DBG23]]45; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i32, ptr [[H]], i64 [[L_022]]46; CHECK-NEXT: store i32 0, ptr [[TMP9]], align 4, !dbg [[DBG24]]47; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr i32, ptr [[TMP9]], i64 1, !dbg [[DBG26]]48; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX_1]], align 4, !dbg [[DBG24]]49; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr i32, ptr [[TMP9]], i64 2, !dbg [[DBG26]]50; CHECK-NEXT: store i32 2, ptr [[ARRAYIDX_2]], align 4, !dbg [[DBG24]]51; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr i32, ptr [[TMP9]], i64 3, !dbg [[DBG26]]52; CHECK-NEXT: store i32 3, ptr [[ARRAYIDX_3]], align 4, !dbg [[DBG24]]53; CHECK-NEXT: [[INC10]] = add nuw nsw i64 [[L_022]], 1, !dbg [[DBG27]]54; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC10]], 5, !dbg [[DBG28]]55; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP3]], label %[[FOR_COND5_PREHEADER]], !dbg [[DBG29]]56; CHECK: [[FOR_COND_CLEANUP3]]:57; CHECK-NEXT: [[INC13]] = add nuw nsw i64 [[I_023]], 1, !dbg [[DBG22]]58; CHECK-NEXT: #dbg_value(i64 [[INC13]], [[META11]], !DIExpression(), [[META20]])59; CHECK-NEXT: [[EXITCOND24_NOT:%.*]] = icmp eq i64 [[INC13]], 23, !dbg [[DBG33:![0-9]+]]60; CHECK-NEXT: br i1 [[EXITCOND24_NOT]], label %[[EXIT]], label %[[FOR_COND1_PREHEADER]], !dbg [[DBG21]], !llvm.loop [[LOOP34:![0-9]+]]61; CHECK: [[EXIT]]:62; CHECK-NEXT: ret void, !dbg [[DBG35:![0-9]+]]63;64entry:65 call void @llvm.dbg.value(metadata i64 0, metadata !11, metadata !DIExpression()), !dbg !2066 br label %for.cond1.preheader, !dbg !2167 68for.cond1.preheader: ; preds = %entry, %for.cond.cleanup369 %i.023 = phi i64 [ 0, %entry ], [ %inc13, %for.cond.cleanup3 ]70 call void @llvm.dbg.value(metadata i64 %i.023, metadata !11, metadata !DIExpression()), !dbg !2071 br label %for.cond5.preheader, !dbg !2272 73for.cond5.preheader: ; preds = %for.cond1.preheader, %for.cond5.preheader74 %l.022 = phi i64 [ 0, %for.cond1.preheader ], [ %inc10, %for.cond5.preheader ], !dbg !3475 %0 = getelementptr i32, ptr %h, i64 %l.02276 store i32 0, ptr %0, align 4, !dbg !2477 %arrayidx.1 = getelementptr i32, ptr %0, i64 1, !dbg !2678 store i32 1, ptr %arrayidx.1, align 4, !dbg !2479 %arrayidx.2 = getelementptr i32, ptr %0, i64 2, !dbg !2680 store i32 2, ptr %arrayidx.2, align 4, !dbg !2481 %arrayidx.3 = getelementptr i32, ptr %0, i64 3, !dbg !2682 store i32 3, ptr %arrayidx.3, align 4, !dbg !2483 %inc10 = add nuw nsw i64 %l.022, 1, !dbg !2784 %exitcond.not = icmp eq i64 %inc10, 5, !dbg !2885 br i1 %exitcond.not, label %for.cond.cleanup3, label %for.cond5.preheader, !dbg !2286 87for.cond.cleanup3: ; preds = %for.cond5.preheader88 %inc13 = add nuw nsw i64 %i.023, 1, !dbg !2989 call void @llvm.dbg.value(metadata i64 %inc13, metadata !11, metadata !DIExpression()), !dbg !2090 %exitcond24.not = icmp eq i64 %inc13, 23, !dbg !3091 br i1 %exitcond24.not, label %exit, label %for.cond1.preheader, !dbg !21, !llvm.loop !3192 93exit: ; preds = %for.cond.cleanup394 ret void, !dbg !2395}96 97declare void @llvm.dbg.value(metadata, metadata, metadata)98 99!llvm.dbg.cu = !{!0}100!llvm.module.flags = !{!2, !3}101 102!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)103!1 = !DIFile(filename: "outer-loop-vect.c", directory: "/test/file/path")104!2 = !{i32 2, !"Debug Info Version", i32 3}105!3 = !{i32 7, !"debug-info-assignment-tracking", i1 true}106!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 8, type: !5, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !9)107!5 = !DISubroutineType(types: !6)108!6 = !{null, !7}109!7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !8, size: 64)110!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)111!9 = !{!10, !11, !14, !17}112!10 = !DILocalVariable(name: "h", arg: 1, scope: !4, file: !1, line: 8, type: !7)113!11 = !DILocalVariable(name: "i", scope: !12, file: !1, line: 10, type: !13)114!12 = distinct !DILexicalBlock(scope: !4, file: !1, line: 10, column: 3)115!13 = !DIBasicType(name: "unsigned long", size: 64, encoding: DW_ATE_unsigned)116!14 = !DILocalVariable(name: "l", scope: !15, file: !1, line: 11, type: !13)117!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 11, column: 5)118!16 = distinct !DILexicalBlock(scope: !12, file: !1, line: 10, column: 3)119!17 = !DILocalVariable(name: "j", scope: !18, file: !1, line: 12, type: !13)120!18 = distinct !DILexicalBlock(scope: !19, file: !1, line: 12, column: 7)121!19 = distinct !DILexicalBlock(scope: !15, file: !1, line: 11, column: 5)122!20 = !DILocation(line: 0, scope: !12)123!21 = !DILocation(line: 10, column: 3, scope: !12)124!22 = !DILocation(line: 11, column: 5, scope: !15)125!23 = !DILocation(line: 14, column: 1, scope: !4)126!24 = !DILocation(line: 13, column: 11, scope: !25)127!25 = distinct !DILexicalBlock(scope: !18, file: !1, line: 12, column: 7)128!26 = !DILocation(line: 13, column: 2, scope: !25)129!27 = !DILocation(line: 11, column: 32, scope: !19)130!28 = !DILocation(line: 11, column: 26, scope: !19)131!29 = !DILocation(line: 10, column: 30, scope: !16)132!30 = !DILocation(line: 10, column: 24, scope: !16)133!31 = distinct !{!31, !21, !32, !33}134!32 = !DILocation(line: 13, column: 13, scope: !12)135!33 = !{!"llvm.loop.vectorize.enable", i1 true}136!34 = !DILocation(line: 10, column: 5, scope: !12)137;.138; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C11, file: [[META1:![0-9]+]], producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)139; CHECK: [[META1]] = !DIFile(filename: "{{.*}}outer-loop-vect.c", directory: {{.*}})140; CHECK: [[DBG4]] = distinct !DISubprogram(name: "foo", scope: [[META1]], file: [[META1]], line: 8, type: [[META5:![0-9]+]], scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META9:![0-9]+]])141; CHECK: [[META5]] = !DISubroutineType(types: [[META6:![0-9]+]])142; CHECK: [[META6]] = !{null, [[META7:![0-9]+]]}143; CHECK: [[META7]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META8:![0-9]+]], size: 64)144; CHECK: [[META8]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)145; CHECK: [[META9]] = !{[[META10:![0-9]+]], [[META11]], [[META14:![0-9]+]], [[META17:![0-9]+]]}146; CHECK: [[META10]] = !DILocalVariable(name: "h", arg: 1, scope: [[DBG4]], file: [[META1]], line: 8, type: [[META7]])147; CHECK: [[META11]] = !DILocalVariable(name: "i", scope: [[META12:![0-9]+]], file: [[META1]], line: 10, type: [[META13:![0-9]+]])148; CHECK: [[META12]] = distinct !DILexicalBlock(scope: [[DBG4]], file: [[META1]], line: 10, column: 3)149; CHECK: [[META13]] = !DIBasicType(name: "unsigned long", size: 64, encoding: DW_ATE_unsigned)150; CHECK: [[META14]] = !DILocalVariable(name: "l", scope: [[META15:![0-9]+]], file: [[META1]], line: 11, type: [[META13]])151; CHECK: [[META15]] = distinct !DILexicalBlock(scope: [[META16:![0-9]+]], file: [[META1]], line: 11, column: 5)152; CHECK: [[META16]] = distinct !DILexicalBlock(scope: [[META12]], file: [[META1]], line: 10, column: 3)153; CHECK: [[META17]] = !DILocalVariable(name: "j", scope: [[META18:![0-9]+]], file: [[META1]], line: 12, type: [[META13]])154; CHECK: [[META18]] = distinct !DILexicalBlock(scope: [[META19:![0-9]+]], file: [[META1]], line: 12, column: 7)155; CHECK: [[META19]] = distinct !DILexicalBlock(scope: [[META15]], file: [[META1]], line: 11, column: 5)156; CHECK: [[META20]] = !DILocation(line: 0, scope: [[META12]])157; CHECK: [[DBG21]] = !DILocation(line: 10, column: 3, scope: [[META12]])158; CHECK: [[DBG22]] = !DILocation(line: 10, column: 30, scope: [[META16]])159; CHECK: [[DBG23]] = !DILocation(line: 10, column: 5, scope: [[META12]])160; CHECK: [[DBG24]] = !DILocation(line: 13, column: 11, scope: [[META25:![0-9]+]])161; CHECK: [[META25]] = distinct !DILexicalBlock(scope: [[META18]], file: [[META1]], line: 12, column: 7)162; CHECK: [[DBG26]] = !DILocation(line: 13, column: 2, scope: [[META25]])163; CHECK: [[DBG27]] = !DILocation(line: 11, column: 32, scope: [[META19]])164; CHECK: [[DBG28]] = !DILocation(line: 11, column: 26, scope: [[META19]])165; CHECK: [[DBG29]] = !DILocation(line: 11, column: 5, scope: [[META15]])166; CHECK: [[LOOP30]] = distinct !{[[LOOP30]], [[META31:![0-9]+]], [[META32:![0-9]+]]}167; CHECK: [[META31]] = !{!"llvm.loop.isvectorized", i32 1}168; CHECK: [[META32]] = !{!"llvm.loop.unroll.runtime.disable"}169; CHECK: [[DBG33]] = !DILocation(line: 10, column: 24, scope: [[META16]])170; CHECK: [[LOOP34]] = distinct !{[[LOOP34]], [[META32]], [[META31]]}171; CHECK: [[DBG35]] = !DILocation(line: 14, column: 1, scope: [[DBG4]])172;.173