Commit 1c6d5369 authored by Manos Koukoutos's avatar Manos Koukoutos Committed by Commit Bot

[wasm][cleanup] Simplify smi conversions, rename one function

Changes:
- Rename Uint32ToUintptr() -> BuildChangeUint32ToUintPtr() for
  consistency.
- Simplify smi conversions.
- Remove an unneeded TruncateInt64ToInt32() conversion.

Change-Id: I6f3213fc57e03019d2cb26592ecd4db396bd01d5
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2817600Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Manos Koukoutos <manoskouk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#73893}
parent 4372cf44
...@@ -2944,7 +2944,7 @@ Node* WasmGraphBuilder::BuildImportCall(const wasm::FunctionSig* sig, ...@@ -2944,7 +2944,7 @@ Node* WasmGraphBuilder::BuildImportCall(const wasm::FunctionSig* sig,
Node* imported_function_refs = Node* imported_function_refs =
LOAD_INSTANCE_FIELD(ImportedFunctionRefs, MachineType::TaggedPointer()); LOAD_INSTANCE_FIELD(ImportedFunctionRefs, MachineType::TaggedPointer());
// Access fixed array at {header_size - tag + func_index * kTaggedSize}. // Access fixed array at {header_size - tag + func_index * kTaggedSize}.
Node* func_index_intptr = Uint32ToUintptr(func_index); Node* func_index_intptr = BuildChangeUint32ToUintPtr(func_index);
Node* ref_node = gasm_->LoadFixedArrayElement( Node* ref_node = gasm_->LoadFixedArrayElement(
imported_function_refs, func_index_intptr, MachineType::TaggedPointer()); imported_function_refs, func_index_intptr, MachineType::TaggedPointer());
...@@ -3080,7 +3080,7 @@ Node* WasmGraphBuilder::BuildIndirectCall(uint32_t table_index, ...@@ -3080,7 +3080,7 @@ Node* WasmGraphBuilder::BuildIndirectCall(uint32_t table_index,
table_type.is_nullable(); table_type.is_nullable();
if (needs_signature_check) { if (needs_signature_check) {
Node* int32_scaled_key = Node* int32_scaled_key =
Uint32ToUintptr(gasm_->Word32Shl(key, Int32Constant(2))); BuildChangeUint32ToUintPtr(gasm_->Word32Shl(key, Int32Constant(2)));
Node* loaded_sig = gasm_->LoadFromObject(MachineType::Int32(), ift_sig_ids, Node* loaded_sig = gasm_->LoadFromObject(MachineType::Int32(), ift_sig_ids,
int32_scaled_key); int32_scaled_key);
...@@ -3099,7 +3099,7 @@ Node* WasmGraphBuilder::BuildIndirectCall(uint32_t table_index, ...@@ -3099,7 +3099,7 @@ Node* WasmGraphBuilder::BuildIndirectCall(uint32_t table_index,
} }
} }
Node* key_intptr = Uint32ToUintptr(key); Node* key_intptr = BuildChangeUint32ToUintPtr(key);
Node* target_instance = gasm_->LoadFixedArrayElement( Node* target_instance = gasm_->LoadFixedArrayElement(
ift_instances, key_intptr, MachineType::TaggedPointer()); ift_instances, key_intptr, MachineType::TaggedPointer());
...@@ -3345,6 +3345,25 @@ Node* WasmGraphBuilder::BuildChangeIntPtrToInt64(Node* value) { ...@@ -3345,6 +3345,25 @@ Node* WasmGraphBuilder::BuildChangeIntPtrToInt64(Node* value) {
: value; : value;
} }
Node* WasmGraphBuilder::BuildChangeUint32ToUintPtr(Node* node) {
if (mcgraph()->machine()->Is32()) return node;
// Fold instances of ChangeUint32ToUint64(IntConstant) directly.
Uint32Matcher matcher(node);
if (matcher.HasResolvedValue()) {
uintptr_t value = matcher.ResolvedValue();
return mcgraph()->IntPtrConstant(bit_cast<intptr_t>(value));
}
return gasm_->ChangeUint32ToUint64(node);
}
Node* WasmGraphBuilder::BuildSmiShiftBitsConstant() {
return gasm_->IntPtrConstant(kSmiShiftSize + kSmiTagSize);
}
Node* WasmGraphBuilder::BuildSmiShiftBitsConstant32() {
return Int32Constant(kSmiShiftSize + kSmiTagSize);
}
Node* WasmGraphBuilder::BuildChangeInt32ToSmi(Node* value) { Node* WasmGraphBuilder::BuildChangeInt32ToSmi(Node* value) {
// With pointer compression, only the lower 32 bits are used. // With pointer compression, only the lower 32 bits are used.
return COMPRESS_POINTERS_BOOL return COMPRESS_POINTERS_BOOL
...@@ -3356,31 +3375,22 @@ Node* WasmGraphBuilder::BuildChangeInt32ToSmi(Node* value) { ...@@ -3356,31 +3375,22 @@ Node* WasmGraphBuilder::BuildChangeInt32ToSmi(Node* value) {
Node* WasmGraphBuilder::BuildChangeUint31ToSmi(Node* value) { Node* WasmGraphBuilder::BuildChangeUint31ToSmi(Node* value) {
return COMPRESS_POINTERS_BOOL return COMPRESS_POINTERS_BOOL
? gasm_->Word32Shl(value, BuildSmiShiftBitsConstant32()) ? gasm_->Word32Shl(value, BuildSmiShiftBitsConstant32())
: gasm_->WordShl(Uint32ToUintptr(value), : gasm_->WordShl(BuildChangeUint32ToUintPtr(value),
BuildSmiShiftBitsConstant()); BuildSmiShiftBitsConstant());
} }
Node* WasmGraphBuilder::BuildSmiShiftBitsConstant() {
return gasm_->IntPtrConstant(kSmiShiftSize + kSmiTagSize);
}
Node* WasmGraphBuilder::BuildSmiShiftBitsConstant32() {
return Int32Constant(kSmiShiftSize + kSmiTagSize);
}
Node* WasmGraphBuilder::BuildChangeSmiToInt32(Node* value) { Node* WasmGraphBuilder::BuildChangeSmiToInt32(Node* value) {
return COMPRESS_POINTERS_BOOL return COMPRESS_POINTERS_BOOL
? gasm_->Word32Sar(gasm_->TruncateInt64ToInt32(value), ? gasm_->Word32Sar(value, BuildSmiShiftBitsConstant32())
BuildSmiShiftBitsConstant32()) : BuildTruncateIntPtrToInt32(
: BuildTruncateIntPtrToInt32(BuildChangeSmiToIntPtr(value)); gasm_->WordSar(value, BuildSmiShiftBitsConstant()));
} }
Node* WasmGraphBuilder::BuildChangeSmiToIntPtr(Node* value) { Node* WasmGraphBuilder::BuildChangeSmiToIntPtr(Node* value) {
if (COMPRESS_POINTERS_BOOL) { return COMPRESS_POINTERS_BOOL
value = BuildChangeSmiToInt32(value); ? BuildChangeInt32ToIntPtr(
return BuildChangeInt32ToIntPtr(value); gasm_->Word32Sar(value, BuildSmiShiftBitsConstant32()))
} : gasm_->WordSar(value, BuildSmiShiftBitsConstant());
return gasm_->WordSar(value, BuildSmiShiftBitsConstant());
} }
Node* WasmGraphBuilder::BuildConvertUint32ToSmiWithSaturation(Node* value, Node* WasmGraphBuilder::BuildConvertUint32ToSmiWithSaturation(Node* value,
...@@ -3565,8 +3575,8 @@ void WasmGraphBuilder::GetBaseAndOffsetForImportedMutableExternRefGlobal( ...@@ -3565,8 +3575,8 @@ void WasmGraphBuilder::GetBaseAndOffsetForImportedMutableExternRefGlobal(
// From the index, calculate the actual offset in the FixedArray. This // From the index, calculate the actual offset in the FixedArray. This
// is kHeaderSize + (index * kTaggedSize). kHeaderSize can be acquired with // is kHeaderSize + (index * kTaggedSize). kHeaderSize can be acquired with
// wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(0). // wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(0).
Node* index_times_tagged_size = Node* index_times_tagged_size = gasm_->IntMul(
gasm_->IntMul(Uint32ToUintptr(index), Int32Constant(kTaggedSize)); BuildChangeUint32ToUintPtr(index), Int32Constant(kTaggedSize));
*offset = gasm_->IntAdd( *offset = gasm_->IntAdd(
index_times_tagged_size, index_times_tagged_size,
mcgraph()->IntPtrConstant( mcgraph()->IntPtrConstant(
...@@ -3763,7 +3773,7 @@ Node* WasmGraphBuilder::BoundsCheckMem(uint8_t access_size, Node* index, ...@@ -3763,7 +3773,7 @@ Node* WasmGraphBuilder::BoundsCheckMem(uint8_t access_size, Node* index,
wasm::WasmCodePosition position, wasm::WasmCodePosition position,
EnforceBoundsCheck enforce_check) { EnforceBoundsCheck enforce_check) {
DCHECK_LE(1, access_size); DCHECK_LE(1, access_size);
if (!env_->module->is_memory64) index = Uint32ToUintptr(index); if (!env_->module->is_memory64) index = BuildChangeUint32ToUintPtr(index);
if (!FLAG_wasm_bounds_checks) return index; if (!FLAG_wasm_bounds_checks) return index;
if (use_trap_handler() && enforce_check == kCanOmitBoundsCheck) { if (use_trap_handler() && enforce_check == kCanOmitBoundsCheck) {
...@@ -4317,7 +4327,7 @@ Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) { ...@@ -4317,7 +4327,7 @@ Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) {
// Note that we check against the memory size ignoring the size of the // Note that we check against the memory size ignoring the size of the
// stored value, which is conservative if misaligned. Technically, asm.js // stored value, which is conservative if misaligned. Technically, asm.js
// should never have misaligned accesses. // should never have misaligned accesses.
index = Uint32ToUintptr(index); index = BuildChangeUint32ToUintPtr(index);
Diamond bounds_check(graph(), mcgraph()->common(), Diamond bounds_check(graph(), mcgraph()->common(),
gasm_->UintLessThan(index, mem_size), BranchHint::kTrue); gasm_->UintLessThan(index, mem_size), BranchHint::kTrue);
bounds_check.Chain(control()); bounds_check.Chain(control());
...@@ -4356,17 +4366,6 @@ Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) { ...@@ -4356,17 +4366,6 @@ Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) {
return bounds_check.Phi(type.representation(), load, oob_value); return bounds_check.Phi(type.representation(), load, oob_value);
} }
Node* WasmGraphBuilder::Uint32ToUintptr(Node* node) {
if (mcgraph()->machine()->Is32()) return node;
// Fold instances of ChangeUint32ToUint64(IntConstant) directly.
Uint32Matcher matcher(node);
if (matcher.HasResolvedValue()) {
uintptr_t value = matcher.ResolvedValue();
return mcgraph()->IntPtrConstant(bit_cast<intptr_t>(value));
}
return gasm_->ChangeUint32ToUint64(node);
}
Node* WasmGraphBuilder::BuildAsmjsStoreMem(MachineType type, Node* index, Node* WasmGraphBuilder::BuildAsmjsStoreMem(MachineType type, Node* index,
Node* val) { Node* val) {
DCHECK_NOT_NULL(instance_cache_); DCHECK_NOT_NULL(instance_cache_);
...@@ -4391,7 +4390,7 @@ Node* WasmGraphBuilder::BuildAsmjsStoreMem(MachineType type, Node* index, ...@@ -4391,7 +4390,7 @@ Node* WasmGraphBuilder::BuildAsmjsStoreMem(MachineType type, Node* index,
index = gasm_->Word32And(index, mem_mask); index = gasm_->Word32And(index, mem_mask);
} }
index = Uint32ToUintptr(index); index = BuildChangeUint32ToUintPtr(index);
const Operator* store_op = mcgraph()->machine()->Store(StoreRepresentation( const Operator* store_op = mcgraph()->machine()->Store(StoreRepresentation(
type.representation(), WriteBarrierKind::kNoWriteBarrier)); type.representation(), WriteBarrierKind::kNoWriteBarrier));
Node* store = graph()->NewNode(store_op, mem_start, index, val, effect(), Node* store = graph()->NewNode(store_op, mem_start, index, val, effect(),
......
...@@ -530,7 +530,6 @@ class WasmGraphBuilder { ...@@ -530,7 +530,6 @@ class WasmGraphBuilder {
Node* CheckBoundsAndAlignment(int8_t access_size, Node* index, Node* CheckBoundsAndAlignment(int8_t access_size, Node* index,
uint64_t offset, wasm::WasmCodePosition); uint64_t offset, wasm::WasmCodePosition);
Node* Uint32ToUintptr(Node*);
const Operator* GetSafeLoadOperator(int offset, wasm::ValueType type); const Operator* GetSafeLoadOperator(int offset, wasm::ValueType type);
const Operator* GetSafeStoreOperator(int offset, wasm::ValueType type); const Operator* GetSafeStoreOperator(int offset, wasm::ValueType type);
Node* BuildChangeEndiannessStore(Node* node, MachineRepresentation rep, Node* BuildChangeEndiannessStore(Node* node, MachineRepresentation rep,
...@@ -631,6 +630,7 @@ class WasmGraphBuilder { ...@@ -631,6 +630,7 @@ class WasmGraphBuilder {
Node* BuildTruncateIntPtrToInt32(Node* value); Node* BuildTruncateIntPtrToInt32(Node* value);
Node* BuildChangeInt32ToIntPtr(Node* value); Node* BuildChangeInt32ToIntPtr(Node* value);
Node* BuildChangeIntPtrToInt64(Node* value); Node* BuildChangeIntPtrToInt64(Node* value);
Node* BuildChangeUint32ToUintPtr(Node*);
Node* BuildChangeInt32ToSmi(Node* value); Node* BuildChangeInt32ToSmi(Node* value);
Node* BuildChangeUint31ToSmi(Node* value); Node* BuildChangeUint31ToSmi(Node* value);
Node* BuildSmiShiftBitsConstant(); Node* BuildSmiShiftBitsConstant();
......
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