[PATCH] D117489: [SDAG] Don't move DBG_VALUE instructions after insertion point during scheduling (PR53243)

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 17 07:23:46 PST 2022


nikic updated this revision to Diff 400546.
nikic added a comment.

Swap order of checks. We should stop at the insertion point even if it doesn't happen to be DBG_VALUE.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D117489/new/

https://reviews.llvm.org/D117489

Files:
  llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
  llvm/test/CodeGen/X86/pr53243-tail-call-fastisel.ll


Index: llvm/test/CodeGen/X86/pr53243-tail-call-fastisel.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/pr53243-tail-call-fastisel.ll
@@ -0,0 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -O0 -fast-isel -mtriple=x86_64-- < %s | FileCheck %s
+
+define void @test() {
+; CHECK-LABEL: test:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    jmp set_state at PLT # TAILCALL
+  tail call void @set_state()
+  call void @llvm.dbg.value(metadata i64 0, metadata !12, metadata !DIExpression()), !dbg !27
+  ret void
+}
+
+declare void @set_state()
+
+; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
+declare void @llvm.dbg.value(metadata, metadata, metadata) #0
+
+attributes #0 = { nofree nosync nounwind readnone speculatable willreturn }
+
+!llvm.module.flags = !{!0}
+!llvm.dbg.cu = !{!1}
+
+!0 = !{i32 2, !"Debug Info Version", i32 3}
+!1 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !2, producer: "clang LLVM (rustc version 1.60.0-nightly (ec4bcaac4 2022-01-15))", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !3)
+!2 = !DIFile(filename: "src/lib.rs/@/bug.63e521cd-cgu.0", directory: "/tmp/rust-bug")
+!3 = !{!4}
+!4 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "Option", scope: !6, file: !5, baseType: !8, size: 8, align: 8, flags: DIFlagEnumClass, elements: !9)
+!5 = !DIFile(filename: "<unknown>", directory: "")
+!6 = !DINamespace(name: "option", scope: !7)
+!7 = !DINamespace(name: "core", scope: null)
+!8 = !DIBasicType(name: "u8", size: 8, encoding: DW_ATE_unsigned)
+!9 = !{!10, !11}
+!10 = !DIEnumerator(name: "None", value: 0)
+!11 = !DIEnumerator(name: "Some", value: 1)
+!12 = !DILocalVariable(name: "msg", arg: 2, scope: !13, file: !14, line: 689, type: !17)
+!13 = distinct !DISubprogram(name: "expect<()>", linkageName: "_ZN4core6option15Option$LT$T$GT$6expect17h9a574c18f194c213E", scope: !4, file: !14, line: 689, type: !15, scopeLine: 689, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, templateParams: !24, retainedNodes: !23)
+!14 = !DIFile(filename: "/rustc/ec4bcaac450279b029f3480b8b8f1b82ab36a5eb/library/core/src/option.rs", directory: "", checksumkind: CSK_MD5, checksum: "4120c8557937a0772190a676ec193800")
+!15 = !DISubroutineType(types: !16)
+!16 = !{null, !4, !17}
+!17 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "&str", file: !5, size: 128, align: 64, elements: !18, templateParams: !23, identifier: "84eec819988617519061e0b609a72fe3")
+!18 = !{!19, !21}
+!19 = !DIDerivedType(tag: DW_TAG_member, name: "data_ptr", scope: !17, file: !5, baseType: !20, size: 64, align: 64)
+!20 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "*const u8", baseType: !8, size: 64, align: 64, dwarfAddressSpace: 0)
+!21 = !DIDerivedType(tag: DW_TAG_member, name: "length", scope: !17, file: !5, baseType: !22, size: 64, align: 64, offset: 64)
+!22 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned)
+!23 = !{}
+!24 = !{!25}
+!25 = !DITemplateTypeParameter(name: "T", type: !26)
+!26 = !DIBasicType(name: "()", encoding: DW_ATE_unsigned)
+!27 = !DILocation(line: 0, scope: !13)
Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
+++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
@@ -1057,12 +1057,13 @@
            "first terminator cannot be a debug value");
     for (MachineInstr &MI : make_early_inc_range(
              make_range(std::next(FirstTerm), InsertBB->end()))) {
+      // Only scan up to insertion point.
+      if (&MI == InsertPos)
+        break;
+
       if (!MI.isDebugValue())
         continue;
 
-      if (&MI == InsertPos)
-        InsertPos = std::prev(InsertPos->getIterator());
-
       // The DBG_VALUE was referencing a value produced by a terminator. By
       // moving the DBG_VALUE, the referenced value also needs invalidating.
       MI.getOperand(0).ChangeToRegister(0, false);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117489.400546.patch
Type: text/x-patch
Size: 4141 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220117/7c77a401/attachment.bin>


More information about the llvm-commits mailing list