blob: 00b50da2750d87f62e37bedfddc3488c24670850 [file] [edit]
; 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: !{})