
A pseudo probe is created with dwarf line information shared with its nearest instruction. If the instruction comes with a dwarf discriminator, it will be shared with the probe as well. This can confuse the later FS-AFDO discriminator assignment pass. To fix this, I'm cleaning up the discriminator fields for probes when they are inserted. I also notice another possibility to change the discriminator field of pseudo probes in the pipeline before the FS discriminator assignment pass. That is the loop unroller, which assigns duplication factor to instruction being vectorized. I'm disabling that for pseudo probe intrinsics specifically, also for callsites with probes. Reviewed By: wenlei Differential Revision: https://reviews.llvm.org/D148569
82 lines
3.8 KiB
LLVM
82 lines
3.8 KiB
LLVM
; RUN: opt -S -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 < %s | FileCheck --check-prefix=DBG_VALUE --check-prefix=LOOPVEC_4_1 %s
|
|
; RUN: opt -S -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=3 < %s | FileCheck --check-prefix=DBG_VALUE --check-prefix=LOOPVEC_2_3 %s
|
|
; RUN: opt -S -passes=loop-unroll -unroll-count=5 < %s | FileCheck --check-prefix=DBG_VALUE --check-prefix=LOOPUNROLL_5 %s
|
|
; RUN: opt -S -passes=loop-vectorize,loop-unroll -force-vector-width=4 -force-vector-interleave=4 - -unroll-count=2 < %s | FileCheck --check-prefix=DBG_VALUE --check-prefix=LOOPVEC_UNROLL %s
|
|
; RUN: opt -S -passes=pseudo-probe,loop-unroll -unroll-count=5 < %s | FileCheck --check-prefix=PSEUDO_PROBE %s
|
|
|
|
; Test if vectorization/unroll factor is recorded in discriminator.
|
|
;
|
|
; Original source code:
|
|
; 1 int *a;
|
|
; 2 int *b;
|
|
; 3
|
|
; 4 void foo() {
|
|
; 5 for (int i = 0; i < 4096; i++)
|
|
; 6 a[i] += b[i];
|
|
; 7 }
|
|
|
|
@a = local_unnamed_addr global ptr null, align 8
|
|
@b = local_unnamed_addr global ptr null, align 8
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
|
|
|
|
define void @_Z3foov() local_unnamed_addr #0 !dbg !6 {
|
|
%1 = load ptr, ptr @b, align 8, !dbg !8, !tbaa !9
|
|
%2 = load ptr, ptr @a, align 8, !dbg !13, !tbaa !9
|
|
br label %3, !dbg !14
|
|
|
|
; <label>:3: ; preds = %3, %0
|
|
%indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %3 ]
|
|
%4 = getelementptr inbounds i32, ptr %1, i64 %indvars.iv, !dbg !8
|
|
%5 = load i32, ptr %4, align 4, !dbg !8, !tbaa !15
|
|
%6 = getelementptr inbounds i32, ptr %2, i64 %indvars.iv, !dbg !13
|
|
%7 = load i32, ptr %6, align 4, !dbg !17, !tbaa !15
|
|
%8 = add nsw i32 %7, %5, !dbg !17
|
|
;PSEUDO_PROBE-COUNT-5: call void @llvm.pseudoprobe(i64 6699318081062747564, i64 2, i32 0, i64 -1), !dbg ![[#PROBE:]]
|
|
;DBG_VALUE: call void @llvm.dbg.declare{{.*}}!dbg ![[DBG:[0-9]*]]
|
|
call void @llvm.dbg.declare(metadata i32 %8, metadata !22, metadata !DIExpression()), !dbg !17
|
|
store i32 %8, ptr %6, align 4, !dbg !17, !tbaa !15
|
|
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !18
|
|
%exitcond = icmp eq i64 %indvars.iv.next, 4096, !dbg !19
|
|
br i1 %exitcond, label %9, label %3, !dbg !14, !llvm.loop !20
|
|
|
|
; <label>:9: ; preds = %3
|
|
ret void, !dbg !21
|
|
}
|
|
|
|
;DBG_VALUE: ![[TOP:[0-9]*]] = distinct !DISubprogram(name: "foo"
|
|
;LOOPVEC_4_1: discriminator: 17
|
|
;LOOPVEC_2_3: discriminator: 25
|
|
;LOOPUNROLL_5: discriminator: 21
|
|
; When unrolling after loop vectorize, both vec_body and remainder loop
|
|
; are unrolled.
|
|
;LOOPVEC_UNROLL: discriminator: 9
|
|
;LOOPVEC_UNROLL: discriminator: 385
|
|
;DBG_VALUE: ![[DBG]] = {{.*}}, scope: ![[TOP]]
|
|
; Pseudo probe should not have duplication factor assigned.
|
|
;PSEUDO_PROBE: ![[TOP:[0-9]*]] = distinct !DISubprogram(name: "foo"
|
|
;PSEUDO_PROBE: ![[#PROBE]] = !DILocation(line: 6, column: 13, scope: ![[TOP]])
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!3, !4}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, debugInfoForProfiling: true)
|
|
!1 = !DIFile(filename: "a.cc", directory: "/")
|
|
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 4, unit: !0)
|
|
!8 = !DILocation(line: 6, column: 13, scope: !6)
|
|
!9 = !{!10, !10, i64 0}
|
|
!10 = !{!"any pointer", !11, i64 0}
|
|
!11 = !{!"omnipotent char", !12, i64 0}
|
|
!12 = !{!"Simple C++ TBAA"}
|
|
!13 = !DILocation(line: 6, column: 5, scope: !6)
|
|
!14 = !DILocation(line: 5, column: 3, scope: !6)
|
|
!15 = !{!16, !16, i64 0}
|
|
!16 = !{!"int", !11, i64 0}
|
|
!17 = !DILocation(line: 6, column: 10, scope: !6)
|
|
!18 = !DILocation(line: 5, column: 30, scope: !6)
|
|
!19 = !DILocation(line: 5, column: 21, scope: !6)
|
|
!20 = distinct !{!20, !14}
|
|
!21 = !DILocation(line: 7, column: 1, scope: !6)
|
|
!22 = !DILocalVariable(name: "a", arg: 1, scope: !6, file: !1, line: 10)
|