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

Unified Diff: src/hydrogen.cc

Issue 12315005: Constant fold math and string operations. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 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
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index 62fa571bbcdcd2e29e687b5d2ffc4604979cbab8..5aed9d16cdc8bfa7cc83df0ee8e7033c28ef22f4 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -969,7 +969,7 @@ HValue* HGraphBuilder::BuildAllocateElements(HContext* context,
new(zone) HConstant(elements_size, Representation::Integer32());
AddInstruction(elements_size_value);
HValue* mul = AddInstruction(
- new(zone) HMul(context, capacity, elements_size_value));
+ HMul::NewHMul(zone, context, capacity, elements_size_value));
mul->ChangeRepresentation(Representation::Integer32());
mul->ClearFlag(HValue::kCanOverflow);
@@ -977,7 +977,7 @@ HValue* HGraphBuilder::BuildAllocateElements(HContext* context,
new(zone) HConstant(FixedArray::kHeaderSize, Representation::Integer32());
AddInstruction(header_size);
HValue* total_size = AddInstruction(
- new(zone) HAdd(context, mul, header_size));
+ HAdd::NewHAdd(zone, context, mul, header_size));
total_size->ChangeRepresentation(Representation::Integer32());
total_size->ClearFlag(HValue::kCanOverflow);
@@ -7112,16 +7112,17 @@ void HOptimizedGraphBuilder::VisitProperty(Property* expr) {
HValue* string = Pop();
AddInstruction(new(zone()) HCheckNonSmi(string));
AddInstruction(HCheckInstanceType::NewIsString(string, zone()));
- instr = new(zone()) HStringLength(string);
+ instr = HStringLength::NewHStringLength(zone(), string);
} else if (expr->IsStringAccess()) {
CHECK_ALIVE(VisitForValue(expr->key()));
HValue* index = Pop();
HValue* string = Pop();
HValue* context = environment()->LookupContext();
- HStringCharCodeAt* char_code =
+ HInstruction* char_code =
BuildStringCharCodeAt(context, string, index);
AddInstruction(char_code);
- instr = new(zone()) HStringCharFromCode(context, char_code);
+ instr =
+ HStringCharFromCode::NewHStringCharFromCode(zone(), context, char_code);
} else if (expr->IsFunctionPrototype()) {
HValue* function = Pop();
@@ -7791,6 +7792,7 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr,
if (!FLAG_fast_math) break;
// Fall through if FLAG_fast_math.
case kMathRound:
+ case kMathFloor:
Jakob Kummerow 2013/02/20 15:31:04 good catch!
case kMathAbs:
case kMathSqrt:
case kMathLog:
@@ -7801,8 +7803,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr,
HValue* argument = Pop();
HValue* context = environment()->LookupContext();
Drop(1); // Receiver.
- HUnaryMathOperation* op =
- new(zone()) HUnaryMathOperation(context, argument, id);
+ HInstruction* op = HUnaryMathOperation::NewHUnaryMathOperation(
+ zone(), context, argument, id);
Jakob Kummerow 2013/02/20 15:31:04 nit: I'd indent 4 spaces relative to "HInstruction
op->set_position(expr->position());
if (drop_extra) Drop(1); // Optionally drop the function.
ast_context()->ReturnInstruction(op, expr->id());
@@ -7839,15 +7841,15 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
oracle()->GetPrototypeForPrimitiveCheck(STRING_CHECK),
expr->holder(),
zone()));
- HStringCharCodeAt* char_code =
+ HInstruction* char_code =
BuildStringCharCodeAt(context, string, index);
if (id == kStringCharCodeAt) {
ast_context()->ReturnInstruction(char_code, expr->id());
return true;
}
AddInstruction(char_code);
- HStringCharFromCode* result =
- new(zone()) HStringCharFromCode(context, char_code);
+ HInstruction* result = HStringCharFromCode::NewHStringCharFromCode(
+ zone(), context, char_code);
ast_context()->ReturnInstruction(result, expr->id());
return true;
}
@@ -7868,8 +7870,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
HValue* argument = Pop();
HValue* context = environment()->LookupContext();
Drop(1); // Receiver.
- HUnaryMathOperation* op =
- new(zone()) HUnaryMathOperation(context, argument, id);
+ HInstruction* op = HUnaryMathOperation::NewHUnaryMathOperation(
+ zone(), context, argument, id);
op->set_position(expr->position());
ast_context()->ReturnInstruction(op, expr->id());
return true;
@@ -7887,31 +7889,31 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) {
double exponent = HConstant::cast(right)->DoubleValue();
if (exponent == 0.5) {
- result =
- new(zone()) HUnaryMathOperation(context, left, kMathPowHalf);
+ result = HUnaryMathOperation::NewHUnaryMathOperation(
+ zone(), context, left, kMathPowHalf);
} else if (exponent == -0.5) {
HConstant* double_one =
new(zone()) HConstant(Handle<Object>(Smi::FromInt(1)),
Representation::Double());
AddInstruction(double_one);
- HUnaryMathOperation* square_root =
- new(zone()) HUnaryMathOperation(context, left, kMathPowHalf);
- AddInstruction(square_root);
+ HInstruction* sqrt = HUnaryMathOperation::NewHUnaryMathOperation(
+ zone(), context, left, kMathPowHalf);
Jakob Kummerow 2013/02/20 15:31:04 nit: now this indentation is just inconsistent wit
Yang 2013/02/20 17:51:15 Done.
+ AddInstruction(sqrt);
// MathPowHalf doesn't have side effects so there's no need for
// an environment simulation here.
- ASSERT(!square_root->HasObservableSideEffects());
- result = new(zone()) HDiv(context, double_one, square_root);
+ ASSERT(!sqrt->HasObservableSideEffects());
+ result = HDiv::NewHDiv(zone(), context, double_one, sqrt);
} else if (exponent == 2.0) {
- result = new(zone()) HMul(context, left, left);
+ result = HMul::NewHMul(zone(), context, left, left);
}
} else if (right->IsConstant() &&
HConstant::cast(right)->HasInteger32Value() &&
HConstant::cast(right)->Integer32Value() == 2) {
- result = new(zone()) HMul(context, left, left);
+ result = HMul::NewHMul(zone(), context, left, left);
}
if (result == NULL) {
- result = new(zone()) HPower(left, right);
+ result = HPower::NewHPower(zone(), left, right);
}
ast_context()->ReturnInstruction(result, expr->id());
return true;
@@ -7939,7 +7941,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
HValue* context = environment()->LookupContext();
HMathMinMax::Operation op = (id == kMathMin) ? HMathMinMax::kMathMin
: HMathMinMax::kMathMax;
- HMathMinMax* result = new(zone()) HMathMinMax(context, left, right, op);
+ HInstruction* result = HMathMinMax::NewHMathMinMax(
+ zone(), context, left, right, op);
ast_context()->ReturnInstruction(result, expr->id());
return true;
}
@@ -8618,7 +8621,7 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement(
? graph()->GetConstant1()
: graph()->GetConstantMinus1();
HValue* context = environment()->LookupContext();
- HInstruction* instr = new(zone()) HAdd(context, Top(), delta);
+ HInstruction* instr = HAdd::NewHAdd(zone(), context, Top(), delta);
// We can't insert a simulate here, because it would break deoptimization,
// so the HAdd must not have side effects, so we must freeze its
// representation.
@@ -8814,10 +8817,22 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
}
-HStringCharCodeAt* HOptimizedGraphBuilder::BuildStringCharCodeAt(
+HInstruction* HOptimizedGraphBuilder::BuildStringCharCodeAt(
HValue* context,
HValue* string,
HValue* index) {
+ if (string->IsConstant() && index->IsConstant()) {
+ HConstant* c_string = HConstant::cast(string);
+ HConstant* c_index = HConstant::cast(index);
+ if (c_string->HasStringValue() && c_index->HasNumberValue()) {
+ int32_t i = c_index->NumberValueAsInteger32();
+ Handle<String> s = c_string->StringValue();
+ if (i < 0 || i >= s->length()) {
+ return new(zone()) HConstant(OS::nan_value(), Representation::Double());
+ }
+ return new(zone()) HConstant(s->Get(i), Representation::Integer32());
+ }
+ }
AddInstruction(new(zone()) HCheckNonSmi(string));
AddInstruction(HCheckInstanceType::NewIsString(string, zone()));
HStringLength* length = new(zone()) HStringLength(string);
@@ -8908,7 +8923,7 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation(
AddInstruction(HCheckInstanceType::NewIsString(left, zone()));
AddInstruction(new(zone()) HCheckNonSmi(right));
AddInstruction(HCheckInstanceType::NewIsString(right, zone()));
- instr = new(zone()) HStringAdd(context, left, right);
+ instr = HStringAdd::NewHStringAdd(zone(), context, left, right);
} else {
instr = HAdd::NewHAdd(zone(), context, left, right);
}
@@ -9710,7 +9725,7 @@ void HOptimizedGraphBuilder::GenerateTwoByteSeqStringSetChar(
HValue* index = Pop();
HValue* string = Pop();
HValue* context = environment()->LookupContext();
- HStringCharCodeAt* char_code = BuildStringCharCodeAt(context, string, index);
+ HInstruction* char_code = BuildStringCharCodeAt(context, string, index);
AddInstruction(char_code);
HSeqStringSetChar* result = new(zone()) HSeqStringSetChar(
String::TWO_BYTE_ENCODING, string, index, value);
@@ -9768,7 +9783,7 @@ void HOptimizedGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) {
HValue* index = Pop();
HValue* string = Pop();
HValue* context = environment()->LookupContext();
- HStringCharCodeAt* result = BuildStringCharCodeAt(context, string, index);
+ HInstruction* result = BuildStringCharCodeAt(context, string, index);
return ast_context()->ReturnInstruction(result, call->id());
}
@@ -9793,7 +9808,7 @@ void HOptimizedGraphBuilder::GenerateStringCharAt(CallRuntime* call) {
HValue* index = Pop();
HValue* string = Pop();
HValue* context = environment()->LookupContext();
- HStringCharCodeAt* char_code = BuildStringCharCodeAt(context, string, index);
+ HInstruction* char_code = BuildStringCharCodeAt(context, string, index);
AddInstruction(char_code);
HStringCharFromCode* result =
new(zone()) HStringCharFromCode(context, char_code);
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | src/hydrogen-instructions.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698