Reviewers: Jakob,
Message:
PTAL
Description:
Infer the range of Math.abs
Please review this at https://chromiumcodereview.appspot.com/16268009/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/hydrogen-instructions.h
M src/hydrogen-instructions.cc
Index: src/hydrogen-instructions.cc
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
index
d3f1a9e09024c8f1643eb53bddc3b595b3953d3e..5cea51c2d27aec7c446e5ca2847c9194a12e8643
100644
--- a/src/hydrogen-instructions.cc
+++ b/src/hydrogen-instructions.cc
@@ -1308,6 +1308,31 @@ const char* HUnaryMathOperation::OpName() const {
}
+Range* HUnaryMathOperation::InferRange(Zone* zone) {
+ Representation r = representation();
+ if (r.IsSmiOrInteger32() && value()->HasRange()) {
+ if (op() == kMathAbs) {
+ int upper = value()->range()->upper();
+ int lower = value()->range()->lower();
+ bool spans_zero = lower < 0 && 0 < upper;
+ upper = abs(upper);
+ lower = abs(lower);
+ if (upper < lower) {
+ int temp = upper;
+ upper = lower;
+ lower = temp;
+ }
+ if (spans_zero) lower = 0;
+ Range* result = new(zone) Range(lower, upper);
+ if (r.IsSmi()) result->TruncateToSmi();
+ if (r.IsInteger32()) result->TruncateToInt32();
+ return result;
+ }
+ }
+ return HValue::InferRange(zone);
+}
+
+
void HUnaryMathOperation::PrintDataTo(StringStream* stream) {
const char* name = OpName();
stream->Add("%s ", name);
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index
4a8a406eb3befbc126c4f0f6aa15119892ef316f..a4b2e0990dd44d5d5fa90e2581c6f04afb631555
100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -271,6 +271,14 @@ class Range: public ZoneObject {
bool IsInSmiRange() const {
return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
}
+ void TruncateToSmi() {
+ lower_ = Max(lower_, Smi::kMinValue);
+ upper_ = Min(upper_, Smi::kMaxValue);
+ }
+ void TruncateToInt32() {
+ lower_ = Max(lower_, kMinInt);
+ upper_ = Min(upper_, kMaxInt);
+ }
void KeepOrder();
#ifdef DEBUG
void Verify() const;
@@ -2644,6 +2652,8 @@ class HUnaryMathOperation: public
HTemplateInstruction<2> {
}
}
+ virtual Range* InferRange(Zone* zone);
+
virtual HValue* Canonicalize();
BuiltinFunctionId op() const { return op_; }
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.