LCOV - code coverage report
Current view: top level - test/unittests/compiler - redundancy-elimination-unittest.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 661 675 97.9 %
Date: 2019-04-17 Functions: 110 164 67.1 %

          Line data    Source code
       1             : // Copyright 2018 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/compiler/redundancy-elimination.h"
       6             : #include "src/compiler/common-operator.h"
       7             : #include "test/unittests/compiler/graph-reducer-unittest.h"
       8             : #include "test/unittests/compiler/graph-unittest.h"
       9             : #include "test/unittests/compiler/node-test-utils.h"
      10             : #include "testing/gmock-support.h"
      11             : 
      12             : using testing::_;
      13             : using testing::NiceMock;
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : namespace compiler {
      18             : namespace redundancy_elimination_unittest {
      19             : 
      20             : class RedundancyEliminationTest : public GraphTest {
      21             :  public:
      22          53 :   explicit RedundancyEliminationTest(int num_parameters = 4)
      23             :       : GraphTest(num_parameters),
      24             :         reducer_(&editor_, zone()),
      25         159 :         simplified_(zone()) {
      26             :     // Initialize the {reducer_} state for the Start node.
      27          53 :     reducer_.Reduce(graph()->start());
      28             : 
      29             :     // Create a feedback vector with two CALL_IC slots.
      30             :     FeedbackVectorSpec spec(zone());
      31             :     FeedbackSlot slot1 = spec.AddCallICSlot();
      32             :     FeedbackSlot slot2 = spec.AddCallICSlot();
      33          53 :     Handle<FeedbackMetadata> metadata = FeedbackMetadata::New(isolate(), &spec);
      34             :     Handle<SharedFunctionInfo> shared =
      35             :         isolate()->factory()->NewSharedFunctionInfoForBuiltin(
      36          53 :             isolate()->factory()->empty_string(), Builtins::kIllegal);
      37         106 :     shared->set_raw_outer_scope_info_or_feedback_metadata(*metadata);
      38             :     Handle<ClosureFeedbackCellArray> closure_feedback_cell_array =
      39          53 :         ClosureFeedbackCellArray::New(isolate(), shared);
      40             :     Handle<FeedbackVector> feedback_vector =
      41          53 :         FeedbackVector::New(isolate(), shared, closure_feedback_cell_array);
      42         106 :     vector_slot_pairs_.push_back(VectorSlotPair());
      43          53 :     vector_slot_pairs_.push_back(
      44             :         VectorSlotPair(feedback_vector, slot1, UNINITIALIZED));
      45          53 :     vector_slot_pairs_.push_back(
      46             :         VectorSlotPair(feedback_vector, slot2, UNINITIALIZED));
      47          53 :   }
      48         106 :   ~RedundancyEliminationTest() override = default;
      49             : 
      50             :  protected:
      51        1230 :   Reduction Reduce(Node* node) { return reducer_.Reduce(node); }
      52             : 
      53             :   std::vector<VectorSlotPair> const& vector_slot_pairs() const {
      54             :     return vector_slot_pairs_;
      55             :   }
      56         588 :   SimplifiedOperatorBuilder* simplified() { return &simplified_; }
      57             : 
      58             :  private:
      59             :   NiceMock<MockAdvancedReducerEditor> editor_;
      60             :   std::vector<VectorSlotPair> vector_slot_pairs_;
      61             :   VectorSlotPair feedback2_;
      62             :   RedundancyElimination reducer_;
      63             :   SimplifiedOperatorBuilder simplified_;
      64             : };
      65             : 
      66             : namespace {
      67             : 
      68             : const CheckForMinusZeroMode kCheckForMinusZeroModes[] = {
      69             :     CheckForMinusZeroMode::kCheckForMinusZero,
      70             :     CheckForMinusZeroMode::kDontCheckForMinusZero,
      71             : };
      72             : 
      73             : const CheckTaggedInputMode kCheckTaggedInputModes[] = {
      74             :     CheckTaggedInputMode::kNumber, CheckTaggedInputMode::kNumberOrOddball};
      75             : 
      76             : const NumberOperationHint kNumberOperationHints[] = {
      77             :     NumberOperationHint::kSignedSmall,
      78             :     NumberOperationHint::kSignedSmallInputs,
      79             :     NumberOperationHint::kSigned32,
      80             :     NumberOperationHint::kNumber,
      81             :     NumberOperationHint::kNumberOrOddball,
      82             : };
      83             : 
      84             : }  // namespace
      85             : 
      86             : // -----------------------------------------------------------------------------
      87             : // CheckBounds
      88             : 
      89       15443 : TEST_F(RedundancyEliminationTest, CheckBounds) {
      90          10 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
      91          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
      92           9 :       Node* index = Parameter(0);
      93           9 :       Node* length = Parameter(1);
      94             :       Node* effect = graph()->start();
      95             :       Node* control = graph()->start();
      96             : 
      97           9 :       Node* check1 = effect = graph()->NewNode(
      98           9 :           simplified()->CheckBounds(feedback1), index, length, effect, control);
      99             :       Reduction r1 = Reduce(check1);
     100           9 :       ASSERT_TRUE(r1.Changed());
     101          18 :       EXPECT_EQ(r1.replacement(), check1);
     102             : 
     103           9 :       Node* check2 = effect = graph()->NewNode(
     104             :           simplified()->CheckBounds(feedback2), index, length, effect, control);
     105             :       Reduction r2 = Reduce(check2);
     106           9 :       ASSERT_TRUE(r2.Changed());
     107          18 :       EXPECT_EQ(r2.replacement(), check1);
     108             :     }
     109             :   }
     110             : }
     111             : 
     112             : // -----------------------------------------------------------------------------
     113             : // CheckNumber
     114             : 
     115       15443 : TEST_F(RedundancyEliminationTest, CheckNumberSubsumedByCheckSmi) {
     116          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     117          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     118           9 :       Node* value = Parameter(0);
     119             :       Node* effect = graph()->start();
     120             :       Node* control = graph()->start();
     121             : 
     122           9 :       Node* check1 = effect = graph()->NewNode(
     123           9 :           simplified()->CheckSmi(feedback1), value, effect, control);
     124             :       Reduction r1 = Reduce(check1);
     125           9 :       ASSERT_TRUE(r1.Changed());
     126          18 :       EXPECT_EQ(r1.replacement(), check1);
     127             : 
     128           9 :       Node* check2 = effect = graph()->NewNode(
     129             :           simplified()->CheckNumber(feedback2), value, effect, control);
     130             :       Reduction r2 = Reduce(check2);
     131           9 :       ASSERT_TRUE(r2.Changed());
     132          18 :       EXPECT_EQ(r2.replacement(), check1);
     133             :     }
     134             :   }
     135             : }
     136             : 
     137             : // -----------------------------------------------------------------------------
     138             : // CheckReceiver
     139             : 
     140       15443 : TEST_F(RedundancyEliminationTest, CheckReceiver) {
     141           1 :   Node* value = Parameter(0);
     142             :   Node* effect = graph()->start();
     143             :   Node* control = graph()->start();
     144             : 
     145             :   Node* check1 = effect =
     146           2 :       graph()->NewNode(simplified()->CheckReceiver(), value, effect, control);
     147             :   Reduction r1 = Reduce(check1);
     148           1 :   ASSERT_TRUE(r1.Changed());
     149           2 :   EXPECT_EQ(r1.replacement(), check1);
     150             : 
     151             :   Node* check2 = effect =
     152           1 :       graph()->NewNode(simplified()->CheckReceiver(), value, effect, control);
     153             :   Reduction r2 = Reduce(check2);
     154           1 :   ASSERT_TRUE(r2.Changed());
     155           2 :   EXPECT_EQ(r2.replacement(), check1);
     156             : }
     157             : 
     158             : // -----------------------------------------------------------------------------
     159             : // CheckReceiverOrNullOrUndefined
     160             : 
     161       15443 : TEST_F(RedundancyEliminationTest, CheckReceiverOrNullOrUndefined) {
     162           1 :   Node* value = Parameter(0);
     163             :   Node* effect = graph()->start();
     164             :   Node* control = graph()->start();
     165             : 
     166           1 :   Node* check1 = effect = graph()->NewNode(
     167           1 :       simplified()->CheckReceiverOrNullOrUndefined(), value, effect, control);
     168             :   Reduction r1 = Reduce(check1);
     169           1 :   ASSERT_TRUE(r1.Changed());
     170           2 :   EXPECT_EQ(r1.replacement(), check1);
     171             : 
     172           1 :   Node* check2 = effect = graph()->NewNode(
     173             :       simplified()->CheckReceiverOrNullOrUndefined(), value, effect, control);
     174             :   Reduction r2 = Reduce(check2);
     175           1 :   ASSERT_TRUE(r2.Changed());
     176           2 :   EXPECT_EQ(r2.replacement(), check1);
     177             : }
     178             : 
     179       15443 : TEST_F(RedundancyEliminationTest,
     180             :        CheckReceiverOrNullOrUndefinedSubsumedByCheckReceiver) {
     181           1 :   Node* value = Parameter(0);
     182             :   Node* effect = graph()->start();
     183             :   Node* control = graph()->start();
     184             : 
     185             :   Node* check1 = effect =
     186           2 :       graph()->NewNode(simplified()->CheckReceiver(), value, effect, control);
     187             :   Reduction r1 = Reduce(check1);
     188           1 :   ASSERT_TRUE(r1.Changed());
     189           2 :   EXPECT_EQ(r1.replacement(), check1);
     190             : 
     191           1 :   Node* check2 = effect = graph()->NewNode(
     192             :       simplified()->CheckReceiverOrNullOrUndefined(), value, effect, control);
     193             :   Reduction r2 = Reduce(check2);
     194           1 :   ASSERT_TRUE(r2.Changed());
     195           2 :   EXPECT_EQ(r2.replacement(), check1);
     196             : }
     197             : 
     198             : // -----------------------------------------------------------------------------
     199             : // CheckNonEmptyString
     200             : 
     201       15443 : TEST_F(RedundancyEliminationTest,
     202             :        CheckNonEmptyStringSubsumedByCheckNonEmptyOneByteString) {
     203           1 :   Node* value = Parameter(0);
     204             :   Node* effect = graph()->start();
     205             :   Node* control = graph()->start();
     206             : 
     207           1 :   Node* check1 = effect = graph()->NewNode(
     208           1 :       simplified()->CheckNonEmptyOneByteString(), value, effect, control);
     209             :   Reduction r1 = Reduce(check1);
     210           1 :   ASSERT_TRUE(r1.Changed());
     211           2 :   EXPECT_EQ(r1.replacement(), check1);
     212             : 
     213           1 :   Node* check2 = effect = graph()->NewNode(simplified()->CheckNonEmptyString(),
     214             :                                            value, effect, control);
     215             :   Reduction r2 = Reduce(check2);
     216           1 :   ASSERT_TRUE(r2.Changed());
     217           2 :   EXPECT_EQ(r2.replacement(), check1);
     218             : }
     219             : 
     220       15443 : TEST_F(RedundancyEliminationTest,
     221             :        CheckNonEmptyStringSubsumedByCheckNonEmptyTwoByteString) {
     222           1 :   Node* value = Parameter(0);
     223             :   Node* effect = graph()->start();
     224             :   Node* control = graph()->start();
     225             : 
     226           1 :   Node* check1 = effect = graph()->NewNode(
     227           1 :       simplified()->CheckNonEmptyTwoByteString(), value, effect, control);
     228             :   Reduction r1 = Reduce(check1);
     229           1 :   ASSERT_TRUE(r1.Changed());
     230           2 :   EXPECT_EQ(r1.replacement(), check1);
     231             : 
     232           1 :   Node* check2 = effect = graph()->NewNode(simplified()->CheckNonEmptyString(),
     233             :                                            value, effect, control);
     234             :   Reduction r2 = Reduce(check2);
     235           1 :   ASSERT_TRUE(r2.Changed());
     236           2 :   EXPECT_EQ(r2.replacement(), check1);
     237             : }
     238             : 
     239             : // -----------------------------------------------------------------------------
     240             : // CheckString
     241             : 
     242       15443 : TEST_F(RedundancyEliminationTest,
     243             :        CheckStringSubsumedByCheckInternalizedString) {
     244          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
     245           3 :     Node* value = Parameter(0);
     246             :     Node* effect = graph()->start();
     247             :     Node* control = graph()->start();
     248             : 
     249           3 :     Node* check1 = effect = graph()->NewNode(
     250           3 :         simplified()->CheckInternalizedString(), value, effect, control);
     251             :     Reduction r1 = Reduce(check1);
     252           3 :     ASSERT_TRUE(r1.Changed());
     253           6 :     EXPECT_EQ(r1.replacement(), check1);
     254             : 
     255           3 :     Node* check2 = effect = graph()->NewNode(
     256             :         simplified()->CheckString(feedback), value, effect, control);
     257             :     Reduction r2 = Reduce(check2);
     258           3 :     ASSERT_TRUE(r2.Changed());
     259           6 :     EXPECT_EQ(r2.replacement(), check1);
     260             :   }
     261             : }
     262             : 
     263       15443 : TEST_F(RedundancyEliminationTest, CheckStringSubsumedByCheckNonEmptyString) {
     264          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
     265           3 :     Node* value = Parameter(0);
     266             :     Node* effect = graph()->start();
     267             :     Node* control = graph()->start();
     268             : 
     269           3 :     Node* check1 = effect = graph()->NewNode(
     270           3 :         simplified()->CheckNonEmptyString(), value, effect, control);
     271             :     Reduction r1 = Reduce(check1);
     272           3 :     ASSERT_TRUE(r1.Changed());
     273           6 :     EXPECT_EQ(r1.replacement(), check1);
     274             : 
     275             :     Node* check2 = effect = graph()->NewNode(
     276             :         simplified()->CheckString(feedback), value, effect, control);
     277             :     Reduction r2 = Reduce(check2);
     278           3 :     ASSERT_TRUE(r2.Changed());
     279           6 :     EXPECT_EQ(r2.replacement(), check1);
     280             :   }
     281             : }
     282             : 
     283       15443 : TEST_F(RedundancyEliminationTest,
     284             :        CheckStringSubsumedByCheckNonEmptyOneByteString) {
     285          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
     286           3 :     Node* value = Parameter(0);
     287             :     Node* effect = graph()->start();
     288             :     Node* control = graph()->start();
     289             : 
     290           3 :     Node* check1 = effect = graph()->NewNode(
     291           3 :         simplified()->CheckNonEmptyOneByteString(), value, effect, control);
     292             :     Reduction r1 = Reduce(check1);
     293           3 :     ASSERT_TRUE(r1.Changed());
     294           6 :     EXPECT_EQ(r1.replacement(), check1);
     295             : 
     296           3 :     Node* check2 = effect = graph()->NewNode(
     297             :         simplified()->CheckString(feedback), value, effect, control);
     298             :     Reduction r2 = Reduce(check2);
     299           3 :     ASSERT_TRUE(r2.Changed());
     300           6 :     EXPECT_EQ(r2.replacement(), check1);
     301             :   }
     302             : }
     303             : 
     304       15443 : TEST_F(RedundancyEliminationTest,
     305             :        CheckStringSubsumedByCheckNonEmptyTwoByteString) {
     306          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
     307           3 :     Node* value = Parameter(0);
     308             :     Node* effect = graph()->start();
     309             :     Node* control = graph()->start();
     310             : 
     311           3 :     Node* check1 = effect = graph()->NewNode(
     312           3 :         simplified()->CheckNonEmptyTwoByteString(), value, effect, control);
     313             :     Reduction r1 = Reduce(check1);
     314           3 :     ASSERT_TRUE(r1.Changed());
     315           6 :     EXPECT_EQ(r1.replacement(), check1);
     316             : 
     317           3 :     Node* check2 = effect = graph()->NewNode(
     318             :         simplified()->CheckString(feedback), value, effect, control);
     319             :     Reduction r2 = Reduce(check2);
     320           3 :     ASSERT_TRUE(r2.Changed());
     321           6 :     EXPECT_EQ(r2.replacement(), check1);
     322             :   }
     323             : }
     324             : 
     325             : // -----------------------------------------------------------------------------
     326             : // CheckSymbol
     327             : 
     328       15443 : TEST_F(RedundancyEliminationTest, CheckSymbol) {
     329           1 :   Node* value = Parameter(0);
     330             :   Node* effect = graph()->start();
     331             :   Node* control = graph()->start();
     332             : 
     333             :   Node* check1 = effect =
     334           2 :       graph()->NewNode(simplified()->CheckSymbol(), value, effect, control);
     335             :   Reduction r1 = Reduce(check1);
     336           1 :   ASSERT_TRUE(r1.Changed());
     337           2 :   EXPECT_EQ(r1.replacement(), check1);
     338             : 
     339             :   Node* check2 = effect =
     340           1 :       graph()->NewNode(simplified()->CheckSymbol(), value, effect, control);
     341             :   Reduction r2 = Reduce(check2);
     342           1 :   ASSERT_TRUE(r2.Changed());
     343           2 :   EXPECT_EQ(r2.replacement(), check1);
     344             : }
     345             : 
     346             : // -----------------------------------------------------------------------------
     347             : // CheckedFloat64ToInt32
     348             : 
     349       15443 : TEST_F(RedundancyEliminationTest, CheckedFloat64ToInt32) {
     350          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     351          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     352          81 :       TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) {
     353          18 :         Node* value = Parameter(0);
     354             :         Node* effect = graph()->start();
     355             :         Node* control = graph()->start();
     356             : 
     357          18 :         Node* check1 = effect = graph()->NewNode(
     358             :             simplified()->CheckedFloat64ToInt32(mode, feedback1), value, effect,
     359          18 :             control);
     360             :         Reduction r1 = Reduce(check1);
     361          18 :         ASSERT_TRUE(r1.Changed());
     362          36 :         EXPECT_EQ(r1.replacement(), check1);
     363             : 
     364          18 :         Node* check2 = effect = graph()->NewNode(
     365             :             simplified()->CheckedFloat64ToInt32(mode, feedback2), value, effect,
     366             :             control);
     367             :         Reduction r2 = Reduce(check2);
     368          18 :         ASSERT_TRUE(r2.Changed());
     369          36 :         EXPECT_EQ(r2.replacement(), check1);
     370             :       }
     371             :     }
     372             :   }
     373             : }
     374             : 
     375             : // -----------------------------------------------------------------------------
     376             : // CheckedFloat64ToInt64
     377             : 
     378       15443 : TEST_F(RedundancyEliminationTest, CheckedFloat64ToInt64) {
     379          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     380          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     381          81 :       TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) {
     382          18 :         Node* value = Parameter(0);
     383             :         Node* effect = graph()->start();
     384             :         Node* control = graph()->start();
     385             : 
     386          18 :         Node* check1 = effect = graph()->NewNode(
     387             :             simplified()->CheckedFloat64ToInt64(mode, feedback1), value, effect,
     388          18 :             control);
     389             :         Reduction r1 = Reduce(check1);
     390          18 :         ASSERT_TRUE(r1.Changed());
     391          36 :         EXPECT_EQ(r1.replacement(), check1);
     392             : 
     393          18 :         Node* check2 = effect = graph()->NewNode(
     394             :             simplified()->CheckedFloat64ToInt64(mode, feedback2), value, effect,
     395             :             control);
     396             :         Reduction r2 = Reduce(check2);
     397          18 :         ASSERT_TRUE(r2.Changed());
     398          36 :         EXPECT_EQ(r2.replacement(), check1);
     399             :       }
     400             :     }
     401             :   }
     402             : }
     403             : 
     404             : // -----------------------------------------------------------------------------
     405             : // CheckedInt32ToTaggedSigned
     406             : 
     407       15443 : TEST_F(RedundancyEliminationTest, CheckedInt32ToTaggedSigned) {
     408          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     409          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     410           9 :       Node* value = Parameter(0);
     411             :       Node* effect = graph()->start();
     412             :       Node* control = graph()->start();
     413             : 
     414             :       Node* check1 = effect =
     415           9 :           graph()->NewNode(simplified()->CheckedInt32ToTaggedSigned(feedback1),
     416           9 :                            value, effect, control);
     417             :       Reduction r1 = Reduce(check1);
     418           9 :       ASSERT_TRUE(r1.Changed());
     419          18 :       EXPECT_EQ(r1.replacement(), check1);
     420             : 
     421             :       Node* check2 = effect =
     422           9 :           graph()->NewNode(simplified()->CheckedInt32ToTaggedSigned(feedback2),
     423             :                            value, effect, control);
     424             :       Reduction r2 = Reduce(check2);
     425           9 :       ASSERT_TRUE(r2.Changed());
     426          18 :       EXPECT_EQ(r2.replacement(), check1);
     427             :     }
     428             :   }
     429             : }
     430             : 
     431             : // -----------------------------------------------------------------------------
     432             : // CheckedInt64ToInt32
     433             : 
     434       15443 : TEST_F(RedundancyEliminationTest, CheckedInt64ToInt32) {
     435          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     436          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     437           9 :       Node* value = Parameter(0);
     438             :       Node* effect = graph()->start();
     439             :       Node* control = graph()->start();
     440             : 
     441           9 :       Node* check1 = effect = graph()->NewNode(
     442           9 :           simplified()->CheckedInt64ToInt32(feedback1), value, effect, control);
     443             :       Reduction r1 = Reduce(check1);
     444           9 :       ASSERT_TRUE(r1.Changed());
     445          18 :       EXPECT_EQ(r1.replacement(), check1);
     446             : 
     447           9 :       Node* check2 = effect = graph()->NewNode(
     448             :           simplified()->CheckedInt64ToInt32(feedback2), value, effect, control);
     449             :       Reduction r2 = Reduce(check2);
     450           9 :       ASSERT_TRUE(r2.Changed());
     451          18 :       EXPECT_EQ(r2.replacement(), check1);
     452             :     }
     453             :   }
     454             : }
     455             : 
     456             : // -----------------------------------------------------------------------------
     457             : // CheckedInt64ToTaggedSigned
     458             : 
     459       15443 : TEST_F(RedundancyEliminationTest, CheckedInt64ToTaggedSigned) {
     460          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     461          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     462           9 :       Node* value = Parameter(0);
     463             :       Node* effect = graph()->start();
     464             :       Node* control = graph()->start();
     465             : 
     466             :       Node* check1 = effect =
     467           9 :           graph()->NewNode(simplified()->CheckedInt64ToTaggedSigned(feedback1),
     468           9 :                            value, effect, control);
     469             :       Reduction r1 = Reduce(check1);
     470           9 :       ASSERT_TRUE(r1.Changed());
     471          18 :       EXPECT_EQ(r1.replacement(), check1);
     472             : 
     473             :       Node* check2 = effect =
     474           9 :           graph()->NewNode(simplified()->CheckedInt64ToTaggedSigned(feedback2),
     475             :                            value, effect, control);
     476             :       Reduction r2 = Reduce(check2);
     477           9 :       ASSERT_TRUE(r2.Changed());
     478          18 :       EXPECT_EQ(r2.replacement(), check1);
     479             :     }
     480             :   }
     481             : }
     482             : 
     483             : // -----------------------------------------------------------------------------
     484             : // CheckedTaggedSignedToInt32
     485             : 
     486       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedSignedToInt32) {
     487          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     488          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     489           9 :       Node* value = Parameter(0);
     490             :       Node* effect = graph()->start();
     491             :       Node* control = graph()->start();
     492             : 
     493             :       Node* check1 = effect =
     494           9 :           graph()->NewNode(simplified()->CheckedTaggedSignedToInt32(feedback1),
     495           9 :                            value, effect, control);
     496             :       Reduction r1 = Reduce(check1);
     497           9 :       ASSERT_TRUE(r1.Changed());
     498          18 :       EXPECT_EQ(r1.replacement(), check1);
     499             : 
     500             :       Node* check2 = effect =
     501           9 :           graph()->NewNode(simplified()->CheckedTaggedSignedToInt32(feedback2),
     502             :                            value, effect, control);
     503             :       Reduction r2 = Reduce(check2);
     504           9 :       ASSERT_TRUE(r2.Changed());
     505          18 :       EXPECT_EQ(r2.replacement(), check1);
     506             :     }
     507             :   }
     508             : }
     509             : 
     510             : // -----------------------------------------------------------------------------
     511             : // CheckedTaggedToFloat64
     512             : 
     513       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToFloat64) {
     514          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     515          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     516          81 :       TRACED_FOREACH(CheckTaggedInputMode, mode, kCheckTaggedInputModes) {
     517          18 :         Node* value = Parameter(0);
     518             :         Node* effect = graph()->start();
     519             :         Node* control = graph()->start();
     520             : 
     521          18 :         Node* check1 = effect = graph()->NewNode(
     522             :             simplified()->CheckedTaggedToFloat64(mode, feedback1), value,
     523          18 :             effect, control);
     524             :         Reduction r1 = Reduce(check1);
     525          18 :         ASSERT_TRUE(r1.Changed());
     526          36 :         EXPECT_EQ(r1.replacement(), check1);
     527             : 
     528          18 :         Node* check2 = effect = graph()->NewNode(
     529             :             simplified()->CheckedTaggedToFloat64(mode, feedback2), value,
     530             :             effect, control);
     531             :         Reduction r2 = Reduce(check2);
     532          18 :         ASSERT_TRUE(r2.Changed());
     533          36 :         EXPECT_EQ(r2.replacement(), check1);
     534             :       }
     535             :     }
     536             :   }
     537             : }
     538             : 
     539       15443 : TEST_F(RedundancyEliminationTest,
     540             :        CheckedTaggedToFloat64SubsubmedByCheckedTaggedToFloat64) {
     541          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     542          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     543           9 :       Node* value = Parameter(0);
     544             :       Node* effect = graph()->start();
     545             :       Node* control = graph()->start();
     546             : 
     547             :       // If the check passed for CheckTaggedInputMode::kNumber, it'll
     548             :       // also pass later for CheckTaggedInputMode::kNumberOrOddball.
     549             :       Node* check1 = effect =
     550           9 :           graph()->NewNode(simplified()->CheckedTaggedToFloat64(
     551             :                                CheckTaggedInputMode::kNumber, feedback1),
     552           9 :                            value, effect, control);
     553             :       Reduction r1 = Reduce(check1);
     554           9 :       ASSERT_TRUE(r1.Changed());
     555          18 :       EXPECT_EQ(r1.replacement(), check1);
     556             : 
     557           9 :       Node* check2 = effect = graph()->NewNode(
     558             :           simplified()->CheckedTaggedToFloat64(
     559             :               CheckTaggedInputMode::kNumberOrOddball, feedback2),
     560             :           value, effect, control);
     561             :       Reduction r2 = Reduce(check2);
     562           9 :       ASSERT_TRUE(r2.Changed());
     563          18 :       EXPECT_EQ(r2.replacement(), check1);
     564             :     }
     565             :   }
     566             : }
     567             : 
     568             : // -----------------------------------------------------------------------------
     569             : // CheckedTaggedToInt32
     570             : 
     571       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToInt32) {
     572          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     573          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     574          81 :       TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) {
     575          18 :         Node* value = Parameter(0);
     576             :         Node* effect = graph()->start();
     577             :         Node* control = graph()->start();
     578             : 
     579          18 :         Node* check1 = effect = graph()->NewNode(
     580             :             simplified()->CheckedTaggedToInt32(mode, feedback1), value, effect,
     581          18 :             control);
     582             :         Reduction r1 = Reduce(check1);
     583          18 :         ASSERT_TRUE(r1.Changed());
     584          36 :         EXPECT_EQ(r1.replacement(), check1);
     585             : 
     586          18 :         Node* check2 = effect = graph()->NewNode(
     587             :             simplified()->CheckedTaggedToInt32(mode, feedback2), value, effect,
     588             :             control);
     589             :         Reduction r2 = Reduce(check2);
     590          18 :         ASSERT_TRUE(r2.Changed());
     591          36 :         EXPECT_EQ(r2.replacement(), check1);
     592             :       }
     593             :     }
     594             :   }
     595             : }
     596             : 
     597       15443 : TEST_F(RedundancyEliminationTest,
     598             :        CheckedTaggedToInt32SubsumedByCheckedTaggedSignedToInt32) {
     599          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     600          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     601          81 :       TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) {
     602          18 :         Node* value = Parameter(0);
     603             :         Node* effect = graph()->start();
     604             :         Node* control = graph()->start();
     605             : 
     606          18 :         Node* check1 = effect = graph()->NewNode(
     607             :             simplified()->CheckedTaggedSignedToInt32(feedback1), value, effect,
     608          18 :             control);
     609             :         Reduction r1 = Reduce(check1);
     610          18 :         ASSERT_TRUE(r1.Changed());
     611          36 :         EXPECT_EQ(r1.replacement(), check1);
     612             : 
     613          18 :         Node* check2 = effect = graph()->NewNode(
     614             :             simplified()->CheckedTaggedToInt32(mode, feedback2), value, effect,
     615             :             control);
     616             :         Reduction r2 = Reduce(check2);
     617          18 :         ASSERT_TRUE(r2.Changed());
     618          36 :         EXPECT_EQ(r2.replacement(), check1);
     619             :       }
     620             :     }
     621             :   }
     622             : }
     623             : 
     624             : // -----------------------------------------------------------------------------
     625             : // CheckedTaggedToInt64
     626             : 
     627       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToInt64) {
     628          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     629          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     630          81 :       TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) {
     631          18 :         Node* value = Parameter(0);
     632             :         Node* effect = graph()->start();
     633             :         Node* control = graph()->start();
     634             : 
     635          18 :         Node* check1 = effect = graph()->NewNode(
     636             :             simplified()->CheckedTaggedToInt64(mode, feedback1), value, effect,
     637          18 :             control);
     638             :         Reduction r1 = Reduce(check1);
     639          18 :         ASSERT_TRUE(r1.Changed());
     640          36 :         EXPECT_EQ(r1.replacement(), check1);
     641             : 
     642          18 :         Node* check2 = effect = graph()->NewNode(
     643             :             simplified()->CheckedTaggedToInt64(mode, feedback2), value, effect,
     644             :             control);
     645             :         Reduction r2 = Reduce(check2);
     646          18 :         ASSERT_TRUE(r2.Changed());
     647          36 :         EXPECT_EQ(r2.replacement(), check1);
     648             :       }
     649             :     }
     650             :   }
     651             : }
     652             : 
     653             : // -----------------------------------------------------------------------------
     654             : // CheckedTaggedToTaggedPointer
     655             : 
     656       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToTaggedPointer) {
     657          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     658          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     659           9 :       Node* value = Parameter(0);
     660             :       Node* effect = graph()->start();
     661             :       Node* control = graph()->start();
     662             : 
     663           9 :       Node* check1 = effect = graph()->NewNode(
     664             :           simplified()->CheckedTaggedToTaggedPointer(feedback1), value, effect,
     665           9 :           control);
     666             :       Reduction r1 = Reduce(check1);
     667           9 :       ASSERT_TRUE(r1.Changed());
     668          18 :       EXPECT_EQ(r1.replacement(), check1);
     669             : 
     670           9 :       Node* check2 = effect = graph()->NewNode(
     671             :           simplified()->CheckedTaggedToTaggedPointer(feedback2), value, effect,
     672             :           control);
     673             :       Reduction r2 = Reduce(check2);
     674           9 :       ASSERT_TRUE(r2.Changed());
     675          18 :       EXPECT_EQ(r2.replacement(), check1);
     676             :     }
     677             :   }
     678             : }
     679             : 
     680             : // -----------------------------------------------------------------------------
     681             : // CheckedTaggedToTaggedSigned
     682             : 
     683       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToTaggedSigned) {
     684          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     685          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     686           9 :       Node* value = Parameter(0);
     687             :       Node* effect = graph()->start();
     688             :       Node* control = graph()->start();
     689             : 
     690             :       Node* check1 = effect =
     691           9 :           graph()->NewNode(simplified()->CheckedTaggedToTaggedSigned(feedback1),
     692           9 :                            value, effect, control);
     693             :       Reduction r1 = Reduce(check1);
     694           9 :       ASSERT_TRUE(r1.Changed());
     695          18 :       EXPECT_EQ(r1.replacement(), check1);
     696             : 
     697             :       Node* check2 = effect =
     698           9 :           graph()->NewNode(simplified()->CheckedTaggedToTaggedSigned(feedback2),
     699             :                            value, effect, control);
     700             :       Reduction r2 = Reduce(check2);
     701           9 :       ASSERT_TRUE(r2.Changed());
     702          18 :       EXPECT_EQ(r2.replacement(), check1);
     703             :     }
     704             :   }
     705             : }
     706             : 
     707             : // -----------------------------------------------------------------------------
     708             : // CheckedCompressedToTaggedPointer
     709             : 
     710       15443 : TEST_F(RedundancyEliminationTest, CheckedCompressedToTaggedPointer) {
     711          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     712          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     713           9 :       Node* value = Parameter(0);
     714             :       Node* effect = graph()->start();
     715             :       Node* control = graph()->start();
     716             : 
     717           9 :       Node* check1 = effect = graph()->NewNode(
     718             :           simplified()->CheckedCompressedToTaggedPointer(feedback1), value,
     719           9 :           effect, control);
     720             :       Reduction r1 = Reduce(check1);
     721           9 :       ASSERT_TRUE(r1.Changed());
     722          18 :       EXPECT_EQ(r1.replacement(), check1);
     723             : 
     724           9 :       Node* check2 = effect = graph()->NewNode(
     725             :           simplified()->CheckedCompressedToTaggedPointer(feedback2), value,
     726             :           effect, control);
     727             :       Reduction r2 = Reduce(check2);
     728           9 :       ASSERT_TRUE(r2.Changed());
     729          18 :       EXPECT_EQ(r2.replacement(), check1);
     730             :     }
     731             :   }
     732             : }
     733             : 
     734             : // -----------------------------------------------------------------------------
     735             : // CheckedCompressedToTaggedSigned
     736             : 
     737       15443 : TEST_F(RedundancyEliminationTest, CheckedCompressedToTaggedSigned) {
     738          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     739          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     740           9 :       Node* value = Parameter(0);
     741             :       Node* effect = graph()->start();
     742             :       Node* control = graph()->start();
     743             : 
     744           9 :       Node* check1 = effect = graph()->NewNode(
     745             :           simplified()->CheckedCompressedToTaggedSigned(feedback1), value,
     746           9 :           effect, control);
     747             :       Reduction r1 = Reduce(check1);
     748           9 :       ASSERT_TRUE(r1.Changed());
     749          18 :       EXPECT_EQ(r1.replacement(), check1);
     750             : 
     751           9 :       Node* check2 = effect = graph()->NewNode(
     752             :           simplified()->CheckedCompressedToTaggedSigned(feedback2), value,
     753             :           effect, control);
     754             :       Reduction r2 = Reduce(check2);
     755           9 :       ASSERT_TRUE(r2.Changed());
     756          18 :       EXPECT_EQ(r2.replacement(), check1);
     757             :     }
     758             :   }
     759             : }
     760             : 
     761             : // -----------------------------------------------------------------------------
     762             : // CheckedTaggedToCompressedPointer
     763             : 
     764       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToCompressedPointer) {
     765          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     766          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     767           9 :       Node* value = Parameter(0);
     768             :       Node* effect = graph()->start();
     769             :       Node* control = graph()->start();
     770             : 
     771           9 :       Node* check1 = effect = graph()->NewNode(
     772             :           simplified()->CheckedTaggedToCompressedPointer(feedback1), value,
     773           9 :           effect, control);
     774             :       Reduction r1 = Reduce(check1);
     775           9 :       ASSERT_TRUE(r1.Changed());
     776          18 :       EXPECT_EQ(r1.replacement(), check1);
     777             : 
     778           9 :       Node* check2 = effect = graph()->NewNode(
     779             :           simplified()->CheckedTaggedToCompressedPointer(feedback2), value,
     780             :           effect, control);
     781             :       Reduction r2 = Reduce(check2);
     782           9 :       ASSERT_TRUE(r2.Changed());
     783          18 :       EXPECT_EQ(r2.replacement(), check1);
     784             :     }
     785             :   }
     786             : }
     787             : 
     788             : // -----------------------------------------------------------------------------
     789             : // CheckedTaggedToCompressedSigned
     790             : 
     791       15443 : TEST_F(RedundancyEliminationTest, CheckedTaggedToCompressedSigned) {
     792          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     793          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     794           9 :       Node* value = Parameter(0);
     795             :       Node* effect = graph()->start();
     796             :       Node* control = graph()->start();
     797             : 
     798           9 :       Node* check1 = effect = graph()->NewNode(
     799             :           simplified()->CheckedTaggedToCompressedSigned(feedback1), value,
     800           9 :           effect, control);
     801             :       Reduction r1 = Reduce(check1);
     802           9 :       ASSERT_TRUE(r1.Changed());
     803          18 :       EXPECT_EQ(r1.replacement(), check1);
     804             : 
     805           9 :       Node* check2 = effect = graph()->NewNode(
     806             :           simplified()->CheckedTaggedToCompressedSigned(feedback2), value,
     807             :           effect, control);
     808             :       Reduction r2 = Reduce(check2);
     809           9 :       ASSERT_TRUE(r2.Changed());
     810          18 :       EXPECT_EQ(r2.replacement(), check1);
     811             :     }
     812             :   }
     813             : }
     814             : 
     815             : // -----------------------------------------------------------------------------
     816             : // CheckedTruncateTaggedToWord32
     817             : 
     818       15443 : TEST_F(RedundancyEliminationTest, CheckedTruncateTaggedToWord32) {
     819          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     820          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     821          81 :       TRACED_FOREACH(CheckTaggedInputMode, mode, kCheckTaggedInputModes) {
     822          18 :         Node* value = Parameter(0);
     823             :         Node* effect = graph()->start();
     824             :         Node* control = graph()->start();
     825             : 
     826          18 :         Node* check1 = effect = graph()->NewNode(
     827             :             simplified()->CheckedTruncateTaggedToWord32(mode, feedback1), value,
     828          18 :             effect, control);
     829             :         Reduction r1 = Reduce(check1);
     830          18 :         ASSERT_TRUE(r1.Changed());
     831          36 :         EXPECT_EQ(r1.replacement(), check1);
     832             : 
     833          18 :         Node* check2 = effect = graph()->NewNode(
     834             :             simplified()->CheckedTruncateTaggedToWord32(mode, feedback2), value,
     835             :             effect, control);
     836             :         Reduction r2 = Reduce(check2);
     837          18 :         ASSERT_TRUE(r2.Changed());
     838          36 :         EXPECT_EQ(r2.replacement(), check1);
     839             :       }
     840             :     }
     841             :   }
     842             : }
     843             : 
     844       15443 : TEST_F(RedundancyEliminationTest,
     845             :        CheckedTruncateTaggedToWord32SubsumedByCheckedTruncateTaggedToWord32) {
     846          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     847          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     848           9 :       Node* value = Parameter(0);
     849             :       Node* effect = graph()->start();
     850             :       Node* control = graph()->start();
     851             : 
     852             :       // If the check passed for CheckTaggedInputMode::kNumber, it'll
     853             :       // also pass later for CheckTaggedInputMode::kNumberOrOddball.
     854             :       Node* check1 = effect =
     855           9 :           graph()->NewNode(simplified()->CheckedTruncateTaggedToWord32(
     856             :                                CheckTaggedInputMode::kNumber, feedback1),
     857           9 :                            value, effect, control);
     858             :       Reduction r1 = Reduce(check1);
     859           9 :       ASSERT_TRUE(r1.Changed());
     860          18 :       EXPECT_EQ(r1.replacement(), check1);
     861             : 
     862           9 :       Node* check2 = effect = graph()->NewNode(
     863             :           simplified()->CheckedTruncateTaggedToWord32(
     864             :               CheckTaggedInputMode::kNumberOrOddball, feedback2),
     865             :           value, effect, control);
     866             :       Reduction r2 = Reduce(check2);
     867           9 :       ASSERT_TRUE(r2.Changed());
     868          18 :       EXPECT_EQ(r2.replacement(), check1);
     869             :     }
     870             :   }
     871             : }
     872             : 
     873             : // -----------------------------------------------------------------------------
     874             : // CheckedUint32Bounds
     875             : 
     876       15443 : TEST_F(RedundancyEliminationTest, CheckedUint32Bounds) {
     877          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     878          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     879           9 :       Node* index = Parameter(0);
     880           9 :       Node* length = Parameter(1);
     881             :       Node* effect = graph()->start();
     882             :       Node* control = graph()->start();
     883             : 
     884           9 :       Node* check1 = effect = graph()->NewNode(
     885             :           simplified()->CheckedUint32Bounds(
     886             :               feedback1, CheckBoundsParameters::kDeoptOnOutOfBounds),
     887           9 :           index, length, effect, control);
     888             :       Reduction r1 = Reduce(check1);
     889           9 :       ASSERT_TRUE(r1.Changed());
     890          18 :       EXPECT_EQ(r1.replacement(), check1);
     891             : 
     892           9 :       Node* check2 = effect = graph()->NewNode(
     893             :           simplified()->CheckedUint32Bounds(
     894             :               feedback2, CheckBoundsParameters::kDeoptOnOutOfBounds),
     895             :           index, length, effect, control);
     896             :       Reduction r2 = Reduce(check2);
     897           9 :       ASSERT_TRUE(r2.Changed());
     898          18 :       EXPECT_EQ(r2.replacement(), check1);
     899             :     }
     900             :   }
     901             : }
     902             : 
     903             : // -----------------------------------------------------------------------------
     904             : // CheckedUint32ToInt32
     905             : 
     906       15443 : TEST_F(RedundancyEliminationTest, CheckedUint32ToInt32) {
     907          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     908          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     909           9 :       Node* value = Parameter(0);
     910             :       Node* effect = graph()->start();
     911             :       Node* control = graph()->start();
     912             : 
     913             :       Node* check1 = effect =
     914           9 :           graph()->NewNode(simplified()->CheckedUint32ToInt32(feedback1), value,
     915           9 :                            effect, control);
     916             :       Reduction r1 = Reduce(check1);
     917           9 :       ASSERT_TRUE(r1.Changed());
     918          18 :       EXPECT_EQ(r1.replacement(), check1);
     919             : 
     920             :       Node* check2 = effect =
     921           9 :           graph()->NewNode(simplified()->CheckedUint32ToInt32(feedback2), value,
     922             :                            effect, control);
     923             :       Reduction r2 = Reduce(check2);
     924           9 :       ASSERT_TRUE(r2.Changed());
     925          18 :       EXPECT_EQ(r2.replacement(), check1);
     926             :     }
     927             :   }
     928             : }
     929             : 
     930             : // -----------------------------------------------------------------------------
     931             : // CheckedUint32ToTaggedSigned
     932             : 
     933       15443 : TEST_F(RedundancyEliminationTest, CheckedUint32ToTaggedSigned) {
     934          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     935          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     936           9 :       Node* value = Parameter(0);
     937             :       Node* effect = graph()->start();
     938             :       Node* control = graph()->start();
     939             : 
     940             :       Node* check1 = effect =
     941           9 :           graph()->NewNode(simplified()->CheckedUint32ToTaggedSigned(feedback1),
     942           9 :                            value, effect, control);
     943             :       Reduction r1 = Reduce(check1);
     944           9 :       ASSERT_TRUE(r1.Changed());
     945          18 :       EXPECT_EQ(r1.replacement(), check1);
     946             : 
     947             :       Node* check2 = effect =
     948           9 :           graph()->NewNode(simplified()->CheckedUint32ToTaggedSigned(feedback2),
     949             :                            value, effect, control);
     950             :       Reduction r2 = Reduce(check2);
     951           9 :       ASSERT_TRUE(r2.Changed());
     952          18 :       EXPECT_EQ(r2.replacement(), check1);
     953             :     }
     954             :   }
     955             : }
     956             : 
     957             : // -----------------------------------------------------------------------------
     958             : // CheckedUint64Bounds
     959             : 
     960       15443 : TEST_F(RedundancyEliminationTest, CheckedUint64Bounds) {
     961          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     962          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     963           9 :       Node* index = Parameter(0);
     964           9 :       Node* length = Parameter(1);
     965             :       Node* effect = graph()->start();
     966             :       Node* control = graph()->start();
     967             : 
     968             :       Node* check1 = effect =
     969           9 :           graph()->NewNode(simplified()->CheckedUint64Bounds(feedback1), index,
     970           9 :                            length, effect, control);
     971             :       Reduction r1 = Reduce(check1);
     972           9 :       ASSERT_TRUE(r1.Changed());
     973          18 :       EXPECT_EQ(r1.replacement(), check1);
     974             : 
     975             :       Node* check2 = effect =
     976           9 :           graph()->NewNode(simplified()->CheckedUint64Bounds(feedback2), index,
     977             :                            length, effect, control);
     978             :       Reduction r2 = Reduce(check2);
     979           9 :       ASSERT_TRUE(r2.Changed());
     980          18 :       EXPECT_EQ(r2.replacement(), check1);
     981             :     }
     982             :   }
     983             : }
     984             : 
     985             : // -----------------------------------------------------------------------------
     986             : // CheckedUint64ToInt32
     987             : 
     988       15443 : TEST_F(RedundancyEliminationTest, CheckedUint64ToInt32) {
     989          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
     990          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
     991           9 :       Node* value = Parameter(0);
     992             :       Node* effect = graph()->start();
     993             :       Node* control = graph()->start();
     994             : 
     995             :       Node* check1 = effect =
     996           9 :           graph()->NewNode(simplified()->CheckedUint64ToInt32(feedback1), value,
     997           9 :                            effect, control);
     998             :       Reduction r1 = Reduce(check1);
     999           9 :       ASSERT_TRUE(r1.Changed());
    1000          18 :       EXPECT_EQ(r1.replacement(), check1);
    1001             : 
    1002             :       Node* check2 = effect =
    1003           9 :           graph()->NewNode(simplified()->CheckedUint64ToInt32(feedback2), value,
    1004             :                            effect, control);
    1005             :       Reduction r2 = Reduce(check2);
    1006           9 :       ASSERT_TRUE(r2.Changed());
    1007          18 :       EXPECT_EQ(r2.replacement(), check1);
    1008             :     }
    1009             :   }
    1010             : }
    1011             : 
    1012             : // -----------------------------------------------------------------------------
    1013             : // CheckedUint64ToTaggedSigned
    1014             : 
    1015       15443 : TEST_F(RedundancyEliminationTest, CheckedUint64ToTaggedSigned) {
    1016          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1017          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1018           9 :       Node* value = Parameter(0);
    1019             :       Node* effect = graph()->start();
    1020             :       Node* control = graph()->start();
    1021             : 
    1022             :       Node* check1 = effect =
    1023           9 :           graph()->NewNode(simplified()->CheckedUint64ToTaggedSigned(feedback1),
    1024           9 :                            value, effect, control);
    1025             :       Reduction r1 = Reduce(check1);
    1026           9 :       ASSERT_TRUE(r1.Changed());
    1027          18 :       EXPECT_EQ(r1.replacement(), check1);
    1028             : 
    1029             :       Node* check2 = effect =
    1030           9 :           graph()->NewNode(simplified()->CheckedUint64ToTaggedSigned(feedback2),
    1031             :                            value, effect, control);
    1032             :       Reduction r2 = Reduce(check2);
    1033           9 :       ASSERT_TRUE(r2.Changed());
    1034          18 :       EXPECT_EQ(r2.replacement(), check1);
    1035             :     }
    1036             :   }
    1037             : }
    1038             : 
    1039             : // -----------------------------------------------------------------------------
    1040             : // SpeculativeNumberEqual
    1041             : 
    1042       15443 : TEST_F(RedundancyEliminationTest,
    1043             :        SpeculativeNumberEqualWithCheckBoundsBetterType) {
    1044           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1045          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1046          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1047           9 :       Node* lhs = Parameter(Type::Any(), 0);
    1048           9 :       Node* rhs = Parameter(Type::Any(), 1);
    1049           9 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1050             :       Node* effect = graph()->start();
    1051             :       Node* control = graph()->start();
    1052             : 
    1053           9 :       Node* check1 = effect = graph()->NewNode(
    1054           9 :           simplified()->CheckBounds(feedback1), lhs, length, effect, control);
    1055             :       Reduction r1 = Reduce(check1);
    1056           9 :       ASSERT_TRUE(r1.Changed());
    1057          18 :       EXPECT_EQ(r1.replacement(), check1);
    1058             : 
    1059           9 :       Node* check2 = effect = graph()->NewNode(
    1060           9 :           simplified()->CheckBounds(feedback2), rhs, length, effect, control);
    1061             :       Reduction r2 = Reduce(check2);
    1062           9 :       ASSERT_TRUE(r2.Changed());
    1063          18 :       EXPECT_EQ(r2.replacement(), check2);
    1064             : 
    1065             :       Node* cmp3 = effect =
    1066           9 :           graph()->NewNode(simplified()->SpeculativeNumberEqual(
    1067             :                                NumberOperationHint::kSignedSmall),
    1068             :                            lhs, rhs, effect, control);
    1069             :       Reduction r3 = Reduce(cmp3);
    1070           9 :       ASSERT_TRUE(r3.Changed());
    1071          90 :       EXPECT_THAT(r3.replacement(),
    1072             :                   IsSpeculativeNumberEqual(NumberOperationHint::kSignedSmall,
    1073           0 :                                            check1, check2, _, _));
    1074             :     }
    1075             :   }
    1076             : }
    1077             : 
    1078       15443 : TEST_F(RedundancyEliminationTest,
    1079             :        SpeculativeNumberEqualWithCheckBoundsSameType) {
    1080           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1081          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1082          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1083           9 :       Node* lhs = Parameter(Type::UnsignedSmall(), 0);
    1084           9 :       Node* rhs = Parameter(Type::UnsignedSmall(), 1);
    1085           9 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1086             :       Node* effect = graph()->start();
    1087             :       Node* control = graph()->start();
    1088             : 
    1089           9 :       Node* check1 = effect = graph()->NewNode(
    1090           9 :           simplified()->CheckBounds(feedback1), lhs, length, effect, control);
    1091             :       Reduction r1 = Reduce(check1);
    1092           9 :       ASSERT_TRUE(r1.Changed());
    1093          18 :       EXPECT_EQ(r1.replacement(), check1);
    1094             : 
    1095           9 :       Node* check2 = effect = graph()->NewNode(
    1096           9 :           simplified()->CheckBounds(feedback2), rhs, length, effect, control);
    1097             :       Reduction r2 = Reduce(check2);
    1098           9 :       ASSERT_TRUE(r2.Changed());
    1099          18 :       EXPECT_EQ(r2.replacement(), check2);
    1100             : 
    1101             :       Node* cmp3 = effect =
    1102           9 :           graph()->NewNode(simplified()->SpeculativeNumberEqual(
    1103             :                                NumberOperationHint::kSignedSmall),
    1104             :                            lhs, rhs, effect, control);
    1105             :       Reduction r3 = Reduce(cmp3);
    1106           9 :       ASSERT_TRUE(r3.Changed());
    1107          90 :       EXPECT_THAT(r3.replacement(),
    1108             :                   IsSpeculativeNumberEqual(NumberOperationHint::kSignedSmall,
    1109           0 :                                            lhs, rhs, _, _));
    1110             :     }
    1111             :   }
    1112             : }
    1113             : 
    1114             : // -----------------------------------------------------------------------------
    1115             : // SpeculativeNumberLessThan
    1116             : 
    1117       15443 : TEST_F(RedundancyEliminationTest,
    1118             :        SpeculativeNumberLessThanWithCheckBoundsBetterType) {
    1119           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1120          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1121          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1122           9 :       Node* lhs = Parameter(Type::Any(), 0);
    1123           9 :       Node* rhs = Parameter(Type::Any(), 1);
    1124           9 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1125             :       Node* effect = graph()->start();
    1126             :       Node* control = graph()->start();
    1127             : 
    1128           9 :       Node* check1 = effect = graph()->NewNode(
    1129           9 :           simplified()->CheckBounds(feedback1), lhs, length, effect, control);
    1130             :       Reduction r1 = Reduce(check1);
    1131           9 :       ASSERT_TRUE(r1.Changed());
    1132          18 :       EXPECT_EQ(r1.replacement(), check1);
    1133             : 
    1134           9 :       Node* check2 = effect = graph()->NewNode(
    1135           9 :           simplified()->CheckBounds(feedback2), rhs, length, effect, control);
    1136             :       Reduction r2 = Reduce(check2);
    1137           9 :       ASSERT_TRUE(r2.Changed());
    1138          18 :       EXPECT_EQ(r2.replacement(), check2);
    1139             : 
    1140             :       Node* cmp3 = effect =
    1141           9 :           graph()->NewNode(simplified()->SpeculativeNumberLessThan(
    1142             :                                NumberOperationHint::kSignedSmall),
    1143             :                            lhs, rhs, effect, control);
    1144             :       Reduction r3 = Reduce(cmp3);
    1145           9 :       ASSERT_TRUE(r3.Changed());
    1146          90 :       EXPECT_THAT(r3.replacement(),
    1147             :                   IsSpeculativeNumberLessThan(NumberOperationHint::kSignedSmall,
    1148           0 :                                               check1, check2, _, _));
    1149             :     }
    1150             :   }
    1151             : }
    1152             : 
    1153       15443 : TEST_F(RedundancyEliminationTest,
    1154             :        SpeculativeNumberLessThanWithCheckBoundsSameType) {
    1155           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1156          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1157          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1158           9 :       Node* lhs = Parameter(Type::UnsignedSmall(), 0);
    1159           9 :       Node* rhs = Parameter(Type::UnsignedSmall(), 1);
    1160           9 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1161             :       Node* effect = graph()->start();
    1162             :       Node* control = graph()->start();
    1163             : 
    1164           9 :       Node* check1 = effect = graph()->NewNode(
    1165           9 :           simplified()->CheckBounds(feedback1), lhs, length, effect, control);
    1166             :       Reduction r1 = Reduce(check1);
    1167           9 :       ASSERT_TRUE(r1.Changed());
    1168          18 :       EXPECT_EQ(r1.replacement(), check1);
    1169             : 
    1170           9 :       Node* check2 = effect = graph()->NewNode(
    1171           9 :           simplified()->CheckBounds(feedback2), rhs, length, effect, control);
    1172             :       Reduction r2 = Reduce(check2);
    1173           9 :       ASSERT_TRUE(r2.Changed());
    1174          18 :       EXPECT_EQ(r2.replacement(), check2);
    1175             : 
    1176             :       Node* cmp3 = effect =
    1177           9 :           graph()->NewNode(simplified()->SpeculativeNumberLessThan(
    1178             :                                NumberOperationHint::kSignedSmall),
    1179             :                            lhs, rhs, effect, control);
    1180             :       Reduction r3 = Reduce(cmp3);
    1181           9 :       ASSERT_TRUE(r3.Changed());
    1182          90 :       EXPECT_THAT(r3.replacement(),
    1183             :                   IsSpeculativeNumberLessThan(NumberOperationHint::kSignedSmall,
    1184           0 :                                               lhs, rhs, _, _));
    1185             :     }
    1186             :   }
    1187             : }
    1188             : 
    1189             : // -----------------------------------------------------------------------------
    1190             : // SpeculativeNumberLessThanOrEqual
    1191             : 
    1192       15443 : TEST_F(RedundancyEliminationTest,
    1193             :        SpeculativeNumberLessThanOrEqualWithCheckBoundsBetterType) {
    1194           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1195          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1196          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1197           9 :       Node* lhs = Parameter(Type::Any(), 0);
    1198           9 :       Node* rhs = Parameter(Type::Any(), 1);
    1199           9 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1200             :       Node* effect = graph()->start();
    1201             :       Node* control = graph()->start();
    1202             : 
    1203           9 :       Node* check1 = effect = graph()->NewNode(
    1204           9 :           simplified()->CheckBounds(feedback1), lhs, length, effect, control);
    1205             :       Reduction r1 = Reduce(check1);
    1206           9 :       ASSERT_TRUE(r1.Changed());
    1207          18 :       EXPECT_EQ(r1.replacement(), check1);
    1208             : 
    1209           9 :       Node* check2 = effect = graph()->NewNode(
    1210           9 :           simplified()->CheckBounds(feedback2), rhs, length, effect, control);
    1211             :       Reduction r2 = Reduce(check2);
    1212           9 :       ASSERT_TRUE(r2.Changed());
    1213          18 :       EXPECT_EQ(r2.replacement(), check2);
    1214             : 
    1215             :       Node* cmp3 = effect =
    1216           9 :           graph()->NewNode(simplified()->SpeculativeNumberLessThanOrEqual(
    1217             :                                NumberOperationHint::kSignedSmall),
    1218             :                            lhs, rhs, effect, control);
    1219             :       Reduction r3 = Reduce(cmp3);
    1220           9 :       ASSERT_TRUE(r3.Changed());
    1221          90 :       EXPECT_THAT(r3.replacement(),
    1222             :                   IsSpeculativeNumberLessThanOrEqual(
    1223           0 :                       NumberOperationHint::kSignedSmall, check1, check2, _, _));
    1224             :     }
    1225             :   }
    1226             : }
    1227             : 
    1228       15443 : TEST_F(RedundancyEliminationTest,
    1229             :        SpeculativeNumberLessThanOrEqualWithCheckBoundsSameType) {
    1230           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1231          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1232          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1233           9 :       Node* lhs = Parameter(Type::UnsignedSmall(), 0);
    1234           9 :       Node* rhs = Parameter(Type::UnsignedSmall(), 1);
    1235           9 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1236             :       Node* effect = graph()->start();
    1237             :       Node* control = graph()->start();
    1238             : 
    1239           9 :       Node* check1 = effect = graph()->NewNode(
    1240           9 :           simplified()->CheckBounds(feedback1), lhs, length, effect, control);
    1241             :       Reduction r1 = Reduce(check1);
    1242           9 :       ASSERT_TRUE(r1.Changed());
    1243          18 :       EXPECT_EQ(r1.replacement(), check1);
    1244             : 
    1245           9 :       Node* check2 = effect = graph()->NewNode(
    1246           9 :           simplified()->CheckBounds(feedback2), rhs, length, effect, control);
    1247             :       Reduction r2 = Reduce(check2);
    1248           9 :       ASSERT_TRUE(r2.Changed());
    1249          18 :       EXPECT_EQ(r2.replacement(), check2);
    1250             : 
    1251             :       Node* cmp3 = effect =
    1252           9 :           graph()->NewNode(simplified()->SpeculativeNumberLessThanOrEqual(
    1253             :                                NumberOperationHint::kSignedSmall),
    1254             :                            lhs, rhs, effect, control);
    1255             :       Reduction r3 = Reduce(cmp3);
    1256           9 :       ASSERT_TRUE(r3.Changed());
    1257          90 :       EXPECT_THAT(r3.replacement(),
    1258             :                   IsSpeculativeNumberLessThanOrEqual(
    1259           0 :                       NumberOperationHint::kSignedSmall, lhs, rhs, _, _));
    1260             :     }
    1261             :   }
    1262             : }
    1263             : 
    1264             : // -----------------------------------------------------------------------------
    1265             : // SpeculativeNumberAdd
    1266             : 
    1267       15443 : TEST_F(RedundancyEliminationTest,
    1268             :        SpeculativeNumberAddWithCheckBoundsBetterType) {
    1269           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1270          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1271          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1272          15 :       Node* lhs = Parameter(Type::Any(), 0);
    1273          15 :       Node* rhs = Parameter(Type::Any(), 1);
    1274          15 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1275             :       Node* effect = graph()->start();
    1276             :       Node* control = graph()->start();
    1277             : 
    1278          15 :       Node* check1 = effect = graph()->NewNode(
    1279          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1280             :       Reduction r1 = Reduce(check1);
    1281          15 :       ASSERT_TRUE(r1.Changed());
    1282          30 :       EXPECT_EQ(r1.replacement(), check1);
    1283             : 
    1284          15 :       Node* add2 = effect = graph()->NewNode(
    1285             :           simplified()->SpeculativeNumberAdd(hint), lhs, rhs, effect, control);
    1286             :       Reduction r2 = Reduce(add2);
    1287          15 :       ASSERT_TRUE(r2.Changed());
    1288         150 :       EXPECT_THAT(r2.replacement(),
    1289           0 :                   IsSpeculativeNumberAdd(hint, check1, rhs, _, _));
    1290             :     }
    1291             :   }
    1292             : }
    1293             : 
    1294       15443 : TEST_F(RedundancyEliminationTest, SpeculativeNumberAddWithCheckBoundsSameType) {
    1295           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1296          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1297          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1298          15 :       Node* lhs = Parameter(Type::Range(42.0, 42.0, zone()), 0);
    1299          15 :       Node* rhs = Parameter(Type::Any(), 0);
    1300          15 :       Node* length = Parameter(Type::Unsigned31(), 1);
    1301             :       Node* effect = graph()->start();
    1302             :       Node* control = graph()->start();
    1303             : 
    1304          15 :       Node* check1 = effect = graph()->NewNode(
    1305          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1306             :       Reduction r1 = Reduce(check1);
    1307          15 :       ASSERT_TRUE(r1.Changed());
    1308          30 :       EXPECT_EQ(r1.replacement(), check1);
    1309             : 
    1310          15 :       Node* add2 = effect = graph()->NewNode(
    1311             :           simplified()->SpeculativeNumberAdd(hint), lhs, rhs, effect, control);
    1312             :       Reduction r2 = Reduce(add2);
    1313          15 :       ASSERT_TRUE(r2.Changed());
    1314         150 :       EXPECT_THAT(r2.replacement(),
    1315           0 :                   IsSpeculativeNumberAdd(hint, lhs, rhs, _, _));
    1316             :     }
    1317             :   }
    1318             : }
    1319             : 
    1320             : // -----------------------------------------------------------------------------
    1321             : // SpeculativeNumberSubtract
    1322             : 
    1323       15443 : TEST_F(RedundancyEliminationTest,
    1324             :        SpeculativeNumberSubtractWithCheckBoundsBetterType) {
    1325           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1326          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1327          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1328          15 :       Node* lhs = Parameter(Type::Any(), 0);
    1329          15 :       Node* rhs = Parameter(Type::Any(), 1);
    1330          15 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1331             :       Node* effect = graph()->start();
    1332             :       Node* control = graph()->start();
    1333             : 
    1334          15 :       Node* check1 = effect = graph()->NewNode(
    1335          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1336             :       Reduction r1 = Reduce(check1);
    1337          15 :       ASSERT_TRUE(r1.Changed());
    1338          30 :       EXPECT_EQ(r1.replacement(), check1);
    1339             : 
    1340             :       Node* subtract2 = effect =
    1341          15 :           graph()->NewNode(simplified()->SpeculativeNumberSubtract(hint), lhs,
    1342             :                            rhs, effect, control);
    1343             :       Reduction r2 = Reduce(subtract2);
    1344          15 :       ASSERT_TRUE(r2.Changed());
    1345         150 :       EXPECT_THAT(r2.replacement(),
    1346           0 :                   IsSpeculativeNumberSubtract(hint, check1, rhs, _, _));
    1347             :     }
    1348             :   }
    1349             : }
    1350             : 
    1351       15443 : TEST_F(RedundancyEliminationTest,
    1352             :        SpeculativeNumberSubtractWithCheckBoundsSameType) {
    1353           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1354          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1355          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1356          15 :       Node* lhs = Parameter(Type::Range(42.0, 42.0, zone()), 0);
    1357          15 :       Node* rhs = Parameter(Type::Any(), 0);
    1358          15 :       Node* length = Parameter(Type::Unsigned31(), 1);
    1359             :       Node* effect = graph()->start();
    1360             :       Node* control = graph()->start();
    1361             : 
    1362          15 :       Node* check1 = effect = graph()->NewNode(
    1363          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1364             :       Reduction r1 = Reduce(check1);
    1365          15 :       ASSERT_TRUE(r1.Changed());
    1366          30 :       EXPECT_EQ(r1.replacement(), check1);
    1367             : 
    1368             :       Node* subtract2 = effect =
    1369          15 :           graph()->NewNode(simplified()->SpeculativeNumberSubtract(hint), lhs,
    1370             :                            rhs, effect, control);
    1371             :       Reduction r2 = Reduce(subtract2);
    1372          15 :       ASSERT_TRUE(r2.Changed());
    1373         150 :       EXPECT_THAT(r2.replacement(),
    1374           0 :                   IsSpeculativeNumberSubtract(hint, lhs, rhs, _, _));
    1375             :     }
    1376             :   }
    1377             : }
    1378             : 
    1379             : // -----------------------------------------------------------------------------
    1380             : // SpeculativeSafeIntegerAdd
    1381             : 
    1382       15443 : TEST_F(RedundancyEliminationTest,
    1383             :        SpeculativeSafeIntegerAddWithCheckBoundsBetterType) {
    1384           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1385          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1386          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1387          15 :       Node* lhs = Parameter(Type::Any(), 0);
    1388          15 :       Node* rhs = Parameter(Type::Any(), 1);
    1389          15 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1390             :       Node* effect = graph()->start();
    1391             :       Node* control = graph()->start();
    1392             : 
    1393          15 :       Node* check1 = effect = graph()->NewNode(
    1394          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1395             :       Reduction r1 = Reduce(check1);
    1396          15 :       ASSERT_TRUE(r1.Changed());
    1397          30 :       EXPECT_EQ(r1.replacement(), check1);
    1398             : 
    1399             :       Node* add2 = effect =
    1400          15 :           graph()->NewNode(simplified()->SpeculativeSafeIntegerAdd(hint), lhs,
    1401             :                            rhs, effect, control);
    1402             :       Reduction r2 = Reduce(add2);
    1403          15 :       ASSERT_TRUE(r2.Changed());
    1404         150 :       EXPECT_THAT(r2.replacement(),
    1405           0 :                   IsSpeculativeSafeIntegerAdd(hint, check1, rhs, _, _));
    1406             :     }
    1407             :   }
    1408             : }
    1409             : 
    1410       15443 : TEST_F(RedundancyEliminationTest,
    1411             :        SpeculativeSafeIntegerAddWithCheckBoundsSameType) {
    1412           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1413          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1414          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1415          15 :       Node* lhs = Parameter(Type::Range(42.0, 42.0, zone()), 0);
    1416          15 :       Node* rhs = Parameter(Type::Any(), 0);
    1417          15 :       Node* length = Parameter(Type::Unsigned31(), 1);
    1418             :       Node* effect = graph()->start();
    1419             :       Node* control = graph()->start();
    1420             : 
    1421          15 :       Node* check1 = effect = graph()->NewNode(
    1422          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1423             :       Reduction r1 = Reduce(check1);
    1424          15 :       ASSERT_TRUE(r1.Changed());
    1425          30 :       EXPECT_EQ(r1.replacement(), check1);
    1426             : 
    1427             :       Node* add2 = effect =
    1428          15 :           graph()->NewNode(simplified()->SpeculativeSafeIntegerAdd(hint), lhs,
    1429             :                            rhs, effect, control);
    1430             :       Reduction r2 = Reduce(add2);
    1431          15 :       ASSERT_TRUE(r2.Changed());
    1432         150 :       EXPECT_THAT(r2.replacement(),
    1433           0 :                   IsSpeculativeSafeIntegerAdd(hint, lhs, rhs, _, _));
    1434             :     }
    1435             :   }
    1436             : }
    1437             : 
    1438             : // -----------------------------------------------------------------------------
    1439             : // SpeculativeSafeIntegerSubtract
    1440             : 
    1441       15443 : TEST_F(RedundancyEliminationTest,
    1442             :        SpeculativeSafeIntegerSubtractWithCheckBoundsBetterType) {
    1443           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1444          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1445          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1446          15 :       Node* lhs = Parameter(Type::Any(), 0);
    1447          15 :       Node* rhs = Parameter(Type::Any(), 1);
    1448          15 :       Node* length = Parameter(Type::Unsigned31(), 2);
    1449             :       Node* effect = graph()->start();
    1450             :       Node* control = graph()->start();
    1451             : 
    1452          15 :       Node* check1 = effect = graph()->NewNode(
    1453          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1454             :       Reduction r1 = Reduce(check1);
    1455          15 :       ASSERT_TRUE(r1.Changed());
    1456          30 :       EXPECT_EQ(r1.replacement(), check1);
    1457             : 
    1458             :       Node* subtract2 = effect =
    1459          15 :           graph()->NewNode(simplified()->SpeculativeSafeIntegerSubtract(hint),
    1460             :                            lhs, rhs, effect, control);
    1461             :       Reduction r2 = Reduce(subtract2);
    1462          15 :       ASSERT_TRUE(r2.Changed());
    1463         150 :       EXPECT_THAT(r2.replacement(),
    1464           0 :                   IsSpeculativeSafeIntegerSubtract(hint, check1, rhs, _, _));
    1465             :     }
    1466             :   }
    1467             : }
    1468             : 
    1469       15443 : TEST_F(RedundancyEliminationTest,
    1470             :        SpeculativeSafeIntegerSubtractWithCheckBoundsSameType) {
    1471           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1472          13 :   TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
    1473          63 :     TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1474          15 :       Node* lhs = Parameter(Type::Range(42.0, 42.0, zone()), 0);
    1475          15 :       Node* rhs = Parameter(Type::Any(), 0);
    1476          15 :       Node* length = Parameter(Type::Unsigned31(), 1);
    1477             :       Node* effect = graph()->start();
    1478             :       Node* control = graph()->start();
    1479             : 
    1480          15 :       Node* check1 = effect = graph()->NewNode(
    1481          15 :           simplified()->CheckBounds(feedback), lhs, length, effect, control);
    1482             :       Reduction r1 = Reduce(check1);
    1483          15 :       ASSERT_TRUE(r1.Changed());
    1484          30 :       EXPECT_EQ(r1.replacement(), check1);
    1485             : 
    1486             :       Node* subtract2 = effect =
    1487          15 :           graph()->NewNode(simplified()->SpeculativeSafeIntegerSubtract(hint),
    1488             :                            lhs, rhs, effect, control);
    1489             :       Reduction r2 = Reduce(subtract2);
    1490          15 :       ASSERT_TRUE(r2.Changed());
    1491         150 :       EXPECT_THAT(r2.replacement(),
    1492           0 :                   IsSpeculativeSafeIntegerSubtract(hint, lhs, rhs, _, _));
    1493             :     }
    1494             :   }
    1495             : }
    1496             : 
    1497             : // -----------------------------------------------------------------------------
    1498             : // SpeculativeToNumber
    1499             : 
    1500       15443 : TEST_F(RedundancyEliminationTest,
    1501             :        SpeculativeToNumberWithCheckBoundsBetterType) {
    1502           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1503          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1504          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1505         189 :       TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1506          45 :         Node* index = Parameter(Type::Any(), 0);
    1507          45 :         Node* length = Parameter(Type::Unsigned31(), 1);
    1508             :         Node* effect = graph()->start();
    1509             :         Node* control = graph()->start();
    1510             : 
    1511             :         Node* check1 = effect =
    1512          45 :             graph()->NewNode(simplified()->CheckBounds(feedback1), index,
    1513          45 :                              length, effect, control);
    1514             :         Reduction r1 = Reduce(check1);
    1515          45 :         ASSERT_TRUE(r1.Changed());
    1516          90 :         EXPECT_EQ(r1.replacement(), check1);
    1517             : 
    1518             :         Node* to_number2 = effect =
    1519          45 :             graph()->NewNode(simplified()->SpeculativeToNumber(hint, feedback2),
    1520             :                              index, effect, control);
    1521             :         Reduction r2 = Reduce(to_number2);
    1522          45 :         ASSERT_TRUE(r2.Changed());
    1523         225 :         EXPECT_THAT(r2.replacement(), IsSpeculativeToNumber(check1));
    1524             :       }
    1525             :     }
    1526             :   }
    1527             : }
    1528             : 
    1529       15443 : TEST_F(RedundancyEliminationTest, SpeculativeToNumberWithCheckBoundsSameType) {
    1530           2 :   Typer typer(broker(), Typer::kNoFlags, graph());
    1531          13 :   TRACED_FOREACH(VectorSlotPair, feedback1, vector_slot_pairs()) {
    1532          39 :     TRACED_FOREACH(VectorSlotPair, feedback2, vector_slot_pairs()) {
    1533         189 :       TRACED_FOREACH(NumberOperationHint, hint, kNumberOperationHints) {
    1534          45 :         Node* index = Parameter(Type::Range(42.0, 42.0, zone()), 0);
    1535          45 :         Node* length = Parameter(Type::Unsigned31(), 1);
    1536             :         Node* effect = graph()->start();
    1537             :         Node* control = graph()->start();
    1538             : 
    1539             :         Node* check1 = effect =
    1540          45 :             graph()->NewNode(simplified()->CheckBounds(feedback1), index,
    1541          45 :                              length, effect, control);
    1542             :         Reduction r1 = Reduce(check1);
    1543          45 :         ASSERT_TRUE(r1.Changed());
    1544          90 :         EXPECT_EQ(r1.replacement(), check1);
    1545             : 
    1546             :         Node* to_number2 = effect =
    1547          45 :             graph()->NewNode(simplified()->SpeculativeToNumber(hint, feedback2),
    1548             :                              index, effect, control);
    1549             :         Reduction r2 = Reduce(to_number2);
    1550          45 :         ASSERT_TRUE(r2.Changed());
    1551         225 :         EXPECT_THAT(r2.replacement(), IsSpeculativeToNumber(index));
    1552             :       }
    1553             :     }
    1554             :   }
    1555             : }
    1556             : 
    1557             : }  // namespace redundancy_elimination_unittest
    1558             : }  // namespace compiler
    1559             : }  // namespace internal
    1560        9264 : }  // namespace v8

Generated by: LCOV version 1.10