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

Unified Diff: runtime/vm/intermediate_language.cc

Issue 27727002: Optimize identical-comparisons based on propagated type information. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 2 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
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language.cc
===================================================================
--- runtime/vm/intermediate_language.cc (revision 28802)
+++ runtime/vm/intermediate_language.cc (working copy)
@@ -1528,10 +1528,39 @@
}
+static bool MayBeBoxableNumber(intptr_t cid) {
+ return (cid == kDynamicCid) ||
+ (cid == kMintCid) ||
+ (cid == kBigintCid) ||
+ (cid == kDoubleCid);
+}
+
+
+static bool MaybeNumber(CompileType* type) {
+ ASSERT(Type::Handle(Type::Number()).IsMoreSpecificThan(
+ Type::Handle(Type::Number()), NULL));
+ return type->ToAbstractType()->IsDynamicType()
+ || type->IsMoreSpecificThan(Type::Handle(Type::Number()));
+}
+
+
// Returns a replacement for a strict comparison and signals if the result has
// to be negated.
static Definition* CanonicalizeStrictCompare(StrictCompareInstr* compare,
bool* negated) {
+ // Use propagated cid and type information to eliminate number checks.
+ // If one of the inputs is not a boxable number (Mint, Double, Bigint), or
+ // is not a subtype of num, no need for number checks.
+ if (compare->needs_number_check()) {
+ if (!MayBeBoxableNumber(compare->left()->Type()->ToCid()) ||
+ !MayBeBoxableNumber(compare->right()->Type()->ToCid())) {
+ compare->set_needs_number_check(false);
+ } else if (!MaybeNumber(compare->left()->Type()) ||
+ !MaybeNumber(compare->right()->Type())) {
+ compare->set_needs_number_check(false);
+ }
+ }
+
*negated = false;
Object& constant = Object::Handle();
Value* other = NULL;
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698