ASSERT(!value->representation().Equals(to));
set_representation(to);
SetFlag(kUseGVN);
- if (deoptimize_on_undefined || to.IsTagged()) {
- SetFlag(kDeoptimizeOnUndefined);
- }
+ if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined);
if (is_truncating) SetFlag(kTruncatingToInt32);
if (value->representation().IsSmi() || value->type().IsSmi()) {
set_type(HType::Smi());
HPhi* phi = phi_list()->at(i);
if (phi->representation().IsDouble()) {
for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) {
- if (it.value()->CheckFlag(HValue::kDeoptimizeOnUndefined)) {
+ int use_index = it.index();
+ HValue* use_value = it.value();
+ Representation req = use_value->RequiredInputRepresentation(use_index);
+ if (!req.IsDouble() ||
+ use_value->CheckFlag(HValue::kDeoptimizeOnUndefined)) {
RecursivelyMarkPhiDeoptimizeOnUndefined(phi);
break;
}
// This must happen after inferring representations.
MergeRemovableSimulates();
- InsertRepresentationChanges();
MarkDeoptimizeOnUndefined();
+ InsertRepresentationChanges();
InitializeInferredTypes();