-
Notifications
You must be signed in to change notification settings - Fork 10.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[llvm-reduce][DebugInfo] Support reducing non-instruction debug-info (#…
…78995) LLVM will shortly be able to represent variable locations without encoding information into intrinsics -- they'll be stored as DPValue objects instead. We'll still need to be able to llvm-reduce these variable location assignments just like we can with intrinsics today, thus, here's an llvm-reduce pass that enumerates and reduces the DPValue objects. The test for this is paradoxically written with dbg.value intrinsics: this is because we're changing all the core parts of LLVM to support this first, with the textual IR format coming last. Until that arrives, testing the llvm-reduce'ing of DPValues needs the added test using intrinsics. We should be able to drop the variable assignment using %alsoloaded using this method. As with the other llvm-reduce tests, I've got one set of check lines for making the reduction happen as desired, and the other set to check the final output.
- Loading branch information
Showing
6 changed files
with
140 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
; RUN: llvm-reduce --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t --try-experimental-debuginfo-iterators | ||
; RUN: FileCheck --check-prefixes=CHECK-FINAL --input-file=%t %s --implicit-check-not=dbg.value | ||
|
||
; Test that we can, in RemoveDIs mode / DPValues mode (where variable location | ||
; information isn't an instruction), remove one variable location assignment | ||
; but not another. | ||
|
||
; CHECK-INTERESTINGNESS: call void @llvm.dbg.value(metadata i32 %added, | ||
|
||
; CHECK-FINAL: declare void @llvm.dbg.value(metadata, | ||
; CHECK-FINAL: %added = add | ||
; CHECK-FINAL-NEXT: call void @llvm.dbg.value(metadata i32 %added, | ||
|
||
declare void @llvm.dbg.value(metadata, metadata, metadata) | ||
|
||
define i32 @main() !dbg !7 { | ||
entry: | ||
%uninteresting1 = alloca i32, align 4 | ||
%interesting = alloca i32, align 4 | ||
%uninteresting2 = alloca i32, align 4 | ||
store i32 0, ptr %uninteresting1, align 4 | ||
store i32 0, ptr %interesting, align 4 | ||
%0 = load i32, ptr %interesting, align 4 | ||
%added = add nsw i32 %0, 1 | ||
tail call void @llvm.dbg.value(metadata i32 %added, metadata !13, metadata !DIExpression()), !dbg !14 | ||
store i32 %added, ptr %interesting, align 4 | ||
%alsoloaded = load i32, ptr %interesting, align 4 | ||
tail call void @llvm.dbg.value(metadata i32 %alsoloaded, metadata !13, metadata !DIExpression()), !dbg !14 | ||
store i32 %alsoloaded, ptr %uninteresting2, align 4 | ||
ret i32 0 | ||
} | ||
|
||
!llvm.dbg.cu = !{!0} | ||
!llvm.module.flags = !{!2, !3, !4, !5, !6} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 14.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) | ||
!1 = !DIFile(filename: "/tmp/a.c", directory: "/") | ||
!2 = !{i32 7, !"Dwarf Version", i32 4} | ||
!3 = !{i32 2, !"Debug Info Version", i32 3} | ||
!4 = !{i32 1, !"wchar_size", i32 4} | ||
!5 = !{i32 7, !"uwtable", i32 1} | ||
!6 = !{i32 7, !"frame-pointer", i32 2} | ||
!7 = distinct !DISubprogram(name: "main", scope: !8, file: !8, line: 1, type: !9, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !12) | ||
!8 = !DIFile(filename: "/tmp/a.c", directory: "") | ||
!9 = !DISubroutineType(types: !10) | ||
!10 = !{!11} | ||
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!12 = !{} | ||
!13 = !DILocalVariable(name: "a", scope: !7, file: !8, line: 2, type: !11) | ||
!14 = !DILocation(line: 2, column: 7, scope: !7) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
//===- ReduceDPValues.cpp - Specialized Delta Pass ------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file implements a function which calls the Generic Delta pass in order | ||
// to reduce uninteresting DPValues from defined functions. | ||
// | ||
// DPValues store variable-location debug-info and are attached to instructions. | ||
// This information used to be represented by intrinsics such as dbg.value, and | ||
// would naturally get reduced by llvm-reduce like any other instruction. As | ||
// DPValues get stored elsewhere, they need to be enumerated and eliminated like | ||
// any other data structure in LLVM. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "ReduceDPValues.h" | ||
#include "Utils.h" | ||
#include "llvm/ADT/STLExtras.h" | ||
|
||
using namespace llvm; | ||
|
||
static void extractDPValuesFromModule(Oracle &O, ReducerWorkItem &WorkItem) { | ||
Module &M = WorkItem.getModule(); | ||
|
||
for (auto &F : M) | ||
for (auto &BB : F) | ||
for (auto &I : BB) | ||
for (DPValue &DPV : llvm::make_early_inc_range(I.getDbgValueRange())) | ||
if (!O.shouldKeep()) | ||
DPV.eraseFromParent(); | ||
} | ||
|
||
void llvm::reduceDPValuesDeltaPass(TestRunner &Test) { | ||
runDeltaPass(Test, extractDPValuesFromModule, "Reducing DPValues"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
//===- ReduceDPValues.h -----------------------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file implements a function which calls the Generic Delta pass in order | ||
// to reduce uninteresting DPValues from defined functions. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_TOOLS_LLVM_REDUCE_DELTAS_REDUCEDPVALUES_H | ||
#define LLVM_TOOLS_LLVM_REDUCE_DELTAS_REDUCEDPVALUES_H | ||
|
||
#include "Delta.h" | ||
#include "llvm/IR/BasicBlock.h" | ||
#include "llvm/IR/DebugProgramInstruction.h" | ||
|
||
namespace llvm { | ||
void reduceDPValuesDeltaPass(TestRunner &Test); | ||
} // namespace llvm | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters