Skip to content

Commit a740471

Browse files
authored
Merge pull request swiftlang#33024 from gottesmm/pr-5c5c78e98bdffbe1da91f38512d5c62904b8a68b
[opt-remark] Teach arg inference how to handle simple loads from globals.
2 parents 493b4a8 + f8d0f47 commit a740471

File tree

2 files changed

+39
-21
lines changed

2 files changed

+39
-21
lines changed

lib/SIL/Utils/OptimizationRemark.cpp

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "swift/AST/DiagnosticsSIL.h"
2222
#include "swift/Demangling/Demangler.h"
2323
#include "swift/SIL/DebugUtils.h"
24+
#include "swift/SIL/InstructionUtils.h"
25+
#include "swift/SIL/MemAccessUtils.h"
2426
#include "swift/SIL/SILArgument.h"
2527
#include "swift/SIL/SILInstruction.h"
2628
#include "swift/SIL/SILRemarkStreamer.h"
@@ -78,23 +80,37 @@ Argument::Argument(StringRef key, CanType ty)
7880
bool Argument::inferArgumentsForValue(
7981
ArgumentKeyKind keyKind, StringRef msg, SILValue value,
8082
function_ref<bool(Argument)> funcPassedInferedArgs) {
81-
// If we have an argument, just use that.
82-
if (auto *arg = dyn_cast<SILArgument>(value))
83-
if (auto *decl = arg->getDecl())
84-
return funcPassedInferedArgs(
85-
Argument({keyKind, "InferredValue"}, msg, decl));
86-
87-
// TODO: Look for loads from globals and addresses.
88-
89-
// Otherwise, look for debug_values.
90-
for (auto *use : getDebugUses(value))
91-
if (auto *dvi = dyn_cast<DebugValueInst>(use->getUser()))
92-
if (auto *decl = dvi->getDecl())
83+
84+
while (true) {
85+
// If we have an argument, just use that.
86+
if (auto *arg = dyn_cast<SILArgument>(value))
87+
if (auto *decl = arg->getDecl())
88+
return funcPassedInferedArgs(
89+
Argument({keyKind, "InferredValue"}, msg, decl));
90+
91+
// Otherwise, look for debug_values.
92+
for (auto *use : getDebugUses(value))
93+
if (auto *dvi = dyn_cast<DebugValueInst>(use->getUser()))
94+
if (auto *decl = dvi->getDecl())
95+
if (!funcPassedInferedArgs(
96+
Argument({keyKind, "InferredValue"}, msg, decl)))
97+
return false;
98+
99+
// If we have a load, look through it and continue. We may have a global or
100+
// a function argument.
101+
if (auto *li = dyn_cast<LoadInst>(value)) {
102+
value = stripAccessMarkers(li->getOperand());
103+
continue;
104+
}
105+
106+
if (auto *ga = dyn_cast<GlobalAddrInst>(value))
107+
if (auto *decl = ga->getReferencedGlobal()->getDecl())
93108
if (!funcPassedInferedArgs(
94109
Argument({keyKind, "InferredValue"}, msg, decl)))
95110
return false;
96111

97-
return true;
112+
return true;
113+
}
98114
}
99115

100116
template <typename DerivedT>

test/SILOptimizer/opt-remark-generator.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,31 @@
77
// CHECK-NEXT: Pass: sil-opt-remark-gen
88
// CHECK-NEXT: Name: sil.memory-management
99
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
10-
// CHECK-NEXT: Line: 57, Column: 5 }
10+
// CHECK-NEXT: Line: 59, Column: 5 }
1111
// CHECK-NEXT: Function: 'getGlobal()'
1212
// CHECK-NEXT: Args:
1313
// CHECK-NEXT: - String: 'Found retain:'
14-
// CHECK-NEXT: - InferValueFailure: Unable to infer any values being retained.
14+
// CHECK-NEXT: - InferredValue: 'on value:'
15+
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
16+
// CHECK-NEXT: Line: 55, Column: 12 }
1517
// CHECK-NEXT: ...
1618
// CHECK-NEXT: --- !Missed
1719
// CHECK-NEXT: Pass: sil-opt-remark-gen
1820
// CHECK-NEXT: Name: sil.memory-management
1921
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
20-
// CHECK-NEXT: Line: 65, Column: 5 }
22+
// CHECK-NEXT: Line: 67, Column: 5 }
2123
// CHECK-NEXT: Function: 'useGlobal()'
2224
// CHECK-NEXT: Args:
2325
// CHECK-NEXT: - String: 'Found retain:'
2426
// CHECK-NEXT: - InferredValue: 'on value:'
2527
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
26-
// CHECK-NEXT: Line: 62, Column: 9 }
28+
// CHECK-NEXT: Line: 64, Column: 9 }
2729
// CHECK-NEXT: ...
2830
// CHECK-NEXT: --- !Missed
2931
// CHECK-NEXT: Pass: sil-opt-remark-gen
3032
// CHECK-NEXT: Name: sil.memory-management
3133
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
32-
// CHECK-NEXT: Line: 65, Column: 12 }
34+
// CHECK-NEXT: Line: 67, Column: 12 }
3335
// CHECK-NEXT: Function: 'useGlobal()'
3436
// CHECK-NEXT: Args:
3537
// CHECK-NEXT: - String: 'Found release:'
@@ -39,13 +41,13 @@
3941
// CHECK-NEXT: Pass: sil-opt-remark-gen
4042
// CHECK-NEXT: Name: sil.memory-management
4143
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
42-
// CHECK-NEXT: Line: 65, Column: 12 }
44+
// CHECK-NEXT: Line: 67, Column: 12 }
4345
// CHECK-NEXT: Function: 'useGlobal()'
4446
// CHECK-NEXT: Args:
4547
// CHECK-NEXT: - String: 'Found release:'
4648
// CHECK-NEXT: - InferredValue: 'on value:'
4749
// CHECK-NEXT: DebugLoc: { File: '{{.*}}opt-remark-generator.swift',
48-
// CHECK-NEXT: Line: 62, Column: 9 }
50+
// CHECK-NEXT: Line: 64, Column: 9 }
4951
// CHECK-NEXT: ...
5052

5153
public class Klass {}
@@ -55,7 +57,7 @@ public var global = Klass()
5557
@inline(never)
5658
public func getGlobal() -> Klass {
5759
return global // expected-remark @:5 {{Found retain:}}
58-
// expected-note @-1:5 {{Unable to infer any values being retained.}}
60+
// expected-note @-5:12 {{on value:}}
5961
}
6062

6163
public func useGlobal() {

0 commit comments

Comments
 (0)