| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 58       // An allocation can never alias a parameter or a constant. | 58       // An allocation can never alias a parameter or a constant. | 
| 59       if (b->IsParameter()) return kNoAlias; | 59       if (b->IsParameter()) return kNoAlias; | 
| 60       if (b->IsConstant()) return kNoAlias; | 60       if (b->IsConstant()) return kNoAlias; | 
| 61     } | 61     } | 
| 62     if (b->IsAllocate() || b->IsInnerAllocatedObject()) { | 62     if (b->IsAllocate() || b->IsInnerAllocatedObject()) { | 
| 63       // An allocation can never alias a parameter or a constant. | 63       // An allocation can never alias a parameter or a constant. | 
| 64       if (a->IsParameter()) return kNoAlias; | 64       if (a->IsParameter()) return kNoAlias; | 
| 65       if (a->IsConstant()) return kNoAlias; | 65       if (a->IsConstant()) return kNoAlias; | 
| 66     } | 66     } | 
| 67 | 67 | 
| 68     // TODO(titzer): return MustAlias for two equivalent constants. | 68     // Constant objects can be distinguished statically. | 
|  | 69     if (a->IsConstant()) { | 
|  | 70       // TODO(titzer): DataEquals() is more efficient, but that's protected. | 
|  | 71       return a->Equals(b) ? kMustAlias : kNoAlias; | 
|  | 72     } | 
| 69     return kMayAlias; | 73     return kMayAlias; | 
| 70   } | 74   } | 
| 71 | 75 | 
| 72   // Checks whether the objects referred to by the given instructions may | 76   // Checks whether the objects referred to by the given instructions may | 
| 73   // ever be aliases. Note that this is more conservative than checking | 77   // ever be aliases. Note that this is more conservative than checking | 
| 74   // {Query(a, b) == kMayAlias}, since this method considers kMustAlias | 78   // {Query(a, b) == kMayAlias}, since this method considers kMustAlias | 
| 75   // objects to also be may-aliasing. | 79   // objects to also be may-aliasing. | 
| 76   inline bool MayAlias(HValue* a, HValue* b) { | 80   inline bool MayAlias(HValue* a, HValue* b) { | 
| 77     return Query(a, b) != kNoAlias; | 81     return Query(a, b) != kNoAlias; | 
| 78   } | 82   } | 
| 79 | 83 | 
| 80   inline bool MustAlias(HValue* a, HValue* b) { | 84   inline bool MustAlias(HValue* a, HValue* b) { | 
| 81     return Query(a, b) == kMayAlias; | 85     return Query(a, b) == kMustAlias; | 
| 82   } | 86   } | 
| 83 | 87 | 
| 84   inline bool NoAlias(HValue* a, HValue* b) { | 88   inline bool NoAlias(HValue* a, HValue* b) { | 
| 85     return Query(a, b) == kNoAlias; | 89     return Query(a, b) == kNoAlias; | 
| 86   } | 90   } | 
| 87 | 91 | 
| 88   // Returns the actual value of an instruction. In the case of a chain | 92   // Returns the actual value of an instruction. In the case of a chain | 
| 89   // of informative definitions, return the root of the chain. | 93   // of informative definitions, return the root of the chain. | 
| 90   HValue* ActualValue(HValue* obj) { | 94   HValue* ActualValue(HValue* obj) { | 
| 91     while (obj->IsInformativeDefinition()) {  // Walk a chain of idefs. | 95     while (obj->IsInformativeDefinition()) {  // Walk a chain of idefs. | 
| 92       obj = obj->RedefinedOperand(); | 96       obj = obj->RedefinedOperand(); | 
| 93     } | 97     } | 
| 94     return obj; | 98     return obj; | 
| 95   } | 99   } | 
| 96 }; | 100 }; | 
| 97 | 101 | 
| 98 | 102 | 
| 99 } }  // namespace v8::internal | 103 } }  // namespace v8::internal | 
| 100 | 104 | 
| 101 #endif  // V8_HYDROGEN_ALIAS_ANALYSIS_H_ | 105 #endif  // V8_HYDROGEN_ALIAS_ANALYSIS_H_ | 
| OLD | NEW | 
|---|