Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Unified Diff: src/hydrogen-instructions.cc

Issue 9156001: Improved range analysis for bitwise operations. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/hydrogen-instructions.cc
===================================================================
--- src/hydrogen-instructions.cc (revision 15052)
+++ src/hydrogen-instructions.cc (working copy)
@@ -285,16 +285,8 @@
}
-int32_t Range::Mask() const {
- if (lower_ == upper_) return lower_;
- if (lower_ >= 0) {
- int32_t res = 1;
- while (res < upper_) {
- res = (res << 1) | 1;
- }
- return res;
- }
- return 0xffffffff;
+void Range::ToBitRange(BitRange* bits) const {
+ BitRange::SetFromRange(bits, lower_, upper_);
}
@@ -2347,6 +2339,7 @@
Range* HBitwise::InferRange(Zone* zone) {
+ /*
if (op() == Token::BIT_XOR) {
if (left()->HasRange() && right()->HasRange()) {
// The maximum value has the high bit, and all bits below, set:
@@ -2391,6 +2384,37 @@
return (result_mask >= 0)
? new(zone) Range(0, result_mask)
: HValue::InferRange(zone);
+ */
fschneider 2013/06/11 10:22:37 Remove commented code.
sra1 2013/06/12 00:12:24 Done.
+ if (representation().IsInteger32()) {
+ BitRange left_bits, right_bits;
+
+ if (left()->range() != NULL)
Toon Verwaest 2013/06/11 12:47:46 if (left()->HasRange()) { ... }
sra1 2013/06/12 00:12:24 Done.
+ left()->range()->ToBitRange(&left_bits);
+
+ if (right()->range() != NULL)
+ right()->range()->ToBitRange(&right_bits);
+
+ BitRange result;
+ switch (op()) {
+ case Token::BIT_AND:
+ result = BitRange::And(left_bits, right_bits);
+ break;
+ case Token::BIT_OR:
+ result = BitRange::Or(left_bits, right_bits);
+ break;
+ case Token::BIT_XOR:
+ result = BitRange::Xor(left_bits, right_bits);
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ int32_t lower = kMaxInt, upper = kMinInt; // 'empty' range.
+ result.ExtendRange(&lower, &upper);
+ return new(zone) Range(lower, upper);
+ } else {
+ return HValue::InferRange(zone);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698