| ; RUN: opt -passes=loop-vectorize -enable-vplan-native-path -disable-output \ | |
| ; RUN: -pass-remarks-output=- %s | FileCheck %s --match-full-lines \ | |
| ; RUN: --implicit-check-not='--- !' | |
| ; CHECK: --- !Analysis | |
| ; CHECK-NEXT: Pass: loop-vectorize | |
| ; CHECK-NEXT: Name: CantVectorizeInstructionReturnType | |
| ; CHECK-NEXT: DebugLoc: { File: test.c, Line: 3, Column: 0 } | |
| ; CHECK-NEXT: Function: vector_load_store | |
| ; CHECK-NEXT: Args: | |
| ; CHECK-NEXT: - String: 'loop not vectorized: ' | |
| ; CHECK-NEXT: - String: instruction return type cannot be vectorized | |
| ; CHECK-NEXT: ... | |
| ; CHECK-NEXT: --- !Analysis | |
| ; CHECK-NEXT: Pass: loop-vectorize | |
| ; CHECK-NEXT: Name: CantVectorizeStore | |
| ; CHECK-NEXT: DebugLoc: { File: test.c, Line: 4, Column: 0 } | |
| ; CHECK-NEXT: Function: vector_load_store | |
| ; CHECK-NEXT: Args: | |
| ; CHECK-NEXT: - String: 'loop not vectorized: ' | |
| ; CHECK-NEXT: - String: Store instruction cannot be vectorized | |
| ; CHECK-NEXT: ... | |
| ; CHECK-NEXT: --- !Analysis | |
| ; CHECK-NEXT: Pass: loop-vectorize | |
| ; CHECK-NEXT: Name: UnsupportedOuterLoop | |
| ; CHECK-NEXT: DebugLoc: { File: test.c, Line: 2, Column: 0 } | |
| ; CHECK-NEXT: Function: vector_load_store | |
| ; CHECK-NEXT: Args: | |
| ; CHECK-NEXT: - String: 'loop not vectorized: ' | |
| ; CHECK-NEXT: - String: Unsupported outer loop | |
| ; CHECK-NEXT: ... | |
| ; CHECK-NEXT: --- !Missed | |
| ; CHECK-NEXT: Pass: loop-vectorize | |
| ; CHECK-NEXT: Name: MissedDetails | |
| ; CHECK-NEXT: DebugLoc: { File: test.c, Line: 2, Column: 0 } | |
| ; CHECK-NEXT: Function: vector_load_store | |
| ; CHECK-NEXT: Args: | |
| ; CHECK-NEXT: - String: loop not vectorized | |
| ; CHECK-NEXT: - String: ' (Force=' | |
| ; CHECK-NEXT: - Force: 'true' | |
| ; CHECK-NEXT: - String: ')' | |
| ; CHECK-NEXT: ... | |
| define void @vector_load_store(ptr noalias %A, ptr noalias %B, i64 %N, i64 %M) !dbg !3 { | |
| entry: | |
| br label %outer.header | |
| outer.header: | |
| %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] | |
| br label %inner | |
| inner: | |
| %inner.iv = phi i64 [ 0, %outer.header ], [ %inner.iv.next, %inner ] | |
| %inner.iv.next = add nuw nsw i64 %inner.iv, 1 | |
| %inner.ec = icmp eq i64 %inner.iv.next, %M | |
| br i1 %inner.ec, label %outer.latch, label %inner | |
| outer.latch: | |
| %gep.B = getelementptr inbounds <2 x i32>, ptr %B, i64 %outer.iv | |
| %l = load <2 x i32>, ptr %gep.B, align 8, !dbg !7 | |
| %gep.A = getelementptr inbounds <2 x i32>, ptr %A, i64 %outer.iv | |
| store <2 x i32> %l, ptr %gep.A, align 8, !dbg !8 | |
| %outer.iv.next = add nuw nsw i64 %outer.iv, 1 | |
| %outer.ec = icmp eq i64 %outer.iv.next, %N | |
| br i1 %outer.ec, label %exit, label %outer.header, !llvm.loop !4 | |
| exit: | |
| ret void | |
| } | |
| !llvm.dbg.cu = !{!0} | |
| !llvm.module.flags = !{!2} | |
| !0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, emissionKind: LineTablesOnly) | |
| !1 = !DIFile(filename: "test.c", directory: "/") | |
| !2 = !{i32 2, !"Debug Info Version", i32 3} | |
| !3 = distinct !DISubprogram(name: "vector_load_store", scope: !1, file: !1, line: 1, type: !9, spFlags: DISPFlagDefinition, unit: !0) | |
| !4 = distinct !{!4, !5, !6} | |
| !5 = !DILocation(line: 2, scope: !3) | |
| !6 = !{!"llvm.loop.vectorize.enable"} | |
| !7 = !DILocation(line: 3, scope: !3) | |
| !8 = !DILocation(line: 4, scope: !3) | |
| !9 = !DISubroutineType(types: !{}) |