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_CRANKSHAFT_HYDROGEN_ALIAS_ANALYSIS_H_ 6 #define V8_CRANKSHAFT_HYDROGEN_ALIAS_ANALYSIS_H_ 7 8 #include "src/crankshaft/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 return a->Equals(b) ? kMustAlias : kNoAlias; 48 } 49 return kMayAlias; 50 } 51 52 // Checks whether the objects referred to by the given instructions may 53 // ever be aliases. Note that this is more conservative than checking 54 // {Query(a, b) == kMayAlias}, since this method considers kMustAlias 55 // objects to also be may-aliasing. 56 inline bool MayAlias(HValue* a, HValue* b) { 57 return Query(a, b) != kNoAlias; 58 } 59 60 inline bool MustAlias(HValue* a, HValue* b) { 61 return Query(a, b) == kMustAlias; 62 } 63 64 inline bool NoAlias(HValue* a, HValue* b) { 65 return Query(a, b) == kNoAlias; 66 } 67 }; 68 69 70 } // namespace internal 71 } // namespace v8 72 73 #endif // V8_CRANKSHAFT_HYDROGEN_ALIAS_ANALYSIS_H_ 74