| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index 28617517163d6e589860dd2ac8030ad48f39e395..78ea1dee1df3227d83389aad507242a07903e389 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -1408,81 +1408,51 @@ void HChange::PrintDataTo(StringStream* stream) {
|
| }
|
|
|
|
|
| -static HValue* SimplifiedDividendForMathFloorOfDiv(HValue* dividend) {
|
| - // A value with an integer representation does not need to be transformed.
|
| - if (dividend->representation().IsInteger32()) {
|
| - return dividend;
|
| - }
|
| - // A change from an integer32 can be replaced by the integer32 value.
|
| - if (dividend->IsChange() &&
|
| - HChange::cast(dividend)->from().IsInteger32()) {
|
| - return HChange::cast(dividend)->value();
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -
|
| HValue* HUnaryMathOperation::Canonicalize() {
|
| if (op() == kMathRound || op() == kMathFloor) {
|
| HValue* val = value();
|
| if (val->IsChange()) val = HChange::cast(val)->value();
|
| -
|
| - // If the input is smi or integer32 then we replace the instruction with its
|
| - // input.
|
| if (val->representation().IsSmiOrInteger32()) {
|
| - if (!val->representation().Equals(representation())) {
|
| - HChange* result = new(block()->zone()) HChange(
|
| - val, representation(), false, false);
|
| - result->InsertBefore(this);
|
| - return result;
|
| - }
|
| - return val;
|
| + if (val->representation().Equals(representation())) return val;
|
| + return Prepend(new(block()->zone()) HChange(
|
| + val, representation(), false, false));
|
| }
|
| }
|
| + if (op() == kMathFloor && value()->IsDiv() && value()->UseCount() == 1) {
|
| + HDiv* hdiv = HDiv::cast(value());
|
| +
|
| + HValue* left = hdiv->left();
|
| + if (left->representation().IsInteger32()) {
|
| + // A value with an integer representation does not need to be transformed.
|
| + } else if (left->IsChange() && HChange::cast(left)->from().IsInteger32()) {
|
| + // A change from an integer32 can be replaced by the integer32 value.
|
| + left = HChange::cast(left)->value();
|
| + } else if (hdiv->observed_input_representation(1).IsSmiOrInteger32()) {
|
| + left = Prepend(new(block()->zone()) HChange(
|
| + left, Representation::Integer32(), false, false));
|
| + } else {
|
| + return this;
|
| + }
|
|
|
| - if (op() == kMathFloor) {
|
| - HValue* val = value();
|
| - if (val->IsDiv() && (val->UseCount() == 1)) {
|
| - HDiv* hdiv = HDiv::cast(val);
|
| - HValue* left = hdiv->left();
|
| - HValue* right = hdiv->right();
|
| - // Try to simplify left and right values of the division.
|
| - HValue* new_left = SimplifiedDividendForMathFloorOfDiv(left);
|
| - if (new_left == NULL &&
|
| - hdiv->observed_input_representation(1).IsSmiOrInteger32()) {
|
| - new_left = new(block()->zone()) HChange(
|
| - left, Representation::Integer32(), false, false);
|
| - HChange::cast(new_left)->InsertBefore(this);
|
| - }
|
| - HValue* new_right =
|
| - LChunkBuilder::SimplifiedDivisorForMathFloorOfDiv(right);
|
| - if (new_right == NULL &&
|
| -#if V8_TARGET_ARCH_ARM
|
| - CpuFeatures::IsSupported(SUDIV) &&
|
| -#endif
|
| - hdiv->observed_input_representation(2).IsSmiOrInteger32()) {
|
| - new_right = new(block()->zone()) HChange(
|
| - right, Representation::Integer32(), false, false);
|
| - HChange::cast(new_right)->InsertBefore(this);
|
| - }
|
| -
|
| - // Return if left or right are not optimizable.
|
| - if ((new_left == NULL) || (new_right == NULL)) return this;
|
| -
|
| - // Insert the new values in the graph.
|
| - if (new_left->IsInstruction() &&
|
| - !HInstruction::cast(new_left)->IsLinked()) {
|
| - HInstruction::cast(new_left)->InsertBefore(this);
|
| - }
|
| - if (new_right->IsInstruction() &&
|
| - !HInstruction::cast(new_right)->IsLinked()) {
|
| - HInstruction::cast(new_right)->InsertBefore(this);
|
| - }
|
| - HMathFloorOfDiv* instr =
|
| - HMathFloorOfDiv::New(block()->zone(), context(), new_left, new_right);
|
| - instr->InsertBefore(this);
|
| - return instr;
|
| + HValue* right = hdiv->right();
|
| + if (right->IsInteger32Constant()) {
|
| + right = Prepend(HConstant::cast(right)->CopyToRepresentation(
|
| + Representation::Integer32(), right->block()->zone()));
|
| + } else if (right->representation().IsInteger32()) {
|
| + // A value with an integer representation does not need to be transformed.
|
| + } else if (right->IsChange() &&
|
| + HChange::cast(right)->from().IsInteger32()) {
|
| + // A change from an integer32 can be replaced by the integer32 value.
|
| + right = HChange::cast(right)->value();
|
| + } else if (hdiv->observed_input_representation(2).IsSmiOrInteger32()) {
|
| + right = Prepend(new(block()->zone()) HChange(
|
| + right, Representation::Integer32(), false, false));
|
| + } else {
|
| + return this;
|
| }
|
| +
|
| + return Prepend(HMathFloorOfDiv::New(
|
| + block()->zone(), context(), left, right));
|
| }
|
| return this;
|
| }
|
| @@ -3226,10 +3196,8 @@ HValue* HLoadKeyedGeneric::Canonicalize() {
|
| key_load->elements_kind());
|
| map_check->InsertBefore(this);
|
| index->InsertBefore(this);
|
| - HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex(
|
| - object(), index);
|
| - load->InsertBefore(this);
|
| - return load;
|
| + return Prepend(new(block()->zone()) HLoadFieldByIndex(
|
| + object(), index));
|
| }
|
| }
|
| }
|
|
|