[PATCH] D48331: [DebugInfo][InstCombine] Preserve DI after merging instructions
Anastasis via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 19 12:20:18 PDT 2018
gramanas updated this revision to Diff 151964.
gramanas added a comment.
Add RUN: clause to the test
Repository:
rL LLVM
https://reviews.llvm.org/D48331
Files:
lib/Transforms/InstCombine/InstCombineCasts.cpp
test/Transforms/InstCombine/debuginfo-trunc-and-zext.ll
Index: test/Transforms/InstCombine/debuginfo-trunc-and-zext.ll
===================================================================
--- /dev/null
+++ test/Transforms/InstCombine/debuginfo-trunc-and-zext.ll
@@ -0,0 +1,43 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+
+define <2 x i64> @test3(<2 x i64> %A) !dbg !6 {
+ %trunc = trunc <2 x i64> %A to <2 x i32>, !dbg !14
+ call void @llvm.dbg.value(metadata <2 x i32> %trunc, metadata !9, metadata !DIExpression()), !dbg !14
+ %and = and <2 x i32> %trunc, <i32 23, i32 42>, !dbg !15
+ call void @llvm.dbg.value(metadata <2 x i32> %and, metadata !11, metadata !DIExpression()), !dbg !15
+ %zext = zext <2 x i32> %and to <2 x i64>, !dbg !16
+ call void @llvm.dbg.value(metadata <2 x i64> %zext, metadata !12, metadata !DIExpression()), !dbg !16
+ ret <2 x i64> %zext, !dbg !17
+}
+
+; CHECK: call void @llvm.dbg.value{{.*}}
+; CHECK: call void @llvm.dbg.value{{.*}}
+; CHECK: call void @llvm.dbg.value{{.*}}
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.value(metadata, metadata, metadata) #0
+
+attributes #0 = { nounwind readnone speculatable }
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!3, !4}
+!llvm.module.flags = !{!5}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "debuginfo-trunc-and-zext.ll", directory: "/")
+!2 = !{}
+!3 = !{i32 4}
+!4 = !{i32 3}
+!5 = !{i32 2, !"Debug Info Version", i32 3}
+!6 = distinct !DISubprogram(name: "test3", linkageName: "test3", scope: null, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !8)
+!7 = !DISubroutineType(types: !2)
+!8 = !{!9, !11, !12}
+!9 = !DILocalVariable(name: "1", scope: !6, file: !1, line: 1, type: !10)
+!10 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
+!11 = !DILocalVariable(name: "2", scope: !6, file: !1, line: 2, type: !10)
+!12 = !DILocalVariable(name: "3", scope: !6, file: !1, line: 3, type: !13)
+!13 = !DIBasicType(name: "ty128", size: 128, encoding: DW_ATE_unsigned)
+!14 = !DILocation(line: 1, column: 1, scope: !6)
+!15 = !DILocation(line: 2, column: 1, scope: !6)
+!16 = !DILocation(line: 3, column: 1, scope: !6)
+!17 = !DILocation(line: 4, column: 1, scope: !6)
Index: lib/Transforms/InstCombine/InstCombineCasts.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -1088,17 +1088,31 @@
uint32_t SrcBitsKept = SrcTy->getScalarSizeInBits()-BitsToClear;
uint32_t DestBitSize = DestTy->getScalarSizeInBits();
+ // Since the old instruction is merged, we preserve it's DI as
+ // a fragment in the resulting instruction
+ SmallVector<DbgInfoIntrinsic *, 1> SrcDbgInsts;
+ findDbgUsers(SrcDbgInsts, Src);
+ if (SrcDbgInsts.size()) {
+ DIBuilder DIB(*CI.getModule());
+ for (auto *DII : SrcDbgInsts) {
+ auto Fragment = DIExpression::createFragmentExpression(
+ DII->getExpression(), SrcBitsKept, DestBitSize);
+ DIB.insertDbgValueIntrinsic(
+ Res, DII->getVariable(), Fragment.getValue(),
+ DII->getDebugLoc().get(), &*std::next(CI.getIterator()));
+ }
+ }
+
// If the high bits are already filled with zeros, just replace this
// cast with the result.
- if (MaskedValueIsZero(Res,
- APInt::getHighBitsSet(DestBitSize,
- DestBitSize-SrcBitsKept),
- 0, &CI))
+ if (MaskedValueIsZero(
+ Res, APInt::getHighBitsSet(DestBitSize, DestBitSize - SrcBitsKept),
+ 0, &CI))
return replaceInstUsesWith(CI, Res);
// We need to emit an AND to clear the high bits.
- Constant *C = ConstantInt::get(Res->getType(),
- APInt::getLowBitsSet(DestBitSize, SrcBitsKept));
+ Constant *C = ConstantInt::get(
+ Res->getType(), APInt::getLowBitsSet(DestBitSize, SrcBitsKept));
return BinaryOperator::CreateAnd(Res, C);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48331.151964.patch
Type: text/x-patch
Size: 4216 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180619/5a2e8a32/attachment.bin>
More information about the llvm-commits
mailing list