OLD | NEW |
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 <limits> | 5 #include <limits> |
6 | 6 |
7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
8 #include "src/compiler/change-lowering.h" | 8 #include "src/compiler/change-lowering.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/graph-reducer.h" | 10 #include "src/compiler/graph-reducer.h" |
(...skipping 2019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2030 CHECK_EQ(IrOpcode::kUint32Mod, use->InputAt(0)->opcode()); | 2030 CHECK_EQ(IrOpcode::kUint32Mod, use->InputAt(0)->opcode()); |
2031 } | 2031 } |
2032 } | 2032 } |
2033 } | 2033 } |
2034 | 2034 |
2035 | 2035 |
2036 TEST(PhiRepresentation) { | 2036 TEST(PhiRepresentation) { |
2037 HandleAndZoneScope scope; | 2037 HandleAndZoneScope scope; |
2038 Zone* z = scope.main_zone(); | 2038 Zone* z = scope.main_zone(); |
2039 | 2039 |
2040 Factory* f = z->isolate()->factory(); | |
2041 Handle<Object> range_min = f->NewNumber(-1e13); | |
2042 Handle<Object> range_max = f->NewNumber(1e+15); | |
2043 Type* range = Type::Range(range_min, range_max, z); | |
2044 | |
2045 struct TestData { | 2040 struct TestData { |
2046 Type* arg1; | 2041 Type* arg1; |
2047 Type* arg2; | 2042 Type* arg2; |
2048 MachineType use; | 2043 MachineType use; |
2049 MachineTypeUnion expected; | 2044 MachineTypeUnion expected; |
2050 }; | 2045 }; |
2051 | 2046 |
2052 TestData test_data[] = { | 2047 TestData test_data[] = { |
2053 {Type::Signed32(), Type::Unsigned32(), kMachInt32, | 2048 {Type::Signed32(), Type::Unsigned32(), kMachInt32, |
2054 kRepWord32 | kTypeNumber}, | 2049 kRepWord32 | kTypeNumber}, |
2055 {range, range, kMachUint32, kRepWord32 | kTypeNumber}, | 2050 {Type::Signed32(), Type::Unsigned32(), kMachUint32, |
| 2051 kRepWord32 | kTypeNumber}, |
2056 {Type::Signed32(), Type::Signed32(), kMachInt32, kMachInt32}, | 2052 {Type::Signed32(), Type::Signed32(), kMachInt32, kMachInt32}, |
2057 {Type::Unsigned32(), Type::Unsigned32(), kMachInt32, kMachUint32}, | 2053 {Type::Unsigned32(), Type::Unsigned32(), kMachInt32, kMachUint32}, |
2058 {Type::Number(), Type::Signed32(), kMachInt32, kMachFloat64}, | 2054 {Type::Number(), Type::Signed32(), kMachInt32, kMachFloat64}, |
2059 {Type::Signed32(), Type::String(), kMachInt32, kMachAnyTagged}}; | 2055 {Type::Signed32(), Type::String(), kMachInt32, kMachAnyTagged}}; |
2060 | 2056 |
2061 for (auto const d : test_data) { | 2057 for (auto const d : test_data) { |
2062 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); | 2058 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); |
2063 | 2059 |
2064 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); | 2060 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); |
2065 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); | 2061 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); |
2066 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); | 2062 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); |
2067 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); | 2063 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); |
2068 | 2064 |
2069 Node* phi = | 2065 Node* phi = |
2070 t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), t.p0, t.p1, m); | 2066 t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), t.p0, t.p1, m); |
2071 | 2067 |
2072 Bounds phi_bounds = Bounds::Either(Bounds(d.arg1), Bounds(d.arg2), z); | 2068 Bounds phi_bounds = Bounds::Either(Bounds(d.arg1), Bounds(d.arg2), z); |
2073 NodeProperties::SetBounds(phi, phi_bounds); | 2069 NodeProperties::SetBounds(phi, phi_bounds); |
2074 | 2070 |
2075 Node* use = t.Use(phi, d.use); | 2071 Node* use = t.Use(phi, d.use); |
2076 t.Return(use); | 2072 t.Return(use); |
2077 t.Lower(); | 2073 t.Lower(); |
2078 | 2074 |
2079 CHECK_EQ(d.expected, OpParameter<MachineType>(phi)); | 2075 CHECK_EQ(d.expected, OpParameter<MachineType>(phi)); |
2080 } | 2076 } |
2081 } | 2077 } |
OLD | NEW |