Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index e2f3044409cb57b73da7cab0a0f049349074f516..761837576b3b40401063da876012e38ecf5eb18c 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -33,11 +33,10 @@ |
: jsgraph_(jsgraph), simplified_(graph()->zone()), conversions_(zone) { |
Handle<Object> zero = factory()->NewNumber(0.0); |
Handle<Object> one = factory()->NewNumber(1.0); |
- zero_range_ = Type::Range(zero, zero, zone); |
- one_range_ = Type::Range(one, one, zone); |
- zero_one_range_ = Type::Range(zero, one, zone); |
+ zero_range_ = Type::Range(zero, zero, graph()->zone()); |
+ one_range_ = Type::Range(one, one, graph()->zone()); |
Handle<Object> thirtyone = factory()->NewNumber(31.0); |
- zero_thirtyone_range_ = Type::Range(zero, thirtyone, zone); |
+ zero_thirtyone_range_ = Type::Range(zero, thirtyone, graph()->zone()); |
// TODO(jarin): Can we have a correctification of the stupid type system? |
// These stupid work-arounds are just stupid! |
shifted_int32_ranges_[0] = Type::Signed32(); |
@@ -46,13 +45,13 @@ |
for (size_t k = 2; k < arraysize(shifted_int32_ranges_); ++k) { |
Handle<Object> min = factory()->NewNumber(kMinInt / (1 << k)); |
Handle<Object> max = factory()->NewNumber(kMaxInt / (1 << k)); |
- shifted_int32_ranges_[k] = Type::Range(min, max, zone); |
+ shifted_int32_ranges_[k] = Type::Range(min, max, graph()->zone()); |
} |
} else { |
for (size_t k = 1; k < arraysize(shifted_int32_ranges_); ++k) { |
Handle<Object> min = factory()->NewNumber(kMinInt / (1 << k)); |
Handle<Object> max = factory()->NewNumber(kMaxInt / (1 << k)); |
- shifted_int32_ranges_[k] = Type::Range(min, max, zone); |
+ shifted_int32_ranges_[k] = Type::Range(min, max, graph()->zone()); |
} |
} |
} |
@@ -112,11 +111,6 @@ |
std::swap(left_type_, right_type_); |
} |
- void ReplaceLeftInput(Node* l) { |
- node_->ReplaceInput(0, l); |
- left_type_ = NodeProperties::GetBounds(l).upper; |
- } |
- |
// Remove all effect and control inputs and outputs to this node and change |
// to the pure operator {op}, possibly inserting a boolean inversion. |
Reduction ChangeToPureOperator(const Operator* op, bool invert = false, |
@@ -124,17 +118,16 @@ |
DCHECK_EQ(0, op->EffectInputCount()); |
DCHECK_EQ(false, OperatorProperties::HasContextInput(op)); |
DCHECK_EQ(0, op->ControlInputCount()); |
- DCHECK_LE(1, op->ValueInputCount()); |
- DCHECK_GE(2, op->ValueInputCount()); |
+ DCHECK_EQ(2, op->ValueInputCount()); |
// Remove the effects from the node, if any, and update its effect usages. |
if (node_->op()->EffectInputCount() > 0) { |
RelaxEffects(node_); |
} |
+ // Remove the inputs corresponding to context, effect, and control. |
+ NodeProperties::RemoveNonValueInputs(node_); |
// Finally, update the operator to the new one. |
node_->set_op(op); |
- // Remove the inputs corresponding to context, effect, and control. |
- NodeProperties::RemoveNonValueInputs(node_); |
// TODO(jarin): Replace the explicit typing hack with a call to some method |
// that encapsulates changing the operator and re-typing. |
@@ -156,18 +149,11 @@ |
return ChangeToPureOperator(op, false, type); |
} |
- Reduction ReplaceWithLeftInput() { |
- // Remove the effects from the node, if any, and update its effect usages. |
- if (node_->op()->EffectInputCount() > 0) { |
- RelaxEffects(node_); |
- } |
- return lowering_->Replace(left()); |
- } |
- |
- bool LeftInputIs(Type* t) { return left_type_->Is(t); } |
- bool RightInputIs(Type* t) { return right_type_->Is(t); } |
- bool OneInputIs(Type* t) { return LeftInputIs(t) || RightInputIs(t); } |
- bool BothInputsAre(Type* t) { return LeftInputIs(t) && RightInputIs(t); } |
+ bool OneInputIs(Type* t) { return left_type_->Is(t) || right_type_->Is(t); } |
+ |
+ bool BothInputsAre(Type* t) { |
+ return left_type_->Is(t) && right_type_->Is(t); |
+ } |
bool OneInputCannotBe(Type* t) { |
return !left_type_->Maybe(t) || !right_type_->Maybe(t); |
@@ -275,41 +261,6 @@ |
return r.ChangeToPureOperator(simplified()->StringAdd()); |
} |
#endif |
- return NoChange(); |
-} |
- |
- |
-Reduction JSTypedLowering::ReduceJSBitwiseAnd(Node* node) { |
- JSBinopReduction r(this, node); |
- if (r.LeftInputIs(one_range_)) { |
- if (r.RightInputIs(zero_one_range_)) { |
- // JSBitwiseAnd(1, x:[0,1]) => x |
- r.SwapInputs(); |
- return r.ReplaceWithLeftInput(); |
- } else if (r.RightInputIs(Type::Boolean())) { |
- // JSBitwiseAnd(1, x:boolean) => BooleanToNumber(x) |
- r.SwapInputs(); |
- return r.ChangeToPureOperator(simplified()->BooleanToNumber()); |
- } |
- } |
- if (r.RightInputIs(one_range_)) { |
- if (r.LeftInputIs(zero_one_range_)) { |
- // JSBitwiseAnd(x:[0,1], 1) => x |
- return r.ReplaceWithLeftInput(); |
- } else if (r.LeftInputIs(Type::Boolean())) { |
- // JSBitwiseAnd(x:boolean, 1) => BooleanToNumber(x) |
- return r.ChangeToPureOperator(simplified()->BooleanToNumber()); |
- } |
- } |
- if (r.BothInputsAre(Type::Primitive())) { |
- // TODO(titzer): some Smi bitwise operations don't really require going |
- // all the way to int32, which can save tagging/untagging for some |
- // operations |
- // on some platforms. |
- // TODO(turbofan): make this heuristic configurable for code size. |
- r.ConvertInputsToUI32(kSigned, kSigned); |
- return r.ChangeToPureOperator(machine()->Word32And(), Type::Integral32()); |
- } |
return NoChange(); |
} |
@@ -936,7 +887,7 @@ |
case IrOpcode::kJSBitwiseXor: |
return ReduceInt32Binop(node, machine()->Word32Xor()); |
case IrOpcode::kJSBitwiseAnd: |
- return ReduceJSBitwiseAnd(node); |
+ return ReduceInt32Binop(node, machine()->Word32And()); |
case IrOpcode::kJSShiftLeft: |
return ReduceUI32Shift(node, kSigned, machine()->Word32Shl()); |
case IrOpcode::kJSShiftRight: |