Commit f25656ae authored by Stephan Herhut's avatar Stephan Herhut Committed by Commit Bot

[wasm] Avoid zero extension after truncate

In wasm code, we sometimes see the pattern

<some 64 bit expression>
i32.wrap/i64
i32.load

where we generate an instruction to extend the 32 bit offset into a zero
extended 64 bit value for the actual load. However, the preceeding
truncate already yields a zero extended 32 bit value, so the extra
instruction is not needed. Even more, it might get in the way of
munching more computation into the final load.

This change adds information about the zero extending behavior to
the existing optimization that avoids the zero extension.

Bug: chromium:853685
Change-Id: Iab9179379923ecb88651df6091b3d9408341cf4c
Reviewed-on: https://chromium-review.googlesource.com/c/1421839Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
Commit-Queue: Stephan Herhut <herhut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58998}
parent 8a6d3118
......@@ -1210,6 +1210,7 @@ bool ZeroExtendsWord32ToWord64(Node* node) {
case IrOpcode::kUint32LessThanOrEqual:
case IrOpcode::kUint32Mod:
case IrOpcode::kUint32MulHigh:
case IrOpcode::kTruncateInt64ToInt32:
// These 32-bit operations implicitly zero-extend to 64-bit on x64, so the
// zero-extension is a no-op.
return true;
......@@ -1225,6 +1226,7 @@ bool ZeroExtendsWord32ToWord64(Node* node) {
}
}
case IrOpcode::kLoad:
case IrOpcode::kProtectedLoad:
case IrOpcode::kPoisonedLoad: {
// The movzxbl/movsxbl/movzxwl/movsxwl/movl operations implicitly
// zero-extend to 64-bit on x64, so the zero-extension is a no-op.
......@@ -1375,6 +1377,9 @@ void InstructionSelector::VisitTruncateFloat64ToWord32(Node* node) {
}
void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) {
// We rely on the fact that TruncateInt64ToInt32 zero extends the
// value (see ZeroExtendsWord32ToWord64). So all code paths here
// have to satisfy that condition.
X64OperandGenerator g(this);
Node* value = node->InputAt(0);
if (CanCover(node, value)) {
......
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