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 |