Skip to content

Commit ce298e9

Browse files
committed
[opt-remark] Print out the type when we retain/release.
This can be useful if we can't recognize a retain/release and one needs to reason about what is being retained/released.
1 parent 73f07a6 commit ce298e9

File tree

5 files changed

+106
-93
lines changed

5 files changed

+106
-93
lines changed

lib/SIL/Utils/OptimizationRemark.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ Argument::Argument(ArgumentKey key, SILFunction *f) : key(key) {
7070
Argument::Argument(StringRef key, SILType ty)
7171
: key(ArgumentKeyKind::Default, key) {
7272
llvm::raw_string_ostream stream(val);
73-
ty.print(stream);
73+
PrintOptions subPrinter = PrintOptions::printSIL();
74+
ty.getASTType().print(stream, subPrinter);
7475
}
7576

7677
Argument::Argument(StringRef key, CanType ty)

lib/SILOptimizer/Transforms/OptRemarkGenerator.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ void OptRemarkGeneratorInstructionVisitor::visitStrongRetainInst(
249249
// Retains begin a lifetime scope so we infer scan forward.
250250
auto remark = RemarkMissed("memory", *sri,
251251
SourceLocInferenceBehavior::ForwardScanOnly)
252-
<< "retain";
252+
<< "retain of type '"
253+
<< NV("ValueType", sri->getOperand()->getType()) << "'";
253254
for (auto arg : inferredArgs) {
254255
remark << arg;
255256
}
@@ -269,7 +270,8 @@ void OptRemarkGeneratorInstructionVisitor::visitStrongReleaseInst(
269270

270271
auto remark = RemarkMissed("memory", *sri,
271272
SourceLocInferenceBehavior::BackwardScanOnly)
272-
<< "release";
273+
<< "release of type '"
274+
<< NV("ValueType", sri->getOperand()->getType()) << "'";
273275
for (auto arg : inferredArgs) {
274276
remark << arg;
275277
}
@@ -288,7 +290,8 @@ void OptRemarkGeneratorInstructionVisitor::visitRetainValueInst(
288290
// Retains begin a lifetime scope, so we infer scan forwards.
289291
auto remark = RemarkMissed("memory", *rvi,
290292
SourceLocInferenceBehavior::ForwardScanOnly)
291-
<< "retain";
293+
<< "retain of type '"
294+
<< NV("ValueType", rvi->getOperand()->getType()) << "'";
292295
for (auto arg : inferredArgs) {
293296
remark << arg;
294297
}
@@ -308,7 +311,8 @@ void OptRemarkGeneratorInstructionVisitor::visitReleaseValueInst(
308311
// Releases end a lifetime scope so we infer scan backward.
309312
auto remark = RemarkMissed("memory", *rvi,
310313
SourceLocInferenceBehavior::BackwardScanOnly)
311-
<< "release";
314+
<< "release of type '"
315+
<< NV("ValueType", rvi->getOperand()->getType()) << "'";
312316
for (auto arg : inferredArgs) {
313317
remark << arg;
314318
}

test/SILOptimizer/opt-remark-generator-yaml.swift

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,70 +7,78 @@
77
// works without burdening opt-remark-generator-yaml.swift with having to update all
88
// of the yaml test cases everytime new code is added.
99

10+
public class Klass {}
11+
12+
public var global = Klass()
13+
1014
// CHECK: --- !Missed
1115
// CHECK-NEXT: Pass: sil-opt-remark-gen
1216
// CHECK-NEXT: Name: sil.memory
1317
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
14-
// CHECK-NEXT: Line: 63, Column: 5 }
18+
// CHECK-NEXT: Line: [[# @LINE + 12]], Column: 5 }
1519
// CHECK-NEXT: Function: 'getGlobal()'
1620
// CHECK-NEXT: Args:
17-
// CHECK-NEXT: - String: retain
21+
// CHECK-NEXT: - String: 'retain of type '''
22+
// CHECK-NEXT: - ValueType: Klass
23+
// CHECK-NEXT: - String: ''''
1824
// CHECK-NEXT: - InferredValue: 'of ''global'''
1925
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
20-
// CHECK-NEXT: Line: 59, Column: 12 }
26+
// CHECK-NEXT: Line: [[# @LINE - 14]], Column: 12 }
2127
// CHECK-NEXT: ...
28+
@inline(never)
29+
public func getGlobal() -> Klass {
30+
return global // expected-remark @:5 {{retain of type 'Klass'}}
31+
// expected-note @-19:12 {{of 'global'}}
32+
}
33+
2234
// CHECK-NEXT: --- !Missed
2335
// CHECK-NEXT: Pass: sil-opt-remark-gen
2436
// CHECK-NEXT: Name: sil.memory
2537
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
26-
// CHECK-NEXT: Line: 71, Column: 5 }
38+
// CHECK-NEXT: Line: [[# @LINE + 40]], Column: 5 }
2739
// CHECK-NEXT: Function: 'useGlobal()'
2840
// CHECK-NEXT: Args:
29-
// CHECK-NEXT: - String: retain
41+
// CHECK-NEXT: - String: 'retain of type '''
42+
// CHECK-NEXT: - ValueType: Klass
43+
// CHECK-NEXT: - String: ''''
3044
// CHECK-NEXT: - InferredValue: 'of ''x'''
3145
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
32-
// CHECK-NEXT: Line: 68, Column: 9 }
46+
// CHECK-NEXT: Line: [[# @LINE + 29]], Column: 9 }
3347
// CHECK-NEXT: ...
3448
// CHECK-NEXT: --- !Missed
3549
// CHECK-NEXT: Pass: sil-opt-remark-gen
3650
// CHECK-NEXT: Name: sil.memory
3751
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
38-
// CHECK-NEXT: Line: 71, Column: 12 }
52+
// CHECK-NEXT: Line: [[# @LINE + 26]], Column: 12 }
3953
// CHECK-NEXT: Function: 'useGlobal()'
4054
// CHECK-NEXT: Args:
41-
// CHECK-NEXT: - String: release
42-
55+
// CHECK-NEXT: - String: 'release of type '''
56+
// CHECK-NEXT: - ValueType: {{'Array<Any>'|__ContiguousArrayStorageBase}}
57+
// CHECK-NEXT: - String: ''''
4358
// CHECK-NEXT: ...
4459
// CHECK-NEXT: --- !Missed
4560
// CHECK-NEXT: Pass: sil-opt-remark-gen
4661
// CHECK-NEXT: Name: sil.memory
4762
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
48-
// CHECK-NEXT: Line: 71, Column: 12 }
63+
// CHECK-NEXT: Line: [[# @LINE + 15]], Column: 12 }
4964
// CHECK-NEXT: Function: 'useGlobal()'
5065
// CHECK-NEXT: Args:
51-
// CHECK-NEXT: - String: release
66+
// CHECK-NEXT: - String: 'release of type '''
67+
// CHECK-NEXT: - ValueType: Klass
68+
// CHECK-NEXT: - String: ''''
5269
// CHECK-NEXT: - InferredValue: 'of ''x'''
5370
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator-yaml.swift',
54-
// CHECK-NEXT: Line: 68, Column: 9 }
71+
// CHECK-NEXT: Line: [[# @LINE + 4]], Column: 9 }
5572
// CHECK-NEXT: ...
5673

57-
public class Klass {}
58-
59-
public var global = Klass()
60-
61-
@inline(never)
62-
public func getGlobal() -> Klass {
63-
return global // expected-remark @:5 {{retain}}
64-
// expected-note @-5:12 {{of 'global'}}
65-
}
66-
6774
public func useGlobal() {
6875
let x = getGlobal()
6976
// Make sure that the retain msg is at the beginning of the print and the
7077
// releases are the end of the print.
71-
print(x) // expected-remark @:5 {{retain}}
78+
print(x) // expected-remark @:5 {{retain of type 'Klass'}}
7279
// expected-note @-4:9 {{of 'x'}}
73-
// expected-remark @-2:12 {{release}}
74-
// expected-remark @-3:12 {{release}}
75-
// expected-note @-7:9 {{of 'x'}}
80+
// We test the type emission above since FileCheck can handle regex.
81+
// expected-remark @-3:12 {{release of type}}
82+
// expected-remark @-4:12 {{release of type 'Klass'}}
83+
// expected-note @-8:9 {{of 'x'}}
7684
}

test/SILOptimizer/opt-remark-generator.sil

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import Builtin
66

77
sil @foo : $@convention(thin) (@guaranteed Builtin.NativeObject) -> () {
88
bb0(%0 : $Builtin.NativeObject):
9-
strong_retain %0 : $Builtin.NativeObject // expected-remark {{retain}}
10-
retain_value %0 : $Builtin.NativeObject // expected-remark {{retain}}
11-
strong_release %0 : $Builtin.NativeObject // expected-remark {{release}}
12-
release_value %0 : $Builtin.NativeObject // expected-remark {{release}}
9+
strong_retain %0 : $Builtin.NativeObject // expected-remark {{retain of type 'Builtin.NativeObject'}}
10+
retain_value %0 : $Builtin.NativeObject // expected-remark {{retain of type 'Builtin.NativeObject'}}
11+
strong_release %0 : $Builtin.NativeObject // expected-remark {{release of type 'Builtin.NativeObject'}}
12+
release_value %0 : $Builtin.NativeObject // expected-remark {{release of type 'Builtin.NativeObject'}}
1313
%9999 = tuple()
1414
return %9999 : $()
1515
}

0 commit comments

Comments
 (0)