Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index b822a785325bf050c1c7d5d1813e4285e072aae4..4a16288943783ad890784acafd6391eff7156d2a 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -562,7 +562,14 @@ class HValue: public ZoneObject { |
kIsArguments, |
kTruncatingToInt32, |
kIsDead, |
- kLastFlag = kIsDead |
+ // Instructions that are allowed to produce full range unsigned integer |
+ // values are marked with kUint32 flag. If arithmetic shift or a load from |
+ // EXTERNAL_UNSIGNED_INT_ELEMENTS array is not marked with this flag |
+ // it will deoptimize if result does not fit into signed integer range. |
+ // HGraph::ComputeSafeUint32Operations is responsible for setting this |
+ // flag. |
+ kUint32, |
+ kLastFlag = kUint32 |
}; |
STATIC_ASSERT(kLastFlag < kBitsPerInt); |
@@ -2556,6 +2563,10 @@ class HConstant: public HTemplateInstruction<0> { |
bool ToBoolean(); |
+ bool IsUint32() { |
+ return HasInteger32Value() && (Integer32Value() >= 0); |
+ } |
+ |
virtual intptr_t Hashcode() { |
ASSERT_ALLOCATION_DISABLED; |
intptr_t hash; |