| ; 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) |