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

Side by Side Diff: src/compiler/simplified-lowering.cc

Issue 2154073002: [Turbofan]: Eliminate the check for -0 if it's not possible/observable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixes. Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/simplified-lowering.h" 5 #include "src/compiler/simplified-lowering.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "src/address-map.h" 9 #include "src/address-map.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 return WriteBarrierKindFor(base_taggedness, field_representation, 1070 return WriteBarrierKindFor(base_taggedness, field_representation,
1071 field_type, value); 1071 field_type, value);
1072 } 1072 }
1073 1073
1074 Graph* graph() const { return jsgraph_->graph(); } 1074 Graph* graph() const { return jsgraph_->graph(); }
1075 CommonOperatorBuilder* common() const { return jsgraph_->common(); } 1075 CommonOperatorBuilder* common() const { return jsgraph_->common(); }
1076 SimplifiedOperatorBuilder* simplified() const { 1076 SimplifiedOperatorBuilder* simplified() const {
1077 return jsgraph_->simplified(); 1077 return jsgraph_->simplified();
1078 } 1078 }
1079 1079
1080 void ChangeToInt32MulWithOverflowOp(Node* node, CheckForMinusZeroMode kMode) {
1081 NodeProperties::ChangeOp(node, simplified()->CheckedInt32Mul(kMode));
1082 }
1083
1080 void ChangeToInt32OverflowOp(Node* node) { 1084 void ChangeToInt32OverflowOp(Node* node) {
1081 NodeProperties::ChangeOp(node, Int32OverflowOp(node)); 1085 NodeProperties::ChangeOp(node, Int32OverflowOp(node));
1082 } 1086 }
1083 1087
1084 void ChangeToUint32OverflowOp(Node* node) { 1088 void ChangeToUint32OverflowOp(Node* node) {
1085 NodeProperties::ChangeOp(node, Uint32OverflowOp(node)); 1089 NodeProperties::ChangeOp(node, Uint32OverflowOp(node));
1086 } 1090 }
1087 1091
1088 void VisitSpeculativeAdditiveOp(Node* node, Truncation truncation, 1092 void VisitSpeculativeAdditiveOp(Node* node, Truncation truncation,
1089 SimplifiedLowering* lowering) { 1093 SimplifiedLowering* lowering) {
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 // (b) the output is known to be Unsigned32, or 1331 // (b) the output is known to be Unsigned32, or
1328 // (c) the uses are truncating and the result is in the safe 1332 // (c) the uses are truncating and the result is in the safe
1329 // integer range. 1333 // integer range.
1330 VisitWord32TruncatingBinop(node); 1334 VisitWord32TruncatingBinop(node);
1331 if (lower()) ChangeToPureOp(node, Int32Op(node)); 1335 if (lower()) ChangeToPureOp(node, Int32Op(node));
1332 return; 1336 return;
1333 } 1337 }
1334 // Try to use type feedback. 1338 // Try to use type feedback.
1335 BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); 1339 BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op());
1336 1340
1341 // Determine if one of the inputs is a constant integer > 0.
1342 Type* input0_type = NodeProperties::GetType(node->InputAt(0));
1343 Type* input1_type = NodeProperties::GetType(node->InputAt(1));
Jarin 2016/07/17 18:24:41 You can use TypeOf here (instead of NodeProperties
mvstanton 2016/07/18 08:48:58 Done.
1344 bool positive_range = false;
1345 if ((input0_type->IsRange() && input0_type->AsRange()->Min() > 0) ||
1346 (input1_type->IsRange() && input1_type->AsRange()->Min() > 0)) {
Jarin 2016/07/17 16:37:47 Maybe it is better to not refer to ranges here and
Benedikt Meurer 2016/07/17 17:44:07 Yes, please. And I'd prefer to have this inline be
mvstanton 2016/07/18 08:48:58 No problemo
mvstanton 2016/07/18 08:48:58 Done.
1347 positive_range = true;
1348 }
1349
1350 // If one of the inputs is positive and/or truncation is being applied,
1351 // there is no need to return -0.
1352 CheckForMinusZeroMode mz_mode =
1353 (truncation.TruncatesToWord32() || positive_range)
1354 ? CheckForMinusZeroMode::kDontCheckForMinusZero
1355 : CheckForMinusZeroMode::kCheckForMinusZero;
Jarin 2016/07/17 18:24:41 Looking at this again, this logic is only used whe
mvstanton 2016/07/18 08:48:58 Good idea, done!
1356
1337 // Handle the case when no int32 checks on inputs are necessary 1357 // Handle the case when no int32 checks on inputs are necessary
1338 // (but an overflow check is needed on the output). 1358 // (but an overflow check is needed on the output).
1339 if (BothInputsAre(node, Type::Signed32())) { 1359 if (BothInputsAre(node, Type::Signed32())) {
1340 // If both the inputs the feedback are int32, use the overflow op. 1360 // If both the inputs the feedback are int32, use the overflow op.
1341 if (hint == BinaryOperationHints::kSignedSmall || 1361 if (hint == BinaryOperationHints::kSignedSmall ||
1342 hint == BinaryOperationHints::kSigned32) { 1362 hint == BinaryOperationHints::kSigned32) {
1343 VisitBinop(node, UseInfo::TruncatingWord32(), 1363 VisitBinop(node, UseInfo::TruncatingWord32(),
1344 MachineRepresentation::kWord32, Type::Signed32()); 1364 MachineRepresentation::kWord32, Type::Signed32());
1345 if (lower()) ChangeToInt32OverflowOp(node); 1365 if (lower()) ChangeToInt32MulWithOverflowOp(node, mz_mode);
1346 return; 1366 return;
1347 } 1367 }
1348 } 1368 }
1349 1369
1350 if (hint == BinaryOperationHints::kSignedSmall || 1370 if (hint == BinaryOperationHints::kSignedSmall ||
1351 hint == BinaryOperationHints::kSigned32) { 1371 hint == BinaryOperationHints::kSigned32) {
1352 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), 1372 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(),
1353 MachineRepresentation::kWord32, Type::Signed32()); 1373 MachineRepresentation::kWord32, Type::Signed32());
1354 if (lower()) ChangeToInt32OverflowOp(node); 1374 if (lower()) ChangeToInt32MulWithOverflowOp(node, mz_mode);
1355 return; 1375 return;
1356 } 1376 }
1357 1377
1358 // Checked float64 x float64 => float64 1378 // Checked float64 x float64 => float64
1359 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), 1379 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(),
1360 MachineRepresentation::kFloat64, Type::Number()); 1380 MachineRepresentation::kFloat64, Type::Number());
1361 if (lower()) ChangeToPureOp(node, Float64Op(node)); 1381 if (lower()) ChangeToPureOp(node, Float64Op(node));
1362 return; 1382 return;
1363 } 1383 }
1364 case IrOpcode::kNumberMultiply: { 1384 case IrOpcode::kNumberMultiply: {
(...skipping 1981 matching lines...) Expand 10 before | Expand all | Expand 10 after
3346 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 3366 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
3347 Operator::kNoProperties); 3367 Operator::kNoProperties);
3348 to_number_operator_.set(common()->Call(desc)); 3368 to_number_operator_.set(common()->Call(desc));
3349 } 3369 }
3350 return to_number_operator_.get(); 3370 return to_number_operator_.get();
3351 } 3371 }
3352 3372
3353 } // namespace compiler 3373 } // namespace compiler
3354 } // namespace internal 3374 } // namespace internal
3355 } // namespace v8 3375 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698