cherry-pick-1234770.patch 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Georg Neis <[email protected]>
  3. Date: Mon, 9 Aug 2021 09:57:12 +0200
  4. Subject: Merged: [compiler] Fix a bug in MachineOperatorReducer's
  5. BitfieldCheck
  6. Revision: 574ca6b71c6160d38b5fcf4b8e133bc7f6ba2387
  7. BUG=chromium:1234770
  8. NOTRY=true
  9. NOPRESUBMIT=true
  10. NOTREECHECKS=true
  11. [email protected]
  12. Change-Id: I15af5a94e89b54c2a540442c3544ed459b832e0a
  13. Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3080564
  14. Reviewed-by: Lutz Vahl <[email protected]>
  15. Commit-Queue: Georg Neis <[email protected]>
  16. Cr-Commit-Position: refs/branch-heads/9.3@{#21}
  17. Cr-Branched-From: 7744dce208a555494e4a33e24fadc71ea20b3895-refs/heads/9.3.345@{#1}
  18. Cr-Branched-From: 4b6b4cabf3b6a20cdfda72b369df49f3311c4344-refs/heads/master@{#75728}
  19. diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc
  20. index 5d61dfac6ab46687b0adde2ff9777a0252e16494..b4b16f931f0927e9b683f38b393b0d275727f25e 100644
  21. --- a/src/compiler/machine-operator-reducer.cc
  22. +++ b/src/compiler/machine-operator-reducer.cc
  23. @@ -1718,11 +1718,21 @@ Reduction MachineOperatorReducer::ReduceWordNAnd(Node* node) {
  24. namespace {
  25. // Represents an operation of the form `(source & mask) == masked_value`.
  26. +// where each bit set in masked_value also has to be set in mask.
  27. struct BitfieldCheck {
  28. - Node* source;
  29. - uint32_t mask;
  30. - uint32_t masked_value;
  31. - bool truncate_from_64_bit;
  32. + Node* const source;
  33. + uint32_t const mask;
  34. + uint32_t const masked_value;
  35. + bool const truncate_from_64_bit;
  36. +
  37. + BitfieldCheck(Node* source, uint32_t mask, uint32_t masked_value,
  38. + bool truncate_from_64_bit)
  39. + : source(source),
  40. + mask(mask),
  41. + masked_value(masked_value),
  42. + truncate_from_64_bit(truncate_from_64_bit) {
  43. + CHECK_EQ(masked_value & ~mask, 0);
  44. + }
  45. static base::Optional<BitfieldCheck> Detect(Node* node) {
  46. // There are two patterns to check for here:
  47. @@ -1737,14 +1747,16 @@ struct BitfieldCheck {
  48. if (eq.left().IsWord32And()) {
  49. Uint32BinopMatcher mand(eq.left().node());
  50. if (mand.right().HasResolvedValue() && eq.right().HasResolvedValue()) {
  51. - BitfieldCheck result{mand.left().node(), mand.right().ResolvedValue(),
  52. - eq.right().ResolvedValue(), false};
  53. + uint32_t mask = mand.right().ResolvedValue();
  54. + uint32_t masked_value = eq.right().ResolvedValue();
  55. + if ((masked_value & ~mask) != 0) return {};
  56. if (mand.left().IsTruncateInt64ToInt32()) {
  57. - result.truncate_from_64_bit = true;
  58. - result.source =
  59. - NodeProperties::GetValueInput(mand.left().node(), 0);
  60. + return BitfieldCheck(
  61. + NodeProperties::GetValueInput(mand.left().node(), 0), mask,
  62. + masked_value, true);
  63. + } else {
  64. + return BitfieldCheck(mand.left().node(), mask, masked_value, false);
  65. }
  66. - return result;
  67. }
  68. }
  69. } else {