[llvm] r352462 - [CodeGenPrepare] Handle all debug calls in dupRetToEnableTailCallOpts()

Jonas Paulsson via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 29 01:03:36 PST 2019


Author: jonpa
Date: Tue Jan 29 01:03:35 2019
New Revision: 352462

URL: http://llvm.org/viewvc/llvm-project?rev=352462&view=rev
Log:
[CodeGenPrepare]  Handle all debug calls in dupRetToEnableTailCallOpts()

This patch makes sure that a debug value that is after the bitcast in
dupRetToEnableTailCallOpts() is also skipped.

The reduced test case is from SPEC-2006 on SystemZ.

Review: Vedant Kumar, Wolfgang Pieb
https://reviews.llvm.org/D57050

Added:
    llvm/trunk/test/CodeGen/SystemZ/debuginstr-cgp.mir
Modified:
    llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp

Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=352462&r1=352461&r2=352462&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Tue Jan 29 01:03:35 2019
@@ -1845,10 +1845,8 @@ bool CodeGenPrepare::dupRetToEnableTailC
   // return is the first instruction in the block.
   if (PN) {
     BasicBlock::iterator BI = BB->begin();
-    do { ++BI; } while (isa<DbgInfoIntrinsic>(BI));
-    if (&*BI == BCI)
-      // Also skip over the bitcast.
-      ++BI;
+    // Skip over debug and the bitcast.
+    do { ++BI; } while (isa<DbgInfoIntrinsic>(BI) || &*BI == BCI);
     if (&*BI != RetI)
       return false;
   } else {

Added: llvm/trunk/test/CodeGen/SystemZ/debuginstr-cgp.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SystemZ/debuginstr-cgp.mir?rev=352462&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/SystemZ/debuginstr-cgp.mir (added)
+++ llvm/trunk/test/CodeGen/SystemZ/debuginstr-cgp.mir Tue Jan 29 01:03:35 2019
@@ -0,0 +1,171 @@
+# Check that the codegenprepare succeeds in dupRetToEnableTailCallOpts() also
+# in the presence of a call to @llvm.dbg.value()
+#
+# RUN: llc %s -mtriple=s390x-linux-gnu -mcpu=z13 -start-before=codegenprepare \
+# RUN:   -stop-after codegenprepare -o - | FileCheck %s
+#
+# CHECK-LABEL: bb2:
+# CHECK:       ret
+# CHECK-LABEL: bb4:
+# CHECK:       ret
+
+
+# Generated with:
+#
+# bin/llc -mtriple=s390x-linux-gnu -mcpu=z13 -stop-before codegenprepare -simplify-mir
+#
+# %0 = type { i32 (...)**, i16, %1* }
+# %1 = type { i32 (...)** }
+# %2 = type { i32 (...)**, %1*, i8, i32, i32, i32, i16, i32, i16, i32, i16*, %3*, %6*, %9 }
+# %3 = type { %4 }
+# %4 = type { i32 (...)**, i8, i32, i32, %5**, %1* }
+# %5 = type { i32, i32 }
+# %6 = type { %7*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %1* }
+# %7 = type { %8 }
+# %8 = type { i32 (...)**, i8, i32, i32, %0**, %1* }
+# %9 = type { i8* }
+# %10 = type { %0, i32, i32, %0* }
+#
+# define %0* @Fun(%2* %arg) !dbg !7 {
+# bb:
+#   switch i32 undef, label %bb3 [
+#     i32 58, label %bb1
+#     i32 41, label %bb2
+#   ], !dbg !14
+#
+# bb1:                                              ; preds = %bb
+#   br label %bb4, !dbg !15
+#
+# bb2:                                              ; preds = %bb
+#   %tmp = tail call %10* @hoge(%6* undef, %0* undef, i32 signext 0, i32 signext 0), !dbg !16
+#   call void @llvm.dbg.value(metadata %10* %tmp, metadata !10, metadata !DIExpression()), !dbg !16
+#   br label %bb4, !dbg !17
+#
+# bb3:                                              ; preds = %bb
+#   unreachable, !dbg !18
+#
+# bb4:                                              ; preds = %bb2, %bb1
+#   %tmp5 = phi %10* [ undef, %bb1 ], [ %tmp, %bb2 ], !dbg !19
+#   call void @llvm.dbg.value(metadata %10* %tmp5, metadata !12, metadata !DIExpression()), !dbg !19
+#   %tmp6 = bitcast %10* %tmp5 to %0*, !dbg !20
+#   call void @llvm.dbg.value(metadata %0* %tmp6, metadata !13, metadata !DIExpression()), !dbg !20
+#   ret %0* %tmp6, !dbg !21
+# }
+#
+# declare %10* @hoge(%6*, %0*, i32, i32)
+#
+# ; Function Attrs: nounwind readnone speculatable
+# declare void @llvm.dbg.value(metadata, metadata, metadata) #1
+#
+# attributes #0 = { "use-soft-float"="false" }
+# attributes #1 = { nounwind readnone speculatable }
+#
+# !llvm.module.flags = !{!0, !1}
+# !llvm.dbg.cu = !{!2}
+# !llvm.debugify = !{!5, !6}
+#
+# !0 = !{i32 2, !"Debug Info Version", i32 3}
+# !1 = !{i32 1, !"wchar_size", i32 4}
+# !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4)
+# !3 = !DIFile(filename: "tc.ll", directory: "/")
+# !4 = !{}
+# !5 = !{i32 8}
+# !6 = !{i32 3}
+# !7 = distinct !DISubprogram(name: "eggs", linkageName: "eggs", scope: null, file: !3, line: 1, type: !8, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !9)
+# !8 = !DISubroutineType(types: !4)
+# !9 = !{!10, !12, !13}
+# !10 = !DILocalVariable(name: "1", scope: !7, file: !3, line: 3, type: !11)
+# !11 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
+# !12 = !DILocalVariable(name: "2", scope: !7, file: !3, line: 6, type: !11)
+# !13 = !DILocalVariable(name: "3", scope: !7, file: !3, line: 7, type: !11)
+# !14 = !DILocation(line: 1, column: 1, scope: !7)
+# !15 = !DILocation(line: 2, column: 1, scope: !7)
+# !16 = !DILocation(line: 3, column: 1, scope: !7)
+# !17 = !DILocation(line: 4, column: 1, scope: !7)
+# !18 = !DILocation(line: 5, column: 1, scope: !7)
+# !19 = !DILocation(line: 6, column: 1, scope: !7)
+# !20 = !DILocation(line: 7, column: 1, scope: !7)
+# !21 = !DILocation(line: 8, column: 1, scope: !7)
+
+
+--- |
+  
+  %0 = type { i32 (...)**, i16, %1* }
+  %1 = type { i32 (...)** }
+  %2 = type { i32 (...)**, %1*, i8, i32, i32, i32, i16, i32, i16, i32, i16*, %3*, %6*, %9 }
+  %3 = type { %4 }
+  %4 = type { i32 (...)**, i8, i32, i32, %5**, %1* }
+  %5 = type { i32, i32 }
+  %6 = type { %7*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %1* }
+  %7 = type { %8 }
+  %8 = type { i32 (...)**, i8, i32, i32, %0**, %1* }
+  %9 = type { i8* }
+  %10 = type { %0, i32, i32, %0* }
+  
+  define %0* @Fun(%2* %arg) #0 !dbg !7 {
+  bb:
+    switch i32 undef, label %bb3 [
+      i32 58, label %bb1
+      i32 41, label %bb2
+    ], !dbg !14
+  
+  bb1:                                              ; preds = %bb
+    br label %bb4, !dbg !15
+  
+  bb2:                                              ; preds = %bb
+    %tmp = tail call %10* @hoge(%6* undef, %0* undef, i32 signext 0, i32 signext 0), !dbg !16
+    call void @llvm.dbg.value(metadata %10* %tmp, metadata !10, metadata !DIExpression()), !dbg !16
+    br label %bb4, !dbg !17
+  
+  bb3:                                              ; preds = %bb
+    unreachable, !dbg !18
+  
+  bb4:                                              ; preds = %bb2, %bb1
+    %tmp5 = phi %10* [ undef, %bb1 ], [ %tmp, %bb2 ], !dbg !19
+    call void @llvm.dbg.value(metadata %10* %tmp5, metadata !12, metadata !DIExpression()), !dbg !19
+    %tmp6 = bitcast %10* %tmp5 to %0*, !dbg !20
+    call void @llvm.dbg.value(metadata %0* %tmp6, metadata !13, metadata !DIExpression()), !dbg !20
+    ret %0* %tmp6, !dbg !21
+  }
+  
+  declare %10* @hoge(%6*, %0*, i32, i32) #0
+  
+  ; Function Attrs: nounwind readnone speculatable
+  declare void @llvm.dbg.value(metadata, metadata, metadata) #1
+  
+  attributes #0 = { "target-cpu"="z13" }
+  attributes #1 = { nounwind readnone speculatable "target-cpu"="z13" }
+  
+  !llvm.module.flags = !{!0, !1}
+  !llvm.dbg.cu = !{!2}
+  !llvm.debugify = !{!5, !6}
+  
+  !0 = !{i32 2, !"Debug Info Version", i32 3}
+  !1 = !{i32 1, !"wchar_size", i32 4}
+  !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4)
+  !3 = !DIFile(filename: "tc.ll", directory: "/")
+  !4 = !{}
+  !5 = !{i32 8}
+  !6 = !{i32 3}
+  !7 = distinct !DISubprogram(name: "eggs", linkageName: "eggs", scope: null, file: !3, line: 1, type: !8, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !9)
+  !8 = !DISubroutineType(types: !4)
+  !9 = !{!10, !12, !13}
+  !10 = !DILocalVariable(name: "1", scope: !7, file: !3, line: 3, type: !11)
+  !11 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
+  !12 = !DILocalVariable(name: "2", scope: !7, file: !3, line: 6, type: !11)
+  !13 = !DILocalVariable(name: "3", scope: !7, file: !3, line: 7, type: !11)
+  !14 = !DILocation(line: 1, column: 1, scope: !7)
+  !15 = !DILocation(line: 2, column: 1, scope: !7)
+  !16 = !DILocation(line: 3, column: 1, scope: !7)
+  !17 = !DILocation(line: 4, column: 1, scope: !7)
+  !18 = !DILocation(line: 5, column: 1, scope: !7)
+  !19 = !DILocation(line: 6, column: 1, scope: !7)
+  !20 = !DILocation(line: 7, column: 1, scope: !7)
+  !21 = !DILocation(line: 8, column: 1, scope: !7)
+
+...
+---
+name:            Fun
+alignment:       4
+tracksRegLiveness: true
+...




More information about the llvm-commits mailing list