| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_HYDROGEN_ALIAS_ANALYSIS_H_ | |
| 6 #define V8_HYDROGEN_ALIAS_ANALYSIS_H_ | |
| 7 | |
| 8 #include "src/hydrogen.h" | |
| 9 | |
| 10 namespace v8 { | |
| 11 namespace internal { | |
| 12 | |
| 13 enum HAliasing { | |
| 14 kMustAlias, | |
| 15 kMayAlias, | |
| 16 kNoAlias | |
| 17 }; | |
| 18 | |
| 19 | |
| 20 // Defines the interface to alias analysis for the rest of the compiler. | |
| 21 // A simple implementation can use only local reasoning, but a more powerful | |
| 22 // analysis might employ points-to analysis. | |
| 23 class HAliasAnalyzer : public ZoneObject { | |
| 24 public: | |
| 25 // Simple alias analysis distinguishes allocations, parameters, | |
| 26 // and constants using only local reasoning. | |
| 27 HAliasing Query(HValue* a, HValue* b) { | |
| 28 // The same SSA value always references the same object. | |
| 29 if (a == b) return kMustAlias; | |
| 30 | |
| 31 if (a->IsAllocate() || a->IsInnerAllocatedObject()) { | |
| 32 // Two non-identical allocations can never be aliases. | |
| 33 if (b->IsAllocate()) return kNoAlias; | |
| 34 if (b->IsInnerAllocatedObject()) return kNoAlias; | |
| 35 // An allocation can never alias a parameter or a constant. | |
| 36 if (b->IsParameter()) return kNoAlias; | |
| 37 if (b->IsConstant()) return kNoAlias; | |
| 38 } | |
| 39 if (b->IsAllocate() || b->IsInnerAllocatedObject()) { | |
| 40 // An allocation can never alias a parameter or a constant. | |
| 41 if (a->IsParameter()) return kNoAlias; | |
| 42 if (a->IsConstant()) return kNoAlias; | |
| 43 } | |
| 44 | |
| 45 // Constant objects can be distinguished statically. | |
| 46 if (a->IsConstant()) { | |
| 47 // TODO(titzer): DataEquals() is more efficient, but that's protected. | |
| 48 return a->Equals(b) ? kMustAlias : kNoAlias; | |
| 49 } | |
| 50 return kMayAlias; | |
| 51 } | |
| 52 | |
| 53 // Checks whether the objects referred to by the given instructions may | |
| 54 // ever be aliases. Note that this is more conservative than checking | |
| 55 // {Query(a, b) == kMayAlias}, since this method considers kMustAlias | |
| 56 // objects to also be may-aliasing. | |
| 57 inline bool MayAlias(HValue* a, HValue* b) { | |
| 58 return Query(a, b) != kNoAlias; | |
| 59 } | |
| 60 | |
| 61 inline bool MustAlias(HValue* a, HValue* b) { | |
| 62 return Query(a, b) == kMustAlias; | |
| 63 } | |
| 64 | |
| 65 inline bool NoAlias(HValue* a, HValue* b) { | |
| 66 return Query(a, b) == kNoAlias; | |
| 67 } | |
| 68 }; | |
| 69 | |
| 70 | |
| 71 } // namespace internal | |
| 72 } // namespace v8 | |
| 73 | |
| 74 #endif // V8_HYDROGEN_ALIAS_ANALYSIS_H_ | |
| OLD | NEW |