Commit cf6ad387 authored by Omer Katz's avatar Omer Katz Committed by V8 LUCI CQ

cppgc: Revise WeakContainerTest.*

For some reason the compiler was optimizing away the reference to the
object in WeakContainerTest.ConservativeGCTracesWeakContainer and thus
not finding it conservatively.
This CL revises the tests such that the compiler is no longer able to
optimize references away.

Bug: v8:12824
Change-Id: Ie598a1cf1124c2983a6c61fd4e990734d36f5832
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3610627Reviewed-by: 's avatarMichael Lippautz <mlippautz@chromium.org>
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Reviewed-by: 's avatarAnton Bikineev <bikineev@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80257}
parent 42138ac2
...@@ -56,24 +56,17 @@ class TraceableGCed : public GarbageCollected<TraceableGCed> { ...@@ -56,24 +56,17 @@ class TraceableGCed : public GarbageCollected<TraceableGCed> {
reinterpret_cast<std::atomic<size_t>*>(&n_trace_calls) reinterpret_cast<std::atomic<size_t>*>(&n_trace_calls)
->fetch_add(1, std::memory_order_relaxed); ->fetch_add(1, std::memory_order_relaxed);
} }
static size_t n_trace_calls; mutable size_t n_trace_calls = 0;
}; };
size_t TraceableGCed::n_trace_calls = 0u;
class NonTraceableGCed : public GarbageCollected<NonTraceableGCed> { class NonTraceableGCed : public GarbageCollected<NonTraceableGCed> {
public: public:
void Trace(cppgc::Visitor*) const { n_trace_calls++; } void Trace(cppgc::Visitor*) const { n_trace_calls++; }
static size_t n_trace_calls; mutable size_t n_trace_calls = 0;
}; };
size_t NonTraceableGCed::n_trace_calls = 0u;
void EmptyWeakCallback(const LivenessBroker&, const void*) {} void EmptyWeakCallback(const LivenessBroker&, const void*) {}
template <typename T>
V8_NOINLINE T access(volatile const T& t) {
return t;
}
} // namespace } // namespace
} // namespace internal } // namespace internal
...@@ -99,61 +92,56 @@ namespace internal { ...@@ -99,61 +92,56 @@ namespace internal {
TEST_F(WeakContainerTest, TraceableGCedTraced) { TEST_F(WeakContainerTest, TraceableGCedTraced) {
TraceableGCed* obj = TraceableGCed* obj =
MakeGarbageCollected<TraceableGCed>(GetAllocationHandle()); MakeGarbageCollected<TraceableGCed>(GetAllocationHandle());
TraceableGCed::n_trace_calls = 0u; obj->n_trace_calls = 0u;
StartMarking(); StartMarking();
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr); GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
FinishMarking(Config::StackState::kNoHeapPointers); FinishMarking(Config::StackState::kNoHeapPointers);
EXPECT_NE(0u, TraceableGCed::n_trace_calls); EXPECT_NE(0u, obj->n_trace_calls);
EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes()); EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
access(obj);
} }
TEST_F(WeakContainerTest, NonTraceableGCedNotTraced) { TEST_F(WeakContainerTest, NonTraceableGCedNotTraced) {
NonTraceableGCed* obj = NonTraceableGCed* obj =
MakeGarbageCollected<NonTraceableGCed>(GetAllocationHandle()); MakeGarbageCollected<NonTraceableGCed>(GetAllocationHandle());
NonTraceableGCed::n_trace_calls = 0u; obj->n_trace_calls = 0u;
StartMarking(); StartMarking();
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr); GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
FinishMarking(Config::StackState::kNoHeapPointers); FinishMarking(Config::StackState::kNoHeapPointers);
EXPECT_EQ(0u, NonTraceableGCed::n_trace_calls); EXPECT_EQ(0u, obj->n_trace_calls);
EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes()); EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
access(obj);
} }
TEST_F(WeakContainerTest, NonTraceableGCedNotTracedConservatively) { TEST_F(WeakContainerTest, NonTraceableGCedNotTracedConservatively) {
NonTraceableGCed* obj = NonTraceableGCed* obj =
MakeGarbageCollected<NonTraceableGCed>(GetAllocationHandle()); MakeGarbageCollected<NonTraceableGCed>(GetAllocationHandle());
NonTraceableGCed::n_trace_calls = 0u; obj->n_trace_calls = 0u;
StartMarking(); StartMarking();
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr); GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
FinishMarking(Config::StackState::kMayContainHeapPointers); FinishMarking(Config::StackState::kMayContainHeapPointers);
EXPECT_NE(0u, NonTraceableGCed::n_trace_calls); EXPECT_NE(0u, obj->n_trace_calls);
EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes()); EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
access(obj);
} }
TEST_F(WeakContainerTest, PreciseGCTracesWeakContainerWhenTraced) { TEST_F(WeakContainerTest, PreciseGCTracesWeakContainerWhenTraced) {
TraceableGCed* obj = TraceableGCed* obj =
MakeGarbageCollected<TraceableGCed>(GetAllocationHandle()); MakeGarbageCollected<TraceableGCed>(GetAllocationHandle());
TraceableGCed::n_trace_calls = 0u; obj->n_trace_calls = 0u;
StartMarking(); StartMarking();
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr); GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
FinishMarking(Config::StackState::kNoHeapPointers); FinishMarking(Config::StackState::kNoHeapPointers);
EXPECT_EQ(1u, TraceableGCed::n_trace_calls); EXPECT_EQ(1u, obj->n_trace_calls);
EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes()); EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
access(obj);
} }
TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainer) { TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainer) {
TraceableGCed* obj = TraceableGCed* obj =
MakeGarbageCollected<TraceableGCed>(GetAllocationHandle()); MakeGarbageCollected<TraceableGCed>(GetAllocationHandle());
TraceableGCed::n_trace_calls = 0u; obj->n_trace_calls = 0u;
StartMarking(); StartMarking();
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr); GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
FinishMarking(Config::StackState::kMayContainHeapPointers); FinishMarking(Config::StackState::kMayContainHeapPointers);
EXPECT_EQ(2u, TraceableGCed::n_trace_calls); EXPECT_EQ(2u, obj->n_trace_calls);
EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes()); EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
access(obj);
} }
TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) { TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) {
...@@ -163,13 +151,12 @@ TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) { ...@@ -163,13 +151,12 @@ TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) {
USE(copy_obj); USE(copy_obj);
NonTraceableGCed* another_copy_obj = obj; NonTraceableGCed* another_copy_obj = obj;
USE(another_copy_obj); USE(another_copy_obj);
NonTraceableGCed::n_trace_calls = 0u; obj->n_trace_calls = 0u;
StartMarking(); StartMarking();
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr); GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
FinishMarking(Config::StackState::kMayContainHeapPointers); FinishMarking(Config::StackState::kMayContainHeapPointers);
EXPECT_EQ(1u, NonTraceableGCed::n_trace_calls); EXPECT_EQ(1u, obj->n_trace_calls);
EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes()); EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
access(obj);
} }
namespace { namespace {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment