| Index: src/hydrogen-uint32-analysis.cc
|
| diff --git a/src/hydrogen-uint32-analysis.cc b/src/hydrogen-uint32-analysis.cc
|
| index 21fbec9f3363bc4de1e7b0bee10cf6210811bfd7..24c256b503a6b8af464700e4a6fa23a4912a94ea 100644
|
| --- a/src/hydrogen-uint32-analysis.cc
|
| +++ b/src/hydrogen-uint32-analysis.cc
|
| @@ -8,6 +8,30 @@ namespace v8 {
|
| namespace internal {
|
|
|
|
|
| +static bool IsUnsignedLoad(HLoadKeyed* instr) {
|
| + switch (instr->elements_kind()) {
|
| + case EXTERNAL_UINT8_ELEMENTS:
|
| + case EXTERNAL_UINT16_ELEMENTS:
|
| + case EXTERNAL_UINT32_ELEMENTS:
|
| + case EXTERNAL_UINT8_CLAMPED_ELEMENTS:
|
| + case UINT8_ELEMENTS:
|
| + case UINT16_ELEMENTS:
|
| + case UINT32_ELEMENTS:
|
| + case UINT8_CLAMPED_ELEMENTS:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| +
|
| +static bool IsUint32Operation(HValue* instr) {
|
| + return instr->IsShr() ||
|
| + (instr->IsLoadKeyed() && IsUnsignedLoad(HLoadKeyed::cast(instr))) ||
|
| + (instr->IsInteger32Constant() && instr->GetInteger32Constant() >= 0);
|
| +}
|
| +
|
| +
|
| bool HUint32AnalysisPhase::IsSafeUint32Use(HValue* val, HValue* use) {
|
| // Operations that operate on bits are safe.
|
| if (use->IsBitwise() || use->IsShl() || use->IsSar() || use->IsShr()) {
|
| @@ -37,6 +61,9 @@ bool HUint32AnalysisPhase::IsSafeUint32Use(HValue* val, HValue* use) {
|
| return true;
|
| }
|
| }
|
| + } else if (use->IsCompareNumericAndBranch()) {
|
| + HCompareNumericAndBranch* c = HCompareNumericAndBranch::cast(use);
|
| + return IsUint32Operation(c->left()) && IsUint32Operation(c->right());
|
| }
|
|
|
| return false;
|
|
|