Index: src/x64/lithium-x64.cc |
diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc |
index 93a2eb7fcc3ff52c16d1fddddaabdb1e0b8be9e8..6262e7ede37719d537224d211569a945341ce68b 100644 |
--- a/src/x64/lithium-x64.cc |
+++ b/src/x64/lithium-x64.cc |
@@ -1883,10 +1883,18 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
} else if (to.IsSmi()) { |
HValue* val = instr->value(); |
LOperand* value = UseRegister(val); |
- LInstruction* result = |
- DefineAsRegister(new(zone()) LInteger32ToSmi(value)); |
- if (val->HasRange() && val->range()->IsInSmiRange()) { |
- return result; |
+ LInstruction* result = NULL; |
+ if (val->CheckFlag(HInstruction::kUint32)) { |
+ result = DefineAsRegister(new(zone()) LUint32ToSmi(value)); |
+ if (val->HasRange() && val->range()->IsInSmiRange() && |
+ val->range()->upper() != kMaxInt) { |
+ return result; |
+ } |
+ } else { |
+ result = DefineAsRegister(new(zone()) LInteger32ToSmi(value)); |
+ if (val->HasRange() && val->range()->IsInSmiRange()) { |
+ return result; |
+ } |
} |
return AssignEnvironment(result); |
} else { |