Skip to content

Commit a50bd0d

Browse files
authored
[RemoveDIs] Replicate dbg intrinsic movement pattern in SelectOptimize (#81737)
Fix crash mentioned in comments on d759618. The assertion being hit was complaining that we had dangling DPValues; the DPValues attached to the terminator of StartBlock become dangling after the terminator is erased, and they're never "flushed" back onto the new terminator once it's added. Doing that makes the crash go away, but doesn't replicate existing dbg.* behaviour. See the comment in the patch. This change both fixes the crash (because there are now no DPValues left on the terminator to dangle) and replicates existing behaviour (moves those DPValues down to the new block).
1 parent 2d7fdfa commit a50bd0d

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

llvm/lib/CodeGen/SelectOptimize.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,12 @@ void SelectOptimizeImpl::convertProfitableSIGroups(SelectGroups &ProfSIGroups) {
621621
SelectLike LastSI = ASI.back();
622622
BasicBlock *StartBlock = SI.getI()->getParent();
623623
BasicBlock::iterator SplitPt = ++(BasicBlock::iterator(LastSI.getI()));
624+
// With RemoveDIs turned off, SplitPt can be a dbg.* intrinsic. With
625+
// RemoveDIs turned on, SplitPt would instead point to the next
626+
// instruction. To match existing dbg.* intrinsic behaviour with RemoveDIs,
627+
// tell splitBasicBlock that we want to include any DPValues attached to
628+
// SplitPt in the splice.
629+
SplitPt.setHeadBit(true);
624630
BasicBlock *EndBlock = StartBlock->splitBasicBlock(SplitPt, "select.end");
625631
BFI->setBlockFreq(EndBlock, BFI->getBlockFreq(StartBlock));
626632
// Delete the unconditional branch that was just created by the split.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
; RUN: opt %s -passes='require<profile-summary>,function(select-optimize)' -o - -S \
2+
; RUN: | FileCheck %s
3+
; RUN: opt %s --try-experimental-debuginfo-iterators -passes='require<profile-summary>,function(select-optimize)' -o - -S \
4+
; RUN: | FileCheck %s
5+
6+
;; Check that the dbg.value is moved into the start of the end-block of the
7+
;; inserted if-block.
8+
9+
; CHECK: select.end:
10+
; CHECK-NEXT: %[[PHI:.*]] = phi i32
11+
; CHECK-NEXT: dbg.value(metadata i32 %[[PHI]],
12+
13+
source_filename = "test.ll"
14+
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
15+
target triple = "aarch64-unknown-fuchsia"
16+
17+
%struct.hb_glyph_info_t = type { i32, i32, i32, %union._hb_var_int_t, %union._hb_var_int_t }
18+
%union._hb_var_int_t = type { i32 }
19+
20+
define void @_Z22_hb_ot_shape_normalizePK18hb_ot_shape_plan_tP11hb_buffer_tP9hb_font_t() {
21+
entry:
22+
br label %while.body193
23+
24+
while.body193: ; preds = %while.body193, %entry
25+
%starter.0337 = phi i32 [ %spec.select322, %while.body193 ], [ 0, %entry ]
26+
%idxprom207 = zext i32 %starter.0337 to i64
27+
%arrayidx208 = getelementptr %struct.hb_glyph_info_t, ptr null, i64 %idxprom207
28+
%0 = load i32, ptr %arrayidx208, align 4
29+
%call247.val = load i16, ptr null, align 4
30+
%cmp249327 = icmp ult i16 %call247.val, 0
31+
%cmp249 = select i1 false, i1 false, i1 %cmp249327
32+
%spec.select322 = select i1 %cmp249, i32 0, i32 %starter.0337
33+
tail call void @llvm.dbg.value(metadata i32 %spec.select322, metadata !13, metadata !DIExpression()), !dbg !20
34+
br label %while.body193
35+
}
36+
37+
declare void @llvm.dbg.value(metadata, metadata, metadata)
38+
39+
40+
!llvm.dbg.cu = !{!0}
41+
!llvm.module.flags = !{!12}
42+
43+
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !3, imports: !2, splitDebugInlining: false, nameTableKind: GNU)
44+
!1 = !DIFile(filename: "../../third_party/harfbuzz-ng/src/src/hb-ot-shape-normalize.cc", directory: ".")
45+
!2 = !{}
46+
!3 = !{!4, !9}
47+
!4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
48+
!5 = distinct !DIGlobalVariable(scope: null, file: !1, line: 383, type: !6, isLocal: true, isDefinition: true)
49+
!6 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 112, elements: !2)
50+
!7 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !8)
51+
!8 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_unsigned_char)
52+
!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression())
53+
!10 = distinct !DIGlobalVariable(scope: null, file: !1, line: 410, type: !11, isLocal: true, isDefinition: true)
54+
!11 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 96, elements: !2)
55+
!12 = !{i32 2, !"Debug Info Version", i32 3}
56+
!13 = !DILocalVariable(name: "starter", scope: !14, file: !1, line: 441, type: !19)
57+
!14 = distinct !DILexicalBlock(scope: !15, file: !1, line: 435, column: 3)
58+
!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 431, column: 7)
59+
!16 = distinct !DISubprogram(name: "_hb_ot_shape_normalize", linkageName: "_Z22_hb_ot_shape_normalizePK18hb_ot_shape_plan_tP11hb_buffer_tP9hb_font_t", scope: !1, file: !1, line: 291, type: !17, scopeLine: 294, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
60+
!17 = distinct !DISubroutineType(types: !18)
61+
!18 = !{null}
62+
!19 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
63+
!20 = !DILocation(line: 0, scope: !14)

0 commit comments

Comments
 (0)