• Nico Hartmann's avatar
    Reland "[turbofan] Improve equality on NumberOrOddball" · 120d4333
    Nico Hartmann authored
    This is a reland of 6204768b
    
    The original issue exposed the problem that NumberEqual performs
    implicit conversion of oddballs to numbers, which is incorrect for
    abstract equality comparison (i.e. 0 == null must not be true).
    
    This reland fixes this by applying the following steps:
    * Introduced a new kNumberOrBoolean value for CompareOperationFeedback,
      CompareOperationHint, TypeCheckKind and CheckedTaggedInputMode.
    * In CodeStubAssembler::Equal: Further distinguish between boolean and
      non-boolean oddballs and set feedback accoringly.
    * In JSTypedLowering: Construct [Speculative]NumberEqual operator with
      CompareOperationHint::kNumberOrBoolean, when this feedback is present.
      JSOperatorBuilder and operator cache are extended accordingly.
    * In SimplifiedLowering: Propagate a UseInfo with new
      TypeCheckKind::kNumberOrBoolean.
    * This leads to the generation of CheckedTaggedToFloat64 in
      RepresentationChanger with new CheckedTaggedInputMode::kNumberOrBoolean.
    * In EffectControlLinearizer: Handle this new mode. Accept and convert
      number and boolean and deopt for rest.
    
    Original change's description:
    > [turbofan] Improve equality on NumberOrOddball
    >
    > This CL cleans up CompareOperationFeedback by replacing it with a
    > composable set of flags. The interpreter is changed to collect
    > more specific feedback for abstract equality, especially if oddballs
    > are involved.
    >
    > TurboFan is changed to construct SpeculativeNumberEqual operator
    > instead of the generic JSEqual in many more cases. This change has
    > shown a local speedup of a factor of 3-10, because the specific
    > operator is way faster than calling into the generic builtin, but
    > it also enables additional optimizations, further improving
    > runtime performance.
    >
    > Bug: v8:5660
    > Change-Id: I856752caa707e9a4f742c6e7a9c75552fb431d28
    > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2162854
    > Reviewed-by: Mythri Alle <mythria@chromium.org>
    > Reviewed-by: Georg Neis <neis@chromium.org>
    > Commit-Queue: Nico Hartmann <nicohartmann@chromium.org>
    > Cr-Commit-Position: refs/heads/master@{#67645}
    
    TBR: tebbi@chromium.org
    Bug: v8:5660
    Change-Id: I12e733149a1d2773cafb781a1d4b10aa1eb242a7
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2193713
    Commit-Queue: Georg Neis <neis@chromium.org>
    Reviewed-by: 's avatarMythri Alle <mythria@chromium.org>
    Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#68037}
    120d4333
js-operator.cc 64.5 KB