summaryrefslogtreecommitdiff
path: root/compiler/optimizing/nodes.h
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2024-01-22 08:57:31 +0000
committer Santiago Aboy Solanes <solanes@google.com> 2024-01-22 10:49:24 +0000
commitb5b98b9bb31acb2deffb692c50d0fbc71476663b (patch)
tree3bda094f8d5ea90ad34e5d357889ce4933f657f5 /compiler/optimizing/nodes.h
parentdbf9d9309f3df9c9ac8a9e30277b31ebb2977f4d (diff)
Revert^3 "Disable write-barrier elimination pass"
This reverts commit 9f8df195b7ff2ce47eec4e9b193ff3214ebed19c. Reason for revert: Fix for x86_64 with heap poison enabled This case uses a temp with index `1` in the regular FieldSet case. This is done like this due to GenerateVarHandleSet also calling HandleFieldSet. The bug was that we were allocating only one temp in the regular FieldSet case and therefore not having the temp with index `1` available. PS1 is the revert as-is. PS2 contains the fix. Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b Test: Same command with heap poison enabled too Bug: 301833859 Bug: 310755375 Bug: 260843353 Change-Id: Ie2740b4c443158c4e72810ce1d8268353c5f0055
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r--compiler/optimizing/nodes.h46
1 files changed, 25 insertions, 21 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 0efe8f4335..8dd89fa4e4 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -2903,6 +2903,10 @@ class HBackwardInstructionIterator : public ValueObject {
next_ = Done() ? nullptr : instruction_->GetPrevious();
}
+ explicit HBackwardInstructionIterator(HInstruction* instruction) : instruction_(instruction) {
+ next_ = Done() ? nullptr : instruction_->GetPrevious();
+ }
+
bool Done() const { return instruction_ == nullptr; }
HInstruction* Current() const { return instruction_; }
void Advance() {
@@ -6369,19 +6373,13 @@ class HInstanceFieldGet final : public HExpression<1> {
};
enum class WriteBarrierKind {
- // Emit the write barrier, with a runtime optimization which checks if the value that it is being
- // set is null.
- kEmitWithNullCheck,
- // Emit the write barrier, without the runtime null check optimization. This could be set because:
- // A) It is a write barrier for an ArraySet (which does the optimization with the type check, so
- // it never does the optimization at the write barrier stage)
- // B) We know that the input can't be null
- // C) This write barrier is actually several write barriers coalesced into one. Potentially we
- // could ask if every value is null for a runtime optimization at the cost of compile time / code
- // size. At the time of writing it was deemed not worth the effort.
- kEmitNoNullCheck,
+ // Emit the write barrier. This write barrier is not being relied on so e.g. codegen can decide to
+ // skip it if the value stored is null. This is the default behavior.
+ kEmitNotBeingReliedOn,
+ // Emit the write barrier. This write barrier is being relied on and must be emitted.
+ kEmitBeingReliedOn,
// Skip emitting the write barrier. This could be set because:
- // A) The write barrier is not needed (e.g. it is not a reference, or the value is the null
+ // A) The write barrier is not needed (i.e. it is not a reference, or the value is the null
// constant)
// B) This write barrier was coalesced into another one so there's no need to emit it.
kDontEmit,
@@ -6412,7 +6410,7 @@ class HInstanceFieldSet final : public HExpression<2> {
declaring_class_def_index,
dex_file) {
SetPackedFlag<kFlagValueCanBeNull>(true);
- SetPackedField<WriteBarrierKindField>(WriteBarrierKind::kEmitWithNullCheck);
+ SetPackedField<WriteBarrierKindField>(WriteBarrierKind::kEmitNotBeingReliedOn);
SetRawInputAt(0, object);
SetRawInputAt(1, value);
}
@@ -6433,8 +6431,11 @@ class HInstanceFieldSet final : public HExpression<2> {
void ClearValueCanBeNull() { SetPackedFlag<kFlagValueCanBeNull>(false); }
WriteBarrierKind GetWriteBarrierKind() { return GetPackedField<WriteBarrierKindField>(); }
void SetWriteBarrierKind(WriteBarrierKind kind) {
- DCHECK(kind != WriteBarrierKind::kEmitWithNullCheck)
+ DCHECK(kind != WriteBarrierKind::kEmitNotBeingReliedOn)
<< "We shouldn't go back to the original value.";
+ DCHECK_IMPLIES(kind == WriteBarrierKind::kDontEmit,
+ GetWriteBarrierKind() != WriteBarrierKind::kEmitBeingReliedOn)
+ << "If a write barrier was relied on by other write barriers, we cannot skip emitting it.";
SetPackedField<WriteBarrierKindField>(kind);
}
@@ -6576,8 +6577,7 @@ class HArraySet final : public HExpression<3> {
SetPackedFlag<kFlagNeedsTypeCheck>(value->GetType() == DataType::Type::kReference);
SetPackedFlag<kFlagValueCanBeNull>(true);
SetPackedFlag<kFlagStaticTypeOfArrayIsObjectArray>(false);
- // ArraySets never do the null check optimization at the write barrier stage.
- SetPackedField<WriteBarrierKindField>(WriteBarrierKind::kEmitNoNullCheck);
+ SetPackedField<WriteBarrierKindField>(WriteBarrierKind::kEmitNotBeingReliedOn);
SetRawInputAt(0, array);
SetRawInputAt(1, index);
SetRawInputAt(2, value);
@@ -6653,10 +6653,11 @@ class HArraySet final : public HExpression<3> {
WriteBarrierKind GetWriteBarrierKind() { return GetPackedField<WriteBarrierKindField>(); }
void SetWriteBarrierKind(WriteBarrierKind kind) {
- DCHECK(kind != WriteBarrierKind::kEmitNoNullCheck)
+ DCHECK(kind != WriteBarrierKind::kEmitNotBeingReliedOn)
<< "We shouldn't go back to the original value.";
- DCHECK(kind != WriteBarrierKind::kEmitWithNullCheck)
- << "We never do the null check optimization for ArraySets.";
+ DCHECK_IMPLIES(kind == WriteBarrierKind::kDontEmit,
+ GetWriteBarrierKind() != WriteBarrierKind::kEmitBeingReliedOn)
+ << "If a write barrier was relied on by other write barriers, we cannot skip emitting it.";
SetPackedField<WriteBarrierKindField>(kind);
}
@@ -7516,7 +7517,7 @@ class HStaticFieldSet final : public HExpression<2> {
declaring_class_def_index,
dex_file) {
SetPackedFlag<kFlagValueCanBeNull>(true);
- SetPackedField<WriteBarrierKindField>(WriteBarrierKind::kEmitWithNullCheck);
+ SetPackedField<WriteBarrierKindField>(WriteBarrierKind::kEmitNotBeingReliedOn);
SetRawInputAt(0, cls);
SetRawInputAt(1, value);
}
@@ -7534,8 +7535,11 @@ class HStaticFieldSet final : public HExpression<2> {
WriteBarrierKind GetWriteBarrierKind() { return GetPackedField<WriteBarrierKindField>(); }
void SetWriteBarrierKind(WriteBarrierKind kind) {
- DCHECK(kind != WriteBarrierKind::kEmitWithNullCheck)
+ DCHECK(kind != WriteBarrierKind::kEmitNotBeingReliedOn)
<< "We shouldn't go back to the original value.";
+ DCHECK_IMPLIES(kind == WriteBarrierKind::kDontEmit,
+ GetWriteBarrierKind() != WriteBarrierKind::kEmitBeingReliedOn)
+ << "If a write barrier was relied on by other write barriers, we cannot skip emitting it.";
SetPackedField<WriteBarrierKindField>(kind);
}