Closed Bug 1940907 Opened 2 months ago Closed 2 months ago

Add folding for MSameValue and MSameValueDouble

Categories

(Core :: JavaScript Engine: JIT, enhancement, P1)

enhancement

Tracking

()

RESOLVED FIXED
136 Branch
Tracking Status
firefox136 --- fixed

People

(Reporter: anba, Assigned: anba)

References

(Blocks 1 open bug)

Details

Attachments

(8 files)

  • MSameValue can fold to MCompare::Compare_Null when one operand is guaranteed to be null.
  • MSameValue can fold to MCompare::Compare_Undefined when one operand is guaranteed to be undefined.
  • MSameValueDouble can fold to MCompare::Compare_Double when one operand is either NaN or non-zero.
  • MSameValueDouble can fold to bitwise comparison when one operand is +/-0.

Without constant folding, if (Object.is(x, NaN)) { ... } compiled to:

[Codegen]                                 # LIR=SameValueDouble
[Codegen] vucomisd   %xmm0, %xmm1
[Codegen] jne        .Lfrom912
[Codegen] jp         .Lfrom918
[Codegen] xorpd      %xmm2, %xmm2
[Codegen] vucomisd   %xmm2, %xmm1
[Codegen] jne        .Lfrom932
[Codegen] movsd      .Lfrom940(%rip), %xmm2
[Codegen] divsd      %xmm1, %xmm2
[Codegen] vucomisd   %xmm2, %xmm1
[Codegen] ja         .Lfrom954
[Codegen] movsd      .Lfrom962(%rip), %xmm2
[Codegen] divsd      %xmm0, %xmm2
[Codegen] vucomisd   %xmm0, %xmm2
[Codegen] ja         .Lfrom976
[Codegen] jmp        .Lfrom981
[Codegen] .set .Lfrom954
[Codegen] movsd      .Lfrom989(%rip), %xmm2
[Codegen] divsd      %xmm0, %xmm2
[Codegen] vucomisd   %xmm2, %xmm0
[Codegen] ja         .Lfrom1003
[Codegen] jmp        .Lfrom1008
[Codegen] .set .Lfrom918
[Codegen] .set .Lfrom912
[Codegen] vucomisd   %xmm1, %xmm1
[Codegen] jnp        .Lfrom1018
[Codegen] vucomisd   %xmm0, %xmm0
[Codegen] jnp        .Lfrom1028
[Codegen] .set .Lfrom1003
[Codegen] .set .Lfrom976
[Codegen] .set .Lfrom932
[Codegen] movl       $0x1, %ecx
[Codegen] jmp        .Lfrom1038
[Codegen] .set .Lfrom1028
[Codegen] .set .Lfrom1018
[Codegen] .set .Lfrom1008
[Codegen] .set .Lfrom981
[Codegen] xorl       %ecx, %ecx
[Codegen] .set .Lfrom1038
[Codegen]                                 # LIR=TestIAndBranch
[Codegen] testl      %ecx, %ecx
[Codegen] je         .Lfrom1048

With this change it compiles to:

[Codegen]                                 # LIR=CompareDAndBranch
[Codegen] vucomisd   %xmm0, %xmm0
[Codegen] jp         .Lfrom904
[Codegen] je         .Lfrom910

Improves the codegen for if (Object.is(x, Nan)) { ... } from:

[Codegen]                                 # LIR=CompareDAndBranch
[Codegen] vucomisd   %xmm0, %xmm0
[Codegen] jp         .Lfrom904
[Codegen] je         .Lfrom910

to:

[Codegen]                                 # LIR=CompareDAndBranch
[Codegen] vucomisd   %xmm0, %xmm0
[Codegen] jnp        .Lfrom904
Blocks: sm-opt-jits
Severity: -- → N/A
Priority: -- → P1
Pushed by andre.bargull@gmail.com: https://hg.mozilla.org/integration/autoland/rev/3e64f1ea29ac Part 1: Fold MSameValue with constant null or undefined operand. r=iain https://hg.mozilla.org/integration/autoland/rev/e27dac96bd3a Part 2: Add MSameValueDouble::foldsTo. r=iain https://hg.mozilla.org/integration/autoland/rev/e55dc1a635bd Part 3: Improve codegen for x86 NaN comparison. r=iain https://hg.mozilla.org/integration/autoland/rev/5f08c471a5bd Part 4: Rename WasmReinterpret to ReinterpretCast. r=iain https://hg.mozilla.org/integration/autoland/rev/f6c20a39db0d Part 5: Generator LIR code for ReinterpretCast. r=iain https://hg.mozilla.org/integration/autoland/rev/38008a7f2e6d Part 6: Move codegen for ReinterpretCast to common CodeGenerator. r=iain https://hg.mozilla.org/integration/autoland/rev/ab0048feec2f Part 7: Move codegen for ReinterpretCastFromI64 to common CodeGenerator. r=iain https://hg.mozilla.org/integration/autoland/rev/435530a07115 Part 8: Move codegen for ReinterpretCastToI64 to common CodeGenerator. r=iain
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: