368dd5f020d5a5e3cdd89452e8dc99a219cde4aa
[platform/upstream/v8.git] / src / hydrogen-alias-analysis.h
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 v8::internal
72
73 #endif  // V8_HYDROGEN_ALIAS_ANALYSIS_H_