blob: aad11b24e9af06bbfb251afdf78d31f11ad4e807 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
; RUN: opt -passes=slp-vectorizer -mtriple=x86_64-unknown-linux -S < %s | FileCheck %s
define void @lanes(ptr %p, ptr %q, ptr %r) !dbg !10 {
; CHECK-LABEL: define void @lanes(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) !dbg [[DBG3:![0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: #dbg_value(float poison, [[META6:![0-9]+]], !DIExpression(), [[META8:![0-9]+]])
; CHECK-NEXT: #dbg_value(float poison, [[META9:![0-9]+]], !DIExpression(), [[META8]])
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fmul <2 x float> [[TMP0]], splat (float 2.000000e+00)
; CHECK-NEXT: store <2 x float> [[TMP1]], ptr [[Q]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x float> [[TMP1]], i64 0
; CHECK-NEXT: #dbg_value(float [[TMP2]], [[META6]], !DIExpression(), [[META8]])
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x float> [[TMP1]], i64 1
; CHECK-NEXT: #dbg_value(float [[TMP3]], [[META9]], !DIExpression(), [[META8]])
; CHECK-NEXT: [[S:%.*]] = fsub float [[TMP2]], [[TMP3]]
; CHECK-NEXT: #dbg_value(float [[TMP2]], [[META10:![0-9]+]], !DIExpression(), [[META8]])
; CHECK-NEXT: store float [[S]], ptr [[R]], align 4
; CHECK-NEXT: ret void
;
entry:
%p1 = getelementptr inbounds float, ptr %p, i64 1
%a0 = load float, ptr %p, align 4
%a1 = load float, ptr %p1, align 4
%m0 = fmul float %a0, 2.000000e+00
#dbg_value(float %m0, !12, !DIExpression(), !15)
%m1 = fmul float %a1, 2.000000e+00
#dbg_value(float %m1, !13, !DIExpression(), !15)
%q1 = getelementptr inbounds float, ptr %q, i64 1
store float %m0, ptr %q, align 4
store float %m1, ptr %q1, align 4
%s = fsub float %m0, %m1
#dbg_value(float %m0, !14, !DIExpression(), !15)
store float %s, ptr %r, align 4
ret void
}
define void @same_var(ptr %p, ptr %q, ptr %r) !dbg !20 {
; CHECK-LABEL: define void @same_var(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) !dbg [[DBG11:![0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: #dbg_value(float poison, [[META12:![0-9]+]], !DIExpression(), [[META13:![0-9]+]])
; CHECK-NEXT: #dbg_value(float poison, [[META12]], !DIExpression(), [[META13]])
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fmul <2 x float> [[TMP0]], splat (float 2.000000e+00)
; CHECK-NEXT: store <2 x float> [[TMP1]], ptr [[Q]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x float> [[TMP1]], i64 0
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x float> [[TMP1]], i64 1
; CHECK-NEXT: #dbg_value(float [[TMP3]], [[META12]], !DIExpression(), [[META13]])
; CHECK-NEXT: [[S:%.*]] = fsub float [[TMP2]], [[TMP3]]
; CHECK-NEXT: store float [[S]], ptr [[R]], align 4
; CHECK-NEXT: ret void
;
entry:
%p1 = getelementptr inbounds float, ptr %p, i64 1
%a0 = load float, ptr %p, align 4
%a1 = load float, ptr %p1, align 4
%m0 = fmul float %a0, 2.000000e+00
#dbg_value(float %m0, !22, !DIExpression(), !23)
%m1 = fmul float %a1, 2.000000e+00
#dbg_value(float %m1, !22, !DIExpression(), !23)
%q1 = getelementptr inbounds float, ptr %q, i64 1
store float %m0, ptr %q, align 4
store float %m1, ptr %q1, align 4
%s = fsub float %m0, %m1
store float %s, ptr %r, align 4
ret void
}
define void @inlined_vars(ptr %p, ptr %q, ptr %r) !dbg !30 {
; CHECK-LABEL: define void @inlined_vars(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) !dbg [[DBG14:![0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: #dbg_value(float poison, [[META15:![0-9]+]], !DIExpression(), [[META17:![0-9]+]])
; CHECK-NEXT: #dbg_value(float poison, [[META15]], !DIExpression(), [[META19:![0-9]+]])
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fmul <2 x float> [[TMP0]], splat (float 2.000000e+00)
; CHECK-NEXT: store <2 x float> [[TMP1]], ptr [[Q]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x float> [[TMP1]], i64 0
; CHECK-NEXT: #dbg_value(float [[TMP2]], [[META15]], !DIExpression(), [[META17]])
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x float> [[TMP1]], i64 1
; CHECK-NEXT: #dbg_value(float [[TMP3]], [[META15]], !DIExpression(), [[META19]])
; CHECK-NEXT: [[S:%.*]] = fsub float [[TMP2]], [[TMP3]]
; CHECK-NEXT: store float [[S]], ptr [[R]], align 4
; CHECK-NEXT: ret void
;
entry:
%p1 = getelementptr inbounds float, ptr %p, i64 1
%a0 = load float, ptr %p, align 4
%a1 = load float, ptr %p1, align 4
%m0 = fmul float %a0, 2.000000e+00
#dbg_value(float %m0, !32, !DIExpression(), !34)
%m1 = fmul float %a1, 2.000000e+00
#dbg_value(float %m1, !32, !DIExpression(), !36)
%q1 = getelementptr inbounds float, ptr %q, i64 1
store float %m0, ptr %q, align 4
store float %m1, ptr %q1, align 4
%s = fsub float %m0, %m1
store float %s, ptr %r, align 4
ret void
}
define void @other_block(ptr %p, ptr %q, ptr %r) !dbg !40 {
; CHECK-LABEL: define void @other_block(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) !dbg [[DBG21:![0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: #dbg_value(float poison, [[META22:![0-9]+]], !DIExpression(), [[META23:![0-9]+]])
; CHECK-NEXT: #dbg_value(float poison, [[META24:![0-9]+]], !DIExpression(), [[META23]])
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fmul <2 x float> [[TMP0]], splat (float 2.000000e+00)
; CHECK-NEXT: store <2 x float> [[TMP1]], ptr [[Q]], align 4
; CHECK-NEXT: br label %[[EXIT:.*]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x float> [[TMP1]], i64 0
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x float> [[TMP1]], i64 1
; CHECK-NEXT: [[S:%.*]] = fsub float [[TMP2]], [[TMP3]]
; CHECK-NEXT: store float [[S]], ptr [[R]], align 4
; CHECK-NEXT: ret void
;
entry:
%p1 = getelementptr inbounds float, ptr %p, i64 1
%a0 = load float, ptr %p, align 4
%a1 = load float, ptr %p1, align 4
%m0 = fmul float %a0, 2.000000e+00
#dbg_value(float %m0, !42, !DIExpression(), !44)
%m1 = fmul float %a1, 2.000000e+00
#dbg_value(float %m1, !43, !DIExpression(), !44)
%q1 = getelementptr inbounds float, ptr %q, i64 1
store float %m0, ptr %q, align 4
store float %m1, ptr %q1, align 4
br label %exit
exit:
%s = fsub float %m0, %m1
store float %s, ptr %r, align 4
ret void
}
define void @no_extract(ptr %p, ptr %q) !dbg !50 {
; CHECK-LABEL: define void @no_extract(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) !dbg [[DBG25:![0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: #dbg_value(float poison, [[META26:![0-9]+]], !DIExpression(), [[META27:![0-9]+]])
; CHECK-NEXT: #dbg_value(float poison, [[META28:![0-9]+]], !DIExpression(), [[META27]])
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = fmul <2 x float> [[TMP0]], splat (float 2.000000e+00)
; CHECK-NEXT: store <2 x float> [[TMP1]], ptr [[Q]], align 4
; CHECK-NEXT: ret void
;
entry:
%p1 = getelementptr inbounds float, ptr %p, i64 1
%a0 = load float, ptr %p, align 4
%a1 = load float, ptr %p1, align 4
%m0 = fmul float %a0, 2.000000e+00
#dbg_value(float %m0, !52, !DIExpression(), !54)
%m1 = fmul float %a1, 2.000000e+00
#dbg_value(float %m1, !53, !DIExpression(), !54)
%q1 = getelementptr inbounds float, ptr %q, i64 1
store float %m0, ptr %q, align 4
store float %m1, ptr %q1, align 4
ret void
}
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, isOptimized: true, emissionKind: FullDebug)
!1 = !DIFile(filename: "t.cpp", directory: "/tmp")
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
!4 = !DISubroutineType(types: !5)
!5 = !{null}
!10 = distinct !DISubprogram(name: "lanes", scope: !1, file: !1, line: 1, type: !4, unit: !0, spFlags: DISPFlagDefinition | DISPFlagOptimized)
!12 = !DILocalVariable(name: "x1", scope: !10, file: !1, line: 2, type: !3)
!13 = !DILocalVariable(name: "x2", scope: !10, file: !1, line: 3, type: !3)
!14 = !DILocalVariable(name: "y", scope: !10, file: !1, line: 4, type: !3)
!15 = !DILocation(line: 2, scope: !10)
!20 = distinct !DISubprogram(name: "same_var", scope: !1, file: !1, line: 10, type: !4, unit: !0, spFlags: DISPFlagDefinition | DISPFlagOptimized)
!22 = !DILocalVariable(name: "v", scope: !20, file: !1, line: 11, type: !3)
!23 = !DILocation(line: 11, scope: !20)
!30 = distinct !DISubprogram(name: "inlined_vars", scope: !1, file: !1, line: 20, type: !4, unit: !0, spFlags: DISPFlagDefinition | DISPFlagOptimized)
!31 = distinct !DISubprogram(name: "callee", scope: !1, file: !1, line: 25, type: !4, unit: !0, spFlags: DISPFlagDefinition | DISPFlagOptimized)
!32 = !DILocalVariable(name: "v", scope: !31, file: !1, line: 26, type: !3)
!33 = !DILocation(line: 21, scope: !30)
!34 = !DILocation(line: 26, scope: !31, inlinedAt: !33)
!35 = !DILocation(line: 22, scope: !30)
!36 = !DILocation(line: 26, scope: !31, inlinedAt: !35)
!40 = distinct !DISubprogram(name: "other_block", scope: !1, file: !1, line: 30, type: !4, unit: !0, spFlags: DISPFlagDefinition | DISPFlagOptimized)
!42 = !DILocalVariable(name: "x1", scope: !40, file: !1, line: 31, type: !3)
!43 = !DILocalVariable(name: "x2", scope: !40, file: !1, line: 32, type: !3)
!44 = !DILocation(line: 31, scope: !40)
!50 = distinct !DISubprogram(name: "no_extract", scope: !1, file: !1, line: 40, type: !4, unit: !0, spFlags: DISPFlagDefinition | DISPFlagOptimized)
!52 = !DILocalVariable(name: "x1", scope: !50, file: !1, line: 41, type: !3)
!53 = !DILocalVariable(name: "x2", scope: !50, file: !1, line: 42, type: !3)
!54 = !DILocation(line: 41, scope: !50)