Index: src/compiler/js-builtin-reducer-unittest.cc |
diff --git a/src/compiler/js-builtin-reducer-unittest.cc b/src/compiler/js-builtin-reducer-unittest.cc |
index ca12c50d8b58cb38060466ec198bcc01be8bc281..557ce27fa3911d3931ea65281b57c7ada5160a95 100644 |
--- a/src/compiler/js-builtin-reducer-unittest.cc |
+++ b/src/compiler/js-builtin-reducer-unittest.cc |
@@ -7,6 +7,9 @@ |
#include "src/compiler/js-graph.h" |
#include "src/compiler/node-properties-inl.h" |
#include "src/compiler/typer.h" |
+#include "testing/gmock-support.h" |
+ |
+using testing::Capture; |
namespace v8 { |
namespace internal { |
@@ -57,6 +60,71 @@ Type* const kNumberTypes[] = { |
// ----------------------------------------------------------------------------- |
+// Math.max |
+ |
+ |
+TEST_F(JSBuiltinReducerTest, MathMax0) { |
+ Handle<JSFunction> f(isolate()->context()->math_max_fun()); |
+ |
+ Node* fun = HeapConstant(Unique<HeapObject>::CreateUninitialized(f)); |
+ Node* call = graph()->NewNode(javascript()->Call(2, NO_CALL_FUNCTION_FLAGS), |
+ fun, UndefinedConstant()); |
+ Reduction r = Reduce(call); |
+ |
+ EXPECT_TRUE(r.Changed()); |
+ EXPECT_THAT(r.replacement(), IsNumberConstant(-V8_INFINITY)); |
+} |
+ |
+ |
+TEST_F(JSBuiltinReducerTest, MathMax1) { |
+ Handle<JSFunction> f(isolate()->context()->math_max_fun()); |
+ |
+ TRACED_FOREACH(Type*, t0, kNumberTypes) { |
+ Node* p0 = Parameter(t0, 0); |
+ Node* fun = HeapConstant(Unique<HeapObject>::CreateUninitialized(f)); |
+ Node* call = graph()->NewNode(javascript()->Call(3, NO_CALL_FUNCTION_FLAGS), |
+ fun, UndefinedConstant(), p0); |
+ Reduction r = Reduce(call); |
+ |
+ EXPECT_TRUE(r.Changed()); |
+ EXPECT_THAT(r.replacement(), p0); |
+ } |
+} |
+ |
+ |
+TEST_F(JSBuiltinReducerTest, MathMax2) { |
+ Handle<JSFunction> f(isolate()->context()->math_max_fun()); |
+ |
+ TRACED_FOREACH(Type*, t0, kNumberTypes) { |
+ TRACED_FOREACH(Type*, t1, kNumberTypes) { |
+ Node* p0 = Parameter(t0, 0); |
+ Node* p1 = Parameter(t1, 1); |
+ Node* fun = HeapConstant(Unique<HeapObject>::CreateUninitialized(f)); |
+ Node* call = |
+ graph()->NewNode(javascript()->Call(4, NO_CALL_FUNCTION_FLAGS), fun, |
+ UndefinedConstant(), p0, p1); |
+ Reduction r = Reduce(call); |
+ |
+ if (t0->Is(Type::Integral32()) && t1->Is(Type::Integral32())) { |
+ Capture<Node*> branch; |
+ EXPECT_TRUE(r.Changed()); |
+ EXPECT_THAT( |
+ r.replacement(), |
+ IsPhi(kMachNone, p1, p0, |
+ IsMerge(IsIfTrue(CaptureEq(&branch)), |
+ IsIfFalse(AllOf(CaptureEq(&branch), |
+ IsBranch(IsNumberLessThan(p0, p1), |
+ graph()->start())))))); |
+ } else { |
+ EXPECT_FALSE(r.Changed()); |
+ EXPECT_EQ(IrOpcode::kJSCallFunction, call->opcode()); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
+// ----------------------------------------------------------------------------- |
// Math.imul |