[turbofan] Lower more number operations to integer operations.
authorbmeurer <bmeurer@chromium.org>
Wed, 13 May 2015 12:53:54 +0000 (05:53 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 13 May 2015 12:53:53 +0000 (12:53 +0000)
If the typer was able to prove that a NumberAdd/Sub/Mul/Div/Mod always
produces a Signed32/Unsigned32 value, and the inputs are
Signed32/Unsigned32, we can lower the node to the corresponding integer
operation instead, no matter what the uses are.

R=jarin@chromium.org

Review URL: https://codereview.chromium.org/1140933002

Cr-Commit-Position: refs/heads/master@{#28393}

src/compiler/simplified-lowering.cc

index 39246df24609db6d039b5a78459cf5a97662b701..050d6ce0873211d55f179b50b1f4c1e88ef39b67 100644 (file)
@@ -444,7 +444,9 @@ class RepresentationSelector {
   }
 
   bool CanLowerToInt32Binop(Node* node, MachineTypeUnion use) {
-    return BothInputsAre(node, Type::Signed32()) && !CanObserveNonInt32(use);
+    return BothInputsAre(node, Type::Signed32()) &&
+           (!CanObserveNonInt32(use) ||
+            NodeProperties::GetBounds(node).upper->Is(Type::Signed32()));
   }
 
   bool CanLowerToInt32AdditiveBinop(Node* node, MachineTypeUnion use) {
@@ -453,7 +455,9 @@ class RepresentationSelector {
   }
 
   bool CanLowerToUint32Binop(Node* node, MachineTypeUnion use) {
-    return BothInputsAre(node, Type::Unsigned32()) && !CanObserveNonUint32(use);
+    return BothInputsAre(node, Type::Unsigned32()) &&
+           (!CanObserveNonUint32(use) ||
+            NodeProperties::GetBounds(node).upper->Is(Type::Unsigned32()));
   }
 
   bool CanLowerToUint32AdditiveBinop(Node* node, MachineTypeUnion use) {