Skip to content

Commit 195bd1b

Browse files
mkustermanncommit-bot@chromium.org
authored andcommitted
[VM] Allow the inlining code to inline implicit getters even if a StaticCallInstr is used
We have devirtualization logic which turns [InstanceCallInst]s to [StaticCallInstr]s (which are subject to different optimizations). This makes the inlining decisions done in dart-aot-v2 a little bit closer to dart-aot. Issue #31798 Change-Id: If7961ad8f05ac2544f04044d05541a86a8074984 Reviewed-on: https://dart-review.googlesource.com/34000 Reviewed-by: Vyacheslav Egorov <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent 7855487 commit 195bd1b

File tree

5 files changed

+30
-1
lines changed

5 files changed

+30
-1
lines changed

runtime/vm/compiler/aot/aot_call_specializer.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,17 @@ bool AotCallSpecializer::TryInlineFieldAccess(InstanceCallInstr* call) {
251251
return false;
252252
}
253253

254+
bool AotCallSpecializer::TryInlineFieldAccess(StaticCallInstr* call) {
255+
if (call->function().IsImplicitGetterFunction()) {
256+
const Field& field =
257+
Field::Handle(call->function().LookupImplicitGetterSetterField());
258+
InlineImplicitInstanceGetter(call, field);
259+
return true;
260+
}
261+
262+
return false;
263+
}
264+
254265
Value* AotCallSpecializer::PrepareStaticOpInput(Value* input,
255266
intptr_t cid,
256267
Instruction* call) {
@@ -825,6 +836,13 @@ void AotCallSpecializer::VisitInstanceCall(InstanceCallInstr* instr) {
825836
}
826837
}
827838

839+
void AotCallSpecializer::VisitStaticCall(StaticCallInstr* instr) {
840+
if (TryInlineFieldAccess(instr)) {
841+
return;
842+
}
843+
CallSpecializer::VisitStaticCall(instr);
844+
}
845+
828846
bool AotCallSpecializer::TryExpandCallThroughGetter(const Class& receiver_class,
829847
InstanceCallInstr* call) {
830848
// If it's an accessor call it can't be a call through getter.

runtime/vm/compiler/aot/aot_call_specializer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class AotCallSpecializer : public CallSpecializer {
2626
void ReplaceArrayBoundChecks();
2727

2828
virtual void VisitInstanceCall(InstanceCallInstr* instr);
29+
virtual void VisitStaticCall(StaticCallInstr* instr);
2930
virtual void VisitPolymorphicInstanceCall(
3031
PolymorphicInstanceCallInstr* instr);
3132

@@ -44,6 +45,7 @@ class AotCallSpecializer : public CallSpecializer {
4445
bool TryReplaceWithHaveSameRuntimeType(InstanceCallInstr* call);
4546

4647
bool TryInlineFieldAccess(InstanceCallInstr* call);
48+
bool TryInlineFieldAccess(StaticCallInstr* call);
4749

4850
Value* PrepareStaticOpInput(Value* input, intptr_t cid, Instruction* call);
4951

runtime/vm/compiler/backend/inliner.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,8 @@ class CallSiteInliner : public ValueObject {
10691069
// before 'SelectRepresentations' which inserts conversion nodes.
10701070
callee_graph->TryOptimizePatterns();
10711071
DEBUG_ASSERT(callee_graph->VerifyUseLists());
1072+
1073+
callee_graph->Canonicalize();
10721074
#else
10731075
UNREACHABLE();
10741076
#endif // DART_PRECOMPILER

runtime/vm/compiler/call_specializer.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,12 @@ bool CallSpecializer::TryInlineImplicitInstanceGetter(InstanceCallInstr* call) {
878878

879879
AddReceiverCheck(call);
880880
}
881+
InlineImplicitInstanceGetter(call, field);
882+
return true;
883+
}
884+
885+
void CallSpecializer::InlineImplicitInstanceGetter(Definition* call,
886+
const Field& field) {
881887
LoadFieldInstr* load = new (Z) LoadFieldInstr(
882888
new (Z) Value(call->ArgumentAt(0)), &field,
883889
AbstractType::ZoneHandle(Z, field.type()), call->token_pos(),
@@ -895,7 +901,6 @@ bool CallSpecializer::TryInlineImplicitInstanceGetter(InstanceCallInstr* call) {
895901
it.Current()->SetReachingType(NULL);
896902
}
897903
}
898-
return true;
899904
}
900905

901906
bool CallSpecializer::TryInlineInstanceSetter(InstanceCallInstr* instr,

runtime/vm/compiler/call_specializer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ class CallSpecializer : public FlowGraphVisitor {
111111
virtual bool TryOptimizeStaticCallUsingStaticTypes(StaticCallInstr* call) = 0;
112112

113113
protected:
114+
void InlineImplicitInstanceGetter(Definition* call, const Field& field);
115+
114116
SpeculativeInliningPolicy* speculative_policy_;
115117

116118
private:

0 commit comments

Comments
 (0)