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.


Reply via email to