Ignore observed Double output in binary operations when all uses are truncating to Integer32

BUG=v8:2424

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14381 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
jkummerow@chromium.org 2013-04-22 16:31:16 +00:00
parent 54a11734ac
commit 0c634a1dae
2 changed files with 23 additions and 3 deletions

View File

@ -2228,13 +2228,24 @@ void HBinaryOperation::InferRepresentation(HInferRepresentation* h_infer) {
} }
bool HBinaryOperation::IgnoreObservedOutputRepresentation(
Representation current_rep) {
return observed_output_representation_.IsDouble() &&
current_rep.IsInteger32() &&
// Mul in Integer32 mode would be too precise.
!this->IsMul() &&
// TODO(jkummerow): Remove blacklisting of Div when the Div
// instruction has learned not to deopt when the remainder is
// non-zero but all uses are truncating.
!this->IsDiv() &&
CheckUsesForFlag(kTruncatingToInt32);
}
Representation HBinaryOperation::RepresentationFromInputs() { Representation HBinaryOperation::RepresentationFromInputs() {
// Determine the worst case of observed input representations and // Determine the worst case of observed input representations and
// the currently assumed output representation. // the currently assumed output representation.
Representation rep = representation(); Representation rep = representation();
if (observed_output_representation_.is_more_general_than(rep)) {
rep = observed_output_representation_;
}
for (int i = 1; i <= 2; ++i) { for (int i = 1; i <= 2; ++i) {
Representation input_rep = observed_input_representation(i); Representation input_rep = observed_input_representation(i);
if (input_rep.is_more_general_than(rep)) rep = input_rep; if (input_rep.is_more_general_than(rep)) rep = input_rep;
@ -2252,6 +2263,13 @@ Representation HBinaryOperation::RepresentationFromInputs() {
right()->CheckFlag(kFlexibleRepresentation)) { right()->CheckFlag(kFlexibleRepresentation)) {
rep = right_rep; rep = right_rep;
} }
// Consider observed output representation, but ignore it if it's Double,
// this instruction is not a division, and all its uses are truncating
// to Integer32.
if (observed_output_representation_.is_more_general_than(rep) &&
!IgnoreObservedOutputRepresentation(rep)) {
rep = observed_output_representation_;
}
return rep; return rep;
} }

View File

@ -3455,6 +3455,8 @@ class HBinaryOperation: public HTemplateInstruction<3> {
DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation) DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation)
private: private:
bool IgnoreObservedOutputRepresentation(Representation current_rep);
Representation observed_input_representation_[2]; Representation observed_input_representation_[2];
Representation observed_output_representation_; Representation observed_output_representation_;
}; };