- if (info.format == DataFormatNone) {
- // Try to see if there is an alternate node that would contain the value we want.
- // There are four possibilities:
- //
- // Int32ToDouble: We can use this in place of the original node, but
- // we'd rather not; so we use it only if it is the only remaining
- // live version.
- //
- // ValueToInt32: If the only remaining live version of the value is
- // ValueToInt32, then we can use it.
- //
- // UInt32ToNumber: If the only live version of the value is a UInt32ToNumber
- // then the only remaining uses are ones that want a properly formed number
- // rather than a UInt32 intermediate.
- //
- // DoubleAsInt32: Same as UInt32ToNumber.
- //
- // The reverse of the above: This node could be a UInt32ToNumber, but its
- // alternative is still alive. This means that the only remaining uses of
- // the number would be fine with a UInt32 intermediate.
-
- bool found = false;
-
- if (node && node->op() == UInt32ToNumber) {
- MinifiedID id = node->child1();
- if (tryToSetConstantRecovery(valueRecoveries[i], codeBlock, graph.at(id)))
- continue;
- info = generationInfos.get(id);
- if (info.format != DataFormatNone)
- found = true;
- }
-
- if (!found) {
- MinifiedID int32ToDoubleID;
- MinifiedID valueToInt32ID;
- MinifiedID uint32ToNumberID;
- MinifiedID doubleAsInt32ID;
-
- HashMap<MinifiedID, MinifiedGenerationInfo>::iterator iter = generationInfos.begin();
- HashMap<MinifiedID, MinifiedGenerationInfo>::iterator end = generationInfos.end();
- for (; iter != end; ++iter) {
- MinifiedID id = iter->key;
- node = graph.at(id);
- if (!node)
- continue;
- if (!node->hasChild1())
- continue;
- if (node->child1() != source.id())
- continue;
- if (iter->value.format == DataFormatNone)
- continue;
- switch (node->op()) {
- case Int32ToDouble:
- case ForwardInt32ToDouble:
- int32ToDoubleID = id;
- break;
- case ValueToInt32:
- valueToInt32ID = id;
- break;
- case UInt32ToNumber:
- uint32ToNumberID = id;
- break;
- case DoubleAsInt32:
- doubleAsInt32ID = id;
- break;
- default:
- break;
- }
- }
-
- MinifiedID idToUse;
- if (!!doubleAsInt32ID)
- idToUse = doubleAsInt32ID;
- else if (!!int32ToDoubleID)
- idToUse = int32ToDoubleID;
- else if (!!valueToInt32ID)
- idToUse = valueToInt32ID;
- else if (!!uint32ToNumberID)
- idToUse = uint32ToNumberID;
-
- if (!!idToUse) {
- info = generationInfos.get(idToUse);
- ASSERT(info.format != DataFormatNone);
- found = true;
- }
- }
-
- if (!found) {
- valueRecoveries[i] = ValueRecovery::constant(jsUndefined());
- continue;
- }