Index: src/hydrogen-instructions.cc |
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
index b36706b49b48119b6332a54e6782a9904e929ee5..55af215bc63a5d33c6352848af7927b6678dfe40 100644 |
--- a/src/hydrogen-instructions.cc |
+++ b/src/hydrogen-instructions.cc |
@@ -84,6 +84,10 @@ void HValue::InferRepresentation(HInferRepresentation* h_infer) { |
UpdateRepresentation(new_rep, h_infer, "inputs"); |
new_rep = RepresentationFromUses(); |
UpdateRepresentation(new_rep, h_infer, "uses"); |
+ new_rep = RepresentationFromUseRequirements(); |
+ if (new_rep.fits_into(Representation::Integer32())) { |
+ UpdateRepresentation(new_rep, h_infer, "use requirements"); |
+ } |
} |
@@ -2304,6 +2308,10 @@ void HBinaryOperation::InferRepresentation(HInferRepresentation* h_infer) { |
if (!observed_output_representation_.IsNone()) return; |
new_rep = RepresentationFromUses(); |
UpdateRepresentation(new_rep, h_infer, "uses"); |
+ new_rep = RepresentationFromUseRequirements(); |
+ if (new_rep.fits_into(Representation::Integer32())) { |
+ UpdateRepresentation(new_rep, h_infer, "use requirements"); |
+ } |
} |
@@ -3660,34 +3668,26 @@ Representation HPhi::RepresentationFromInputs() { |
} |
-Representation HPhi::RepresentationFromUseRequirements() { |
- Representation all_uses_require = Representation::None(); |
- bool all_uses_require_the_same = true; |
+// Returns a representation if all uses agree on the same representation. |
+// Integer32 is also returned when some uses are Smi but others are Integer32. |
+Representation HValue::RepresentationFromUseRequirements() { |
+ Representation rep = Representation::None(); |
for (HUseIterator it(uses()); !it.Done(); it.Advance()) { |
// We check for observed_input_representation elsewhere. |
Representation use_rep = |
it.value()->RequiredInputRepresentation(it.index()); |
- // No useful info from this use -> look at the next one. |
- if (use_rep.IsNone()) { |
+ if (rep.IsNone()) { |
+ rep = use_rep; |
continue; |
} |
- if (use_rep.Equals(all_uses_require)) { |
+ if (use_rep.IsNone() || rep.Equals(use_rep)) continue; |
+ if (rep.generalize(use_rep).IsInteger32()) { |
+ rep = Representation::Integer32(); |
continue; |
} |
- // This use's representation contradicts what we've seen so far. |
- if (!all_uses_require.IsNone()) { |
- ASSERT(!use_rep.Equals(all_uses_require)); |
- all_uses_require_the_same = false; |
- break; |
- } |
- // Otherwise, initialize observed representation. |
- all_uses_require = use_rep; |
- } |
- if (all_uses_require_the_same) { |
- return all_uses_require; |
+ return Representation::None(); |
} |
- |
- return Representation::None(); |
+ return rep; |
} |