22 import 'dart:_internal' show reachabilityFence;
30 void someFunction(int arg) {
35 final object = A()..a = 10;
36 someFunction(object.a%s);
37 reachabilityFence(object);
45 Invoke(root_library,
"main");
50 ASSERT(flow_graph !=
nullptr);
66 {kMatchAndMoveAllocateObject, &allocate_object},
69 kMatchAndMoveStoreStaticField,
71 {kMatchAndMoveReachabilityFence, &fence},
74 EXPECT(fence->value()->definition() == allocate_object);
80 Utils::CStringUniquePtr(OS::SCreate(
nullptr, R
"(
81 import 'dart:_internal' show reachabilityFence;
89 @pragma('vm:never-inline')
94 void someFunction(int arg) {
99 final object = makeSomeA();
100 for(int i = 0; i < 100000; i++) {
101 someFunction(object.a%s);
102 reachabilityFence(object);
105 )", TestCase::NullableTag(), TestCase::NullAssertTag()), std::free);
108 const auto& root_library = Library::Handle(
LoadTestScript(kScript.get()));
110 Invoke(root_library,
"main");
113 TestPipeline pipeline(
function, CompilerPass::kJIT);
114 FlowGraph* flow_graph = pipeline.RunPasses({});
115 ASSERT(flow_graph !=
nullptr);
117 auto entry = flow_graph->graph_entry()->normal_entry();
120 StaticCallInstr*
object =
nullptr;
121 LoadFieldInstr* field_load =
nullptr;
122 ReachabilityFenceInstr* fence =
nullptr;
128 {kMatchAndMoveStaticCall, &object},
130 {kMatchAndMoveLoadField, &field_load},
132 kMatchAndMoveBranchTrue,
134 {kMatchAndMoveReachabilityFence, &fence},
138 EXPECT(field_load->instance()->definition() ==
object);
139 EXPECT(fence->value()->definition() ==
object);
145 Utils::CStringUniquePtr(OS::SCreate(
nullptr, R
"(
146 import 'dart:_internal' show reachabilityFence;
154 @pragma('vm:never-inline')
159 void someFunction(int arg) {
164 final object = makeSomeA();
165 reachabilityFence(object);
166 for(int i = 0; i < 100000; i++) {
167 someFunction(object.a%s);
168 reachabilityFence(object);
170 reachabilityFence(object);
171 reachabilityFence(object);
173 )", TestCase::NullableTag(), TestCase::NullAssertTag()), std::free);
176 const auto& root_library = Library::Handle(
LoadTestScript(kScript.get()));
178 Invoke(root_library,
"main");
181 TestPipeline pipeline(
function, CompilerPass::kJIT);
182 FlowGraph* flow_graph = pipeline.RunPasses({});
183 ASSERT(flow_graph !=
nullptr);
185 auto entry = flow_graph->graph_entry()->normal_entry();
188 StaticCallInstr*
object =
nullptr;
189 ReachabilityFenceInstr* fence1 =
nullptr;
190 ReachabilityFenceInstr* fence2 =
nullptr;
191 ReachabilityFenceInstr* fence3 =
nullptr;
192 ReachabilityFenceInstr* fence4 =
nullptr;
194 ILMatcher cursor(flow_graph, entry);
197 {kMatchAndMoveStaticCall, &object},
198 {kMatchAndMoveReachabilityFence, &fence1},
199 kMatchAndMoveBranchTrue,
200 {kMatchAndMoveReachabilityFence, &fence2},
201 kMatchAndMoveBranchFalse,
202 {kMatchAndMoveReachabilityFence, &fence3},
203 {kMatchAndMoveReachabilityFence, &fence4},
207 EXPECT(fence1->value()->definition() ==
object);
208 EXPECT(fence2->value()->definition() ==
object);
209 EXPECT(fence3->value()->definition() ==
object);
210 EXPECT(fence4->value()->definition() ==
object);
#define RELEASE_ASSERT(cond)
GraphEntryInstr * graph_entry() const
FunctionEntryInstr * normal_entry() const
static char * SCreate(Zone *zone, const char *format,...) PRINTF_ATTRIBUTE(2
static const char * NullAssertTag()
static const char * NullableTag()
FlowGraph * RunPasses(std::initializer_list< CompilerPass::Id > passes)
std::unique_ptr< char, decltype(std::free) * > CStringUniquePtr
Dart_NativeFunction function
LibraryPtr LoadTestScript(const char *script, Dart_NativeEntryResolver resolver, const char *lib_uri)
ObjectPtr Invoke(const Library &lib, const char *name)
FunctionPtr GetFunction(const Library &lib, const char *name)
#define ISOLATE_UNIT_TEST_CASE(name)