[wasm] Fold constant to pointer conversion

On 64 bit architectures, reading memory in wasm requires a conversion
of the 32 bit index into a 64 bit value. For this, we generate a
ChangeUint32ToUint64 graph node, which later materializes as a move
and hence consumes a register. This generates unneccesary register
pressure, especially with gvn enabled.

Now, the WasmGraphBuilder will emit a IntPtrConstant node right
away if the index is a constant.

Change-Id: Id8d7efa90c6bd8e4d7b6419e2075802dfc1eb383
Reviewed-on: https://chromium-review.googlesource.com/1099061
Commit-Queue: Stephan Herhut <herhut@chromium.org>
Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53726}
This commit is contained in:
Stephan Herhut 2018-06-13 16:27:38 +02:00 committed by Commit Bot
parent d2e1620cd4
commit 83864aa236

View File

@ -3318,6 +3318,12 @@ Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) {
Node* WasmGraphBuilder::Uint32ToUintptr(Node* node) {
if (mcgraph()->machine()->Is32()) return node;
// Fold instances of ChangeUint32ToUint64(IntConstant) directly.
UintPtrMatcher matcher(node);
if (matcher.HasValue()) {
uintptr_t value = matcher.Value();
return mcgraph()->IntPtrConstant(bit_cast<intptr_t>(value));
}
return graph()->NewNode(mcgraph()->machine()->ChangeUint32ToUint64(), node);
}