Index: src/ia32/lithium-ia32.cc |
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc |
index f03cd72becf934e44ade1ae8b10274adb33aa05b..2806b662661c41c768e75e8fd14fa96677a9e78d 100644 |
--- a/src/ia32/lithium-ia32.cc |
+++ b/src/ia32/lithium-ia32.cc |
@@ -761,7 +761,7 @@ LInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { |
LInstruction* LChunkBuilder::DoShift(Token::Value op, |
HBitwiseBinaryOperation* instr) { |
- if (instr->representation().IsSmiOrTagged()) { |
+ if (instr->representation().IsTagged()) { |
ASSERT(instr->left()->representation().IsSmiOrTagged()); |
ASSERT(instr->right()->representation().IsSmiOrTagged()); |
@@ -772,25 +772,35 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, |
return MarkAsCall(DefineFixed(result, eax), instr); |
} |
- ASSERT(instr->representation().IsInteger32()); |
- ASSERT(instr->left()->representation().IsInteger32()); |
- ASSERT(instr->right()->representation().IsInteger32()); |
+ ASSERT(instr->representation().IsSmiOrInteger32()); |
+ ASSERT(instr->left()->representation().Equals(instr->representation())); |
+ ASSERT(instr->right()->representation().Equals(instr->representation())); |
LOperand* left = UseRegisterAtStart(instr->left()); |
HValue* right_value = instr->right(); |
LOperand* right = NULL; |
int constant_value = 0; |
+ bool does_deopt = false; |
if (right_value->IsConstant()) { |
HConstant* constant = HConstant::cast(right_value); |
right = chunk_->DefineConstantOperand(constant); |
constant_value = constant->Integer32Value() & 0x1f; |
+ // Left shifts can deoptimize if we shift by > 0 and the result cannot be |
mvstanton
2013/07/26 13:34:48
What if instr representation is smi but right_valu
|
+ // truncated to smi. |
+ if (instr->representation().IsSmi() && constant_value > 0) { |
+ for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { |
+ if (!it.value()->CheckFlag(HValue::kTruncatingToSmi)) { |
+ does_deopt = true; |
+ break; |
+ } |
+ } |
+ } |
} else { |
right = UseFixed(right_value, ecx); |
} |
// Shift operations can only deoptimize if we do a logical shift by 0 and |
mvstanton
2013/07/26 13:34:48
Say "Right shift operations" here.
|
// the result cannot be truncated to int32. |
- bool does_deopt = false; |
if (op == Token::SHR && constant_value == 0) { |
if (FLAG_opt_safe_uint32_operations) { |
does_deopt = !instr->CheckFlag(HInstruction::kUint32); |