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:
parent
54a11734ac
commit
0c634a1dae
@ -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() {
|
||||
// Determine the worst case of observed input representations and
|
||||
// the currently assumed output representation.
|
||||
Representation rep = representation();
|
||||
if (observed_output_representation_.is_more_general_than(rep)) {
|
||||
rep = observed_output_representation_;
|
||||
}
|
||||
for (int i = 1; i <= 2; ++i) {
|
||||
Representation input_rep = observed_input_representation(i);
|
||||
if (input_rep.is_more_general_than(rep)) rep = input_rep;
|
||||
@ -2252,6 +2263,13 @@ Representation HBinaryOperation::RepresentationFromInputs() {
|
||||
right()->CheckFlag(kFlexibleRepresentation)) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -3455,6 +3455,8 @@ class HBinaryOperation: public HTemplateInstruction<3> {
|
||||
DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation)
|
||||
|
||||
private:
|
||||
bool IgnoreObservedOutputRepresentation(Representation current_rep);
|
||||
|
||||
Representation observed_input_representation_[2];
|
||||
Representation observed_output_representation_;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user