 Chromium Code Reviews
 Chromium Code Reviews Issue 2362173003:
  [turbofan] Improve representation selection for Smi checking.  (Closed)
    
  
    Issue 2362173003:
  [turbofan] Improve representation selection for Smi checking.  (Closed) 
  | 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 "src/compiler/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" | 
| 6 | 6 | 
| 7 #include <limits> | 7 #include <limits> | 
| 8 | 8 | 
| 9 #include "src/address-map.h" | 9 #include "src/address-map.h" | 
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" | 
| (...skipping 2108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2119 // the index is within the bounds of [0.0, length[. | 2119 // the index is within the bounds of [0.0, length[. | 
| 2120 DeferReplacement(node, node->InputAt(0)); | 2120 DeferReplacement(node, node->InputAt(0)); | 
| 2121 } | 2121 } | 
| 2122 } else { | 2122 } else { | 
| 2123 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), | 2123 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), | 
| 2124 UseInfo::TruncatingWord32(), | 2124 UseInfo::TruncatingWord32(), | 
| 2125 MachineRepresentation::kWord32); | 2125 MachineRepresentation::kWord32); | 
| 2126 } | 2126 } | 
| 2127 return; | 2127 return; | 
| 2128 } | 2128 } | 
| 2129 case IrOpcode::kCheckHeapObject: { | |
| 2130 if (InputCannotBe(node, Type::SignedSmall())) { | |
| 2131 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | |
| 
Jarin
2016/09/23 08:31:54
Move visit binop out of the if?
Can we set the re
 
Benedikt Meurer
2016/09/23 08:39:38
Not possible (yet), due to InputCannotBe
 | |
| 2132 if (lower()) DeferReplacement(node, node->InputAt(0)); | |
| 2133 } else { | |
| 2134 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | |
| 2135 } | |
| 2136 return; | |
| 2137 } | |
| 2129 case IrOpcode::kCheckIf: { | 2138 case IrOpcode::kCheckIf: { | 
| 2130 ProcessInput(node, 0, UseInfo::Bool()); | 2139 ProcessInput(node, 0, UseInfo::Bool()); | 
| 2131 ProcessRemainingInputs(node, 1); | 2140 ProcessRemainingInputs(node, 1); | 
| 2132 SetOutput(node, MachineRepresentation::kNone); | 2141 SetOutput(node, MachineRepresentation::kNone); | 
| 2133 return; | 2142 return; | 
| 2134 } | 2143 } | 
| 2135 case IrOpcode::kCheckNumber: { | 2144 case IrOpcode::kCheckNumber: { | 
| 2136 if (InputIs(node, Type::Number())) { | 2145 if (InputIs(node, Type::Number())) { | 
| 2137 if (truncation.IsUsedAsWord32()) { | 2146 if (truncation.IsUsedAsWord32()) { | 
| 2138 VisitUnop(node, UseInfo::TruncatingWord32(), | 2147 VisitUnop(node, UseInfo::TruncatingWord32(), | 
| 2139 MachineRepresentation::kWord32); | 2148 MachineRepresentation::kWord32); | 
| 2140 } else { | 2149 } else { | 
| 2141 // TODO(jarin,bmeurer): We need to go to Tagged here, because | 2150 // TODO(jarin,bmeurer): We need to go to Tagged here, because | 
| 2142 // otherwise we cannot distinguish the hole NaN (which might need to | 2151 // otherwise we cannot distinguish the hole NaN (which might need to | 
| 2143 // be treated as undefined). We should have a dedicated Type for | 2152 // be treated as undefined). We should have a dedicated Type for | 
| 2144 // that at some point, and maybe even a dedicated truncation. | 2153 // that at some point, and maybe even a dedicated truncation. | 
| 2145 VisitUnop(node, UseInfo::AnyTagged(), | 2154 VisitUnop(node, UseInfo::AnyTagged(), | 
| 2146 MachineRepresentation::kTagged); | 2155 MachineRepresentation::kTagged); | 
| 2147 } | 2156 } | 
| 2148 if (lower()) DeferReplacement(node, node->InputAt(0)); | 2157 if (lower()) DeferReplacement(node, node->InputAt(0)); | 
| 2149 } else { | 2158 } else { | 
| 2150 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 2159 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 
| 2151 } | 2160 } | 
| 2152 return; | 2161 return; | 
| 2153 } | 2162 } | 
| 2163 case IrOpcode::kCheckSmi: { | |
| 2164 if (SmiValuesAre32Bits() && truncation.IsUsedAsWord32()) { | |
| 2165 VisitUnop(node, UseInfo::CheckedSignedSmallAsWord32(), | |
| 2166 MachineRepresentation::kWord32); | |
| 2167 } else { | |
| 2168 VisitUnop(node, UseInfo::CheckedSignedSmallAsTaggedSigned(), | |
| 2169 MachineRepresentation::kTaggedSigned); | |
| 2170 } | |
| 2171 if (lower()) DeferReplacement(node, node->InputAt(0)); | |
| 2172 return; | |
| 2173 } | |
| 2154 case IrOpcode::kCheckString: { | 2174 case IrOpcode::kCheckString: { | 
| 2155 if (InputIs(node, Type::String())) { | 2175 if (InputIs(node, Type::String())) { | 
| 2156 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 2176 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 
| 2157 if (lower()) DeferReplacement(node, node->InputAt(0)); | 2177 if (lower()) DeferReplacement(node, node->InputAt(0)); | 
| 2158 } else { | 2178 } else { | 
| 2159 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 2179 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 
| 2160 } | |
| 2161 return; | |
| 2162 } | |
| 2163 case IrOpcode::kCheckTaggedPointer: { | |
| 2164 if (InputCannotBe(node, Type::SignedSmall())) { | |
| 2165 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | |
| 2166 if (lower()) DeferReplacement(node, node->InputAt(0)); | |
| 2167 } else { | |
| 2168 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | |
| 2169 } | |
| 2170 return; | |
| 2171 } | |
| 2172 case IrOpcode::kCheckTaggedSigned: { | |
| 2173 if (SmiValuesAre32Bits() && truncation.IsUsedAsWord32()) { | |
| 2174 VisitUnop(node, UseInfo::CheckedSignedSmallAsWord32(), | |
| 2175 MachineRepresentation::kWord32); | |
| 2176 if (lower()) DeferReplacement(node, node->InputAt(0)); | |
| 2177 } else { | |
| 2178 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | |
| 2179 } | 2180 } | 
| 2180 return; | 2181 return; | 
| 2181 } | 2182 } | 
| 2182 | 2183 | 
| 2183 case IrOpcode::kAllocate: { | 2184 case IrOpcode::kAllocate: { | 
| 2184 ProcessInput(node, 0, UseInfo::TruncatingWord32()); | 2185 ProcessInput(node, 0, UseInfo::TruncatingWord32()); | 
| 2185 ProcessRemainingInputs(node, 1); | 2186 ProcessRemainingInputs(node, 1); | 
| 2186 SetOutput(node, MachineRepresentation::kTagged); | 2187 SetOutput(node, MachineRepresentation::kTagged); | 
| 2187 return; | 2188 return; | 
| 2188 } | 2189 } | 
| (...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3260 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3261 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 
| 3261 Operator::kNoProperties); | 3262 Operator::kNoProperties); | 
| 3262 to_number_operator_.set(common()->Call(desc)); | 3263 to_number_operator_.set(common()->Call(desc)); | 
| 3263 } | 3264 } | 
| 3264 return to_number_operator_.get(); | 3265 return to_number_operator_.get(); | 
| 3265 } | 3266 } | 
| 3266 | 3267 | 
| 3267 } // namespace compiler | 3268 } // namespace compiler | 
| 3268 } // namespace internal | 3269 } // namespace internal | 
| 3269 } // namespace v8 | 3270 } // namespace v8 | 
| OLD | NEW |