Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 1 | //===- AliasSetTracker.cpp - Alias Sets Tracker implementation-------------===// |
Misha Brukman | 2b37d7c | 2005-04-21 21:13:18 +0000 | [diff] [blame] | 2 | // |
John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Misha Brukman | 2b37d7c | 2005-04-21 21:13:18 +0000 | [diff] [blame] | 7 | // |
John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 9 | // |
| 10 | // This file implements the AliasSetTracker and AliasSet classes. |
Misha Brukman | 2b37d7c | 2005-04-21 21:13:18 +0000 | [diff] [blame] | 11 | // |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "llvm/Analysis/AliasSetTracker.h" |
| 15 | #include "llvm/Analysis/AliasAnalysis.h" |
Max Kazantsev | 187d918 | 2018-08-30 03:39:16 +0000 | [diff] [blame] | 16 | #include "llvm/Analysis/GuardUtils.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 17 | #include "llvm/Analysis/MemoryLocation.h" |
Nico Weber | 0f38c60 | 2018-04-30 14:59:11 +0000 | [diff] [blame] | 18 | #include "llvm/Config/llvm-config.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 19 | #include "llvm/IR/Constants.h" |
Chandler Carruth | 0b8c9a8 | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 20 | #include "llvm/IR/DataLayout.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 21 | #include "llvm/IR/Function.h" |
Chandler Carruth | 876ac60 | 2014-03-04 10:30:26 +0000 | [diff] [blame] | 22 | #include "llvm/IR/InstIterator.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 23 | #include "llvm/IR/Instruction.h" |
Chandler Carruth | 0b8c9a8 | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 24 | #include "llvm/IR/Instructions.h" |
| 25 | #include "llvm/IR/IntrinsicInst.h" |
Chandler Carruth | e3e43d9 | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 26 | #include "llvm/IR/Module.h" |
Max Kazantsev | 9e9c1c4 | 2018-08-15 06:21:02 +0000 | [diff] [blame] | 27 | #include "llvm/IR/PatternMatch.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 28 | #include "llvm/IR/Value.h" |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 29 | #include "llvm/Pass.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 30 | #include "llvm/Support/AtomicOrdering.h" |
| 31 | #include "llvm/Support/Casting.h" |
| 32 | #include "llvm/Support/CommandLine.h" |
| 33 | #include "llvm/Support/Compiler.h" |
David Greene | 43c48ac | 2009-12-23 19:27:59 +0000 | [diff] [blame] | 34 | #include "llvm/Support/Debug.h" |
Torok Edwin | c25e758 | 2009-07-11 20:10:48 +0000 | [diff] [blame] | 35 | #include "llvm/Support/ErrorHandling.h" |
Chris Lattner | 791102f | 2009-08-23 05:17:37 +0000 | [diff] [blame] | 36 | #include "llvm/Support/raw_ostream.h" |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 37 | #include <cassert> |
| 38 | #include <cstdint> |
| 39 | #include <vector> |
| 40 | |
Chris Lattner | e260924 | 2003-12-14 04:52:11 +0000 | [diff] [blame] | 41 | using namespace llvm; |
Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 42 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 43 | static cl::opt<unsigned> |
| 44 | SaturationThreshold("alias-set-saturation-threshold", cl::Hidden, |
| 45 | cl::init(250), |
| 46 | cl::desc("The maximum number of pointers may-alias " |
| 47 | "sets may contain before degradation")); |
| 48 | |
Chris Lattner | cc8d524 | 2004-11-27 18:37:42 +0000 | [diff] [blame] | 49 | /// mergeSetIn - Merge the specified alias set into this alias set. |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 50 | /// |
Chris Lattner | cc8d524 | 2004-11-27 18:37:42 +0000 | [diff] [blame] | 51 | void AliasSet::mergeSetIn(AliasSet &AS, AliasSetTracker &AST) { |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 52 | assert(!AS.Forward && "Alias set is already forwarding!"); |
| 53 | assert(!Forward && "This set is a forwarding set!!"); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 54 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 55 | bool WasMustAlias = (Alias == SetMustAlias); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 56 | // Update the alias and access types of this set... |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 57 | Access |= AS.Access; |
| 58 | Alias |= AS.Alias; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 59 | |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 60 | if (Alias == SetMustAlias) { |
Chris Lattner | cc8d524 | 2004-11-27 18:37:42 +0000 | [diff] [blame] | 61 | // Check that these two merged sets really are must aliases. Since both |
| 62 | // used to be must-alias sets, we can just check any pointer from each set |
| 63 | // for aliasing. |
| 64 | AliasAnalysis &AA = AST.getAliasAnalysis(); |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 65 | PointerRec *L = getSomePointer(); |
| 66 | PointerRec *R = AS.getSomePointer(); |
Chris Lattner | cc8d524 | 2004-11-27 18:37:42 +0000 | [diff] [blame] | 67 | |
| 68 | // If the pointers are not a must-alias pair, this set becomes a may alias. |
Chandler Carruth | 4d7ed39 | 2015-06-17 07:18:54 +0000 | [diff] [blame] | 69 | if (AA.alias(MemoryLocation(L->getValue(), L->getSize(), L->getAAInfo()), |
| 70 | MemoryLocation(R->getValue(), R->getSize(), R->getAAInfo())) != |
Chandler Carruth | 1e3557d | 2015-06-22 02:16:51 +0000 | [diff] [blame] | 71 | MustAlias) |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 72 | Alias = SetMayAlias; |
Chris Lattner | cc8d524 | 2004-11-27 18:37:42 +0000 | [diff] [blame] | 73 | } |
| 74 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 75 | if (Alias == SetMayAlias) { |
| 76 | if (WasMustAlias) |
| 77 | AST.TotalMayAliasSetSize += size(); |
| 78 | if (AS.Alias == SetMustAlias) |
| 79 | AST.TotalMayAliasSetSize += AS.size(); |
| 80 | } |
| 81 | |
David Majnemer | a44c501 | 2014-11-19 19:36:18 +0000 | [diff] [blame] | 82 | bool ASHadUnknownInsts = !AS.UnknownInsts.empty(); |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 83 | if (UnknownInsts.empty()) { // Merge call sites... |
David Majnemer | a44c501 | 2014-11-19 19:36:18 +0000 | [diff] [blame] | 84 | if (ASHadUnknownInsts) { |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 85 | std::swap(UnknownInsts, AS.UnknownInsts); |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 86 | addRef(); |
| 87 | } |
David Majnemer | a44c501 | 2014-11-19 19:36:18 +0000 | [diff] [blame] | 88 | } else if (ASHadUnknownInsts) { |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 89 | UnknownInsts.insert(UnknownInsts.end(), AS.UnknownInsts.begin(), AS.UnknownInsts.end()); |
| 90 | AS.UnknownInsts.clear(); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 91 | } |
Misha Brukman | 2b37d7c | 2005-04-21 21:13:18 +0000 | [diff] [blame] | 92 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 93 | AS.Forward = this; // Forward across AS now... |
| 94 | addRef(); // AS is now pointing to us... |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 95 | |
| 96 | // Merge the list of constituent pointers... |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 97 | if (AS.PtrList) { |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 98 | SetSize += AS.size(); |
| 99 | AS.SetSize = 0; |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 100 | *PtrListEnd = AS.PtrList; |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 101 | AS.PtrList->setPrevInList(PtrListEnd); |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 102 | PtrListEnd = AS.PtrListEnd; |
| 103 | |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 104 | AS.PtrList = nullptr; |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 105 | AS.PtrListEnd = &AS.PtrList; |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 106 | assert(*AS.PtrListEnd == nullptr && "End of list is not null?"); |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 107 | } |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 108 | if (ASHadUnknownInsts) |
| 109 | AS.dropRef(AST); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 110 | } |
| 111 | |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 112 | void AliasSetTracker::removeAliasSet(AliasSet *AS) { |
Chris Lattner | b8a31ac | 2004-07-22 07:58:18 +0000 | [diff] [blame] | 113 | if (AliasSet *Fwd = AS->Forward) { |
| 114 | Fwd->dropRef(*this); |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 115 | AS->Forward = nullptr; |
Alina Sbirlea | 782574b | 2018-11-01 23:37:51 +0000 | [diff] [blame] | 116 | } else // Update TotalMayAliasSetSize only if not forwarding. |
| 117 | if (AS->Alias == AliasSet::SetMayAlias) |
| 118 | TotalMayAliasSetSize -= AS->size(); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 119 | |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 120 | AliasSets.erase(AS); |
| 121 | } |
| 122 | |
| 123 | void AliasSet::removeFromTracker(AliasSetTracker &AST) { |
| 124 | assert(RefCount == 0 && "Cannot remove non-dead alias set from tracker!"); |
| 125 | AST.removeAliasSet(this); |
| 126 | } |
| 127 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 128 | void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry, |
George Burgess IV | 3bf8298 | 2018-05-25 21:16:58 +0000 | [diff] [blame] | 129 | LocationSize Size, const AAMDNodes &AAInfo, |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 130 | bool KnownMustAlias) { |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 131 | assert(!Entry.hasAliasSet() && "Entry already in set!"); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 132 | |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 133 | // Check to see if we have to downgrade to _may_ alias. |
| 134 | if (isMustAlias() && !KnownMustAlias) |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 135 | if (PointerRec *P = getSomePointer()) { |
Chris Lattner | 3080b60 | 2004-09-15 16:59:47 +0000 | [diff] [blame] | 136 | AliasAnalysis &AA = AST.getAliasAnalysis(); |
Chandler Carruth | 1e3557d | 2015-06-22 02:16:51 +0000 | [diff] [blame] | 137 | AliasResult Result = |
Chandler Carruth | 4d7ed39 | 2015-06-17 07:18:54 +0000 | [diff] [blame] | 138 | AA.alias(MemoryLocation(P->getValue(), P->getSize(), P->getAAInfo()), |
| 139 | MemoryLocation(Entry.getValue(), Size, AAInfo)); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 140 | if (Result != MustAlias) { |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 141 | Alias = SetMayAlias; |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 142 | AST.TotalMayAliasSetSize += size(); |
| 143 | } else { |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 144 | // First entry of must alias must have maximum size! |
Hal Finkel | 2c7c54c | 2014-07-24 12:16:19 +0000 | [diff] [blame] | 145 | P->updateSizeAndAAInfo(Size, AAInfo); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 146 | } |
Chandler Carruth | 1e3557d | 2015-06-22 02:16:51 +0000 | [diff] [blame] | 147 | assert(Result != NoAlias && "Cannot be part of must set!"); |
Chris Lattner | 31a9d18 | 2003-02-26 22:11:00 +0000 | [diff] [blame] | 148 | } |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 149 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 150 | Entry.setAliasSet(this); |
Hal Finkel | 2c7c54c | 2014-07-24 12:16:19 +0000 | [diff] [blame] | 151 | Entry.updateSizeAndAAInfo(Size, AAInfo); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 152 | |
| 153 | // Add it to the end of the list... |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 154 | ++SetSize; |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 155 | assert(*PtrListEnd == nullptr && "End of list is not null?"); |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 156 | *PtrListEnd = &Entry; |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 157 | PtrListEnd = Entry.setPrevInList(PtrListEnd); |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 158 | assert(*PtrListEnd == nullptr && "End of list is not null?"); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 159 | // Entry points to alias set. |
| 160 | addRef(); |
| 161 | |
| 162 | if (Alias == SetMayAlias) |
| 163 | AST.TotalMayAliasSetSize++; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 164 | } |
| 165 | |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 166 | void AliasSet::addUnknownInst(Instruction *I, AliasAnalysis &AA) { |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 167 | if (UnknownInsts.empty()) |
| 168 | addRef(); |
Benjamin Kramer | 9589ff8 | 2015-05-29 19:43:39 +0000 | [diff] [blame] | 169 | UnknownInsts.emplace_back(I); |
Chris Lattner | 5b5f7c1 | 2004-03-15 04:08:36 +0000 | [diff] [blame] | 170 | |
Max Kazantsev | 9e9c1c4 | 2018-08-15 06:21:02 +0000 | [diff] [blame] | 171 | // Guards are marked as modifying memory for control flow modelling purposes, |
| 172 | // but don't actually modify any specific memory location. |
| 173 | using namespace PatternMatch; |
Max Kazantsev | 187d918 | 2018-08-30 03:39:16 +0000 | [diff] [blame] | 174 | bool MayWriteMemory = I->mayWriteToMemory() && !isGuard(I) && |
Philip Reames | ee5b70c | 2018-08-21 00:55:35 +0000 | [diff] [blame] | 175 | !(I->use_empty() && match(I, m_Intrinsic<Intrinsic::invariant_start>())); |
Max Kazantsev | 9e9c1c4 | 2018-08-15 06:21:02 +0000 | [diff] [blame] | 176 | if (!MayWriteMemory) { |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 177 | Alias = SetMayAlias; |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 178 | Access |= RefAccess; |
Duncan Sands | dff6710 | 2007-12-01 07:51:45 +0000 | [diff] [blame] | 179 | return; |
Chris Lattner | 5b5f7c1 | 2004-03-15 04:08:36 +0000 | [diff] [blame] | 180 | } |
| 181 | |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 182 | // FIXME: This should use mod/ref information to make this not suck so bad |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 183 | Alias = SetMayAlias; |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 184 | Access = ModRefAccess; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 185 | } |
| 186 | |
| 187 | /// aliasesPointer - Return true if the specified pointer "may" (or must) |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 188 | /// alias one of the members in the set. |
| 189 | /// |
George Burgess IV | 3bf8298 | 2018-05-25 21:16:58 +0000 | [diff] [blame] | 190 | bool AliasSet::aliasesPointer(const Value *Ptr, LocationSize Size, |
Hal Finkel | 2c7c54c | 2014-07-24 12:16:19 +0000 | [diff] [blame] | 191 | const AAMDNodes &AAInfo, |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 192 | AliasAnalysis &AA) const { |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 193 | if (AliasAny) |
| 194 | return true; |
| 195 | |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 196 | if (Alias == SetMustAlias) { |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 197 | assert(UnknownInsts.empty() && "Illegal must alias set!"); |
Chris Lattner | fcead4f | 2004-03-15 06:28:07 +0000 | [diff] [blame] | 198 | |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 199 | // If this is a set of MustAliases, only check to see if the pointer aliases |
Chris Lattner | 9476d74 | 2010-08-29 04:13:43 +0000 | [diff] [blame] | 200 | // SOME value in the set. |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 201 | PointerRec *SomePtr = getSomePointer(); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 202 | assert(SomePtr && "Empty must-alias set??"); |
Chandler Carruth | 4d7ed39 | 2015-06-17 07:18:54 +0000 | [diff] [blame] | 203 | return AA.alias(MemoryLocation(SomePtr->getValue(), SomePtr->getSize(), |
| 204 | SomePtr->getAAInfo()), |
| 205 | MemoryLocation(Ptr, Size, AAInfo)); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 206 | } |
| 207 | |
| 208 | // If this is a may-alias set, we have to check all of the pointers in the set |
| 209 | // to be sure it doesn't alias the set... |
| 210 | for (iterator I = begin(), E = end(); I != E; ++I) |
Chandler Carruth | 4d7ed39 | 2015-06-17 07:18:54 +0000 | [diff] [blame] | 211 | if (AA.alias(MemoryLocation(Ptr, Size, AAInfo), |
| 212 | MemoryLocation(I.getPointer(), I.getSize(), I.getAAInfo()))) |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 213 | return true; |
| 214 | |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 215 | // Check the unknown instructions... |
| 216 | if (!UnknownInsts.empty()) { |
| 217 | for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i) |
Sanjoy Das | c32a573 | 2017-03-11 01:15:48 +0000 | [diff] [blame] | 218 | if (auto *Inst = getUnknownInst(i)) |
Alina Sbirlea | a2d30e9 | 2017-12-05 20:12:23 +0000 | [diff] [blame] | 219 | if (isModOrRefSet( |
| 220 | AA.getModRefInfo(Inst, MemoryLocation(Ptr, Size, AAInfo)))) |
Sanjoy Das | c32a573 | 2017-03-11 01:15:48 +0000 | [diff] [blame] | 221 | return true; |
Chris Lattner | efe30ef | 2004-07-27 02:20:26 +0000 | [diff] [blame] | 222 | } |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 223 | |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 224 | return false; |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 225 | } |
| 226 | |
Pete Cooper | a0706f5 | 2015-05-13 01:12:12 +0000 | [diff] [blame] | 227 | bool AliasSet::aliasesUnknownInst(const Instruction *Inst, |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 228 | AliasAnalysis &AA) const { |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 229 | |
| 230 | if (AliasAny) |
| 231 | return true; |
| 232 | |
Alina Sbirlea | 782574b | 2018-11-01 23:37:51 +0000 | [diff] [blame] | 233 | assert(Inst->mayReadOrWriteMemory() && |
| 234 | "Instruction must either read or write memory."); |
Chris Lattner | 5b5f7c1 | 2004-03-15 04:08:36 +0000 | [diff] [blame] | 235 | |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 236 | for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i) { |
Xin Tong | 5b97b27 | 2017-06-25 12:55:11 +0000 | [diff] [blame] | 237 | if (auto *UnknownInst = getUnknownInst(i)) { |
Chandler Carruth | 81aa712 | 2019-01-07 05:42:51 +0000 | [diff] [blame] | 238 | const auto *C1 = dyn_cast<CallBase>(UnknownInst); |
| 239 | const auto *C2 = dyn_cast<CallBase>(Inst); |
Alina Sbirlea | a2d30e9 | 2017-12-05 20:12:23 +0000 | [diff] [blame] | 240 | if (!C1 || !C2 || isModOrRefSet(AA.getModRefInfo(C1, C2)) || |
| 241 | isModOrRefSet(AA.getModRefInfo(C2, C1))) |
Sanjoy Das | c32a573 | 2017-03-11 01:15:48 +0000 | [diff] [blame] | 242 | return true; |
| 243 | } |
Chris Lattner | cb7f653 | 2010-08-29 18:42:23 +0000 | [diff] [blame] | 244 | } |
Chris Lattner | efe30ef | 2004-07-27 02:20:26 +0000 | [diff] [blame] | 245 | |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 246 | for (iterator I = begin(), E = end(); I != E; ++I) |
Alina Sbirlea | a2d30e9 | 2017-12-05 20:12:23 +0000 | [diff] [blame] | 247 | if (isModOrRefSet(AA.getModRefInfo( |
| 248 | Inst, MemoryLocation(I.getPointer(), I.getSize(), I.getAAInfo())))) |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 249 | return true; |
| 250 | |
| 251 | return false; |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 252 | } |
| 253 | |
Philip Reames | 3df4cb1 | 2018-08-22 03:32:52 +0000 | [diff] [blame] | 254 | Instruction* AliasSet::getUniqueInstruction() { |
Philip Reames | 3df4cb1 | 2018-08-22 03:32:52 +0000 | [diff] [blame] | 255 | if (AliasAny) |
| 256 | // May have collapses alias set |
| 257 | return nullptr; |
Philip Reames | a9f18e9 | 2018-08-29 21:49:30 +0000 | [diff] [blame] | 258 | if (begin() != end()) { |
| 259 | if (!UnknownInsts.empty()) |
| 260 | // Another instruction found |
| 261 | return nullptr; |
| 262 | if (std::next(begin()) != end()) |
| 263 | // Another instruction found |
| 264 | return nullptr; |
| 265 | Value *Addr = begin()->getValue(); |
| 266 | assert(!Addr->user_empty() && |
| 267 | "where's the instruction which added this pointer?"); |
| 268 | if (std::next(Addr->user_begin()) != Addr->user_end()) |
| 269 | // Another instruction found -- this is really restrictive |
| 270 | // TODO: generalize! |
| 271 | return nullptr; |
| 272 | return cast<Instruction>(*(Addr->user_begin())); |
| 273 | } |
Philip Reames | 52c037b | 2018-08-22 03:36:42 +0000 | [diff] [blame] | 274 | if (1 != UnknownInsts.size()) |
Philip Reames | 3df4cb1 | 2018-08-22 03:32:52 +0000 | [diff] [blame] | 275 | return nullptr; |
| 276 | return cast<Instruction>(UnknownInsts[0]); |
| 277 | } |
| 278 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 279 | void AliasSetTracker::clear() { |
| 280 | // Delete all the PointerRec entries. |
Dan Gohman | b5b56ba | 2009-07-30 20:21:41 +0000 | [diff] [blame] | 281 | for (PointerMapType::iterator I = PointerMap.begin(), E = PointerMap.end(); |
| 282 | I != E; ++I) |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 283 | I->second->eraseFromList(); |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 284 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 285 | PointerMap.clear(); |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 286 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 287 | // The alias sets should all be clear now. |
| 288 | AliasSets.clear(); |
| 289 | } |
| 290 | |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 291 | |
Michael Kuperstein | f66aab6 | 2016-04-14 22:00:11 +0000 | [diff] [blame] | 292 | /// mergeAliasSetsForPointer - Given a pointer, merge all alias sets that may |
| 293 | /// alias the pointer. Return the unified set, or nullptr if no set that aliases |
| 294 | /// the pointer was found. |
| 295 | AliasSet *AliasSetTracker::mergeAliasSetsForPointer(const Value *Ptr, |
George Burgess IV | 3bf8298 | 2018-05-25 21:16:58 +0000 | [diff] [blame] | 296 | LocationSize Size, |
Michael Kuperstein | f66aab6 | 2016-04-14 22:00:11 +0000 | [diff] [blame] | 297 | const AAMDNodes &AAInfo) { |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 298 | AliasSet *FoundSet = nullptr; |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 299 | for (iterator I = begin(), E = end(); I != E;) { |
| 300 | iterator Cur = I++; |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 301 | if (Cur->Forward || !Cur->aliasesPointer(Ptr, Size, AAInfo, AA)) continue; |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 302 | |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 303 | if (!FoundSet) { // If this is the first alias set ptr can go into. |
Duncan P. N. Exon Smith | d3a5adc | 2015-10-10 00:53:03 +0000 | [diff] [blame] | 304 | FoundSet = &*Cur; // Remember it. |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 305 | } else { // Otherwise, we must merge the sets. |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 306 | FoundSet->mergeSetIn(*Cur, *this); // Merge in contents. |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 307 | } |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 308 | } |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 309 | |
| 310 | return FoundSet; |
| 311 | } |
| 312 | |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 313 | AliasSet *AliasSetTracker::findAliasSetForUnknownInst(Instruction *Inst) { |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 314 | AliasSet *FoundSet = nullptr; |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 315 | for (iterator I = begin(), E = end(); I != E;) { |
| 316 | iterator Cur = I++; |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 317 | if (Cur->Forward || !Cur->aliasesUnknownInst(Inst, AA)) |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 318 | continue; |
Craig Topper | 570e52c | 2014-04-15 04:59:12 +0000 | [diff] [blame] | 319 | if (!FoundSet) // If this is the first alias set ptr can go into. |
Duncan P. N. Exon Smith | d3a5adc | 2015-10-10 00:53:03 +0000 | [diff] [blame] | 320 | FoundSet = &*Cur; // Remember it. |
Alina Sbirlea | 782574b | 2018-11-01 23:37:51 +0000 | [diff] [blame] | 321 | else // Otherwise, we must merge the sets. |
David Majnemer | f47d325 | 2014-11-19 09:41:05 +0000 | [diff] [blame] | 322 | FoundSet->mergeSetIn(*Cur, *this); // Merge in contents. |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 323 | } |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 324 | return FoundSet; |
| 325 | } |
| 326 | |
Philip Reames | 4a20888 | 2018-08-16 20:11:15 +0000 | [diff] [blame] | 327 | AliasSet &AliasSetTracker::getAliasSetFor(const MemoryLocation &MemLoc) { |
| 328 | |
| 329 | Value * const Pointer = const_cast<Value*>(MemLoc.Ptr); |
| 330 | const LocationSize Size = MemLoc.Size; |
| 331 | const AAMDNodes &AAInfo = MemLoc.AATags; |
| 332 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 333 | AliasSet::PointerRec &Entry = getEntryFor(Pointer); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 334 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 335 | if (AliasAnyAS) { |
| 336 | // At this point, the AST is saturated, so we only have one active alias |
| 337 | // set. That means we already know which alias set we want to return, and |
| 338 | // just need to add the pointer to that set to keep the data structure |
| 339 | // consistent. |
| 340 | // This, of course, means that we will never need a merge here. |
| 341 | if (Entry.hasAliasSet()) { |
| 342 | Entry.updateSizeAndAAInfo(Size, AAInfo); |
| 343 | assert(Entry.getAliasSet(*this) == AliasAnyAS && |
| 344 | "Entry in saturated AST must belong to only alias set"); |
| 345 | } else { |
| 346 | AliasAnyAS->addPointer(*this, Entry, Size, AAInfo); |
| 347 | } |
| 348 | return *AliasAnyAS; |
| 349 | } |
| 350 | |
Chris Lattner | 9476d74 | 2010-08-29 04:13:43 +0000 | [diff] [blame] | 351 | // Check to see if the pointer is already known. |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 352 | if (Entry.hasAliasSet()) { |
Michael Kuperstein | f66aab6 | 2016-04-14 22:00:11 +0000 | [diff] [blame] | 353 | // If the size changed, we may need to merge several alias sets. |
| 354 | // Note that we can *not* return the result of mergeAliasSetsForPointer |
| 355 | // due to a quirk of alias analysis behavior. Since alias(undef, undef) |
| 356 | // is NoAlias, mergeAliasSetsForPointer(undef, ...) will not find the |
| 357 | // the right set for undef, even if it exists. |
| 358 | if (Entry.updateSizeAndAAInfo(Size, AAInfo)) |
| 359 | mergeAliasSetsForPointer(Pointer, Size, AAInfo); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 360 | // Return the set! |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 361 | return *Entry.getAliasSet(*this)->getForwardedTarget(*this); |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 362 | } |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 363 | |
Michael Kuperstein | f66aab6 | 2016-04-14 22:00:11 +0000 | [diff] [blame] | 364 | if (AliasSet *AS = mergeAliasSetsForPointer(Pointer, Size, AAInfo)) { |
Chris Lattner | 9476d74 | 2010-08-29 04:13:43 +0000 | [diff] [blame] | 365 | // Add it to the alias set it aliases. |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 366 | AS->addPointer(*this, Entry, Size, AAInfo); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 367 | return *AS; |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 368 | } |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 369 | |
Chris Lattner | 9476d74 | 2010-08-29 04:13:43 +0000 | [diff] [blame] | 370 | // Otherwise create a new alias set to hold the loaded pointer. |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 371 | AliasSets.push_back(new AliasSet()); |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 372 | AliasSets.back().addPointer(*this, Entry, Size, AAInfo); |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 373 | return AliasSets.back(); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 374 | } |
| 375 | |
George Burgess IV | 3bf8298 | 2018-05-25 21:16:58 +0000 | [diff] [blame] | 376 | void AliasSetTracker::add(Value *Ptr, LocationSize Size, |
| 377 | const AAMDNodes &AAInfo) { |
Alina Sbirlea | 6be73e7 | 2018-10-29 22:25:59 +0000 | [diff] [blame] | 378 | addPointer(MemoryLocation(Ptr, Size, AAInfo), AliasSet::NoAccess); |
Chris Lattner | 61d4627 | 2004-07-26 05:50:23 +0000 | [diff] [blame] | 379 | } |
| 380 | |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 381 | void AliasSetTracker::add(LoadInst *LI) { |
Philip Reames | 80d595c | 2018-08-22 19:30:46 +0000 | [diff] [blame] | 382 | if (isStrongerThanMonotonic(LI->getOrdering())) |
| 383 | return addUnknown(LI); |
Philip Reames | 0ff071a | 2018-08-21 17:59:11 +0000 | [diff] [blame] | 384 | addPointer(MemoryLocation::get(LI), AliasSet::RefAccess); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 385 | } |
| 386 | |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 387 | void AliasSetTracker::add(StoreInst *SI) { |
Philip Reames | 80d595c | 2018-08-22 19:30:46 +0000 | [diff] [blame] | 388 | if (isStrongerThanMonotonic(SI->getOrdering())) |
| 389 | return addUnknown(SI); |
Philip Reames | 0ff071a | 2018-08-21 17:59:11 +0000 | [diff] [blame] | 390 | addPointer(MemoryLocation::get(SI), AliasSet::ModAccess); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 391 | } |
| 392 | |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 393 | void AliasSetTracker::add(VAArgInst *VAAI) { |
Philip Reames | 20a211a | 2018-08-13 22:34:14 +0000 | [diff] [blame] | 394 | addPointer(MemoryLocation::get(VAAI), AliasSet::ModRefAccess); |
Dan Gohman | 235fc57 | 2008-04-14 18:34:50 +0000 | [diff] [blame] | 395 | } |
| 396 | |
Daniel Neilson | 136d97e | 2018-05-30 14:43:39 +0000 | [diff] [blame] | 397 | void AliasSetTracker::add(AnyMemSetInst *MSI) { |
Philip Reames | 80d595c | 2018-08-22 19:30:46 +0000 | [diff] [blame] | 398 | addPointer(MemoryLocation::getForDest(MSI), AliasSet::ModAccess); |
Haicheng Wu | 5ce6e32 | 2016-02-17 02:01:50 +0000 | [diff] [blame] | 399 | } |
Chris Lattner | e260924 | 2003-12-14 04:52:11 +0000 | [diff] [blame] | 400 | |
Daniel Neilson | 136d97e | 2018-05-30 14:43:39 +0000 | [diff] [blame] | 401 | void AliasSetTracker::add(AnyMemTransferInst *MTI) { |
Philip Reames | 80d595c | 2018-08-22 19:30:46 +0000 | [diff] [blame] | 402 | addPointer(MemoryLocation::getForDest(MTI), AliasSet::ModAccess); |
Philip Reames | 3e62673 | 2018-09-10 16:00:27 +0000 | [diff] [blame] | 403 | addPointer(MemoryLocation::getForSource(MTI), AliasSet::RefAccess); |
Chad Rosier | db638de | 2016-10-19 19:09:03 +0000 | [diff] [blame] | 404 | } |
| 405 | |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 406 | void AliasSetTracker::addUnknown(Instruction *Inst) { |
| 407 | if (isa<DbgInfoIntrinsic>(Inst)) |
| 408 | return; // Ignore DbgInfo Intrinsics. |
Chad Rosier | 4438f46 | 2016-11-07 14:11:45 +0000 | [diff] [blame] | 409 | |
| 410 | if (auto *II = dyn_cast<IntrinsicInst>(Inst)) { |
| 411 | // These intrinsics will show up as affecting memory, but they are just |
| 412 | // markers. |
| 413 | switch (II->getIntrinsicID()) { |
| 414 | default: |
| 415 | break; |
| 416 | // FIXME: Add lifetime/invariant intrinsics (See: PR30807). |
| 417 | case Intrinsic::assume: |
Dan Gohman | b5e0bec | 2017-11-08 21:59:51 +0000 | [diff] [blame] | 418 | case Intrinsic::sideeffect: |
Chad Rosier | 4438f46 | 2016-11-07 14:11:45 +0000 | [diff] [blame] | 419 | return; |
| 420 | } |
| 421 | } |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 422 | if (!Inst->mayReadOrWriteMemory()) |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 423 | return; // doesn't alias anything |
Chris Lattner | fcead4f | 2004-03-15 06:28:07 +0000 | [diff] [blame] | 424 | |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 425 | AliasSet *AS = findAliasSetForUnknownInst(Inst); |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 426 | if (AS) { |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 427 | AS->addUnknownInst(Inst, AA); |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 428 | return; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 429 | } |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 430 | AliasSets.push_back(new AliasSet()); |
| 431 | AS = &AliasSets.back(); |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 432 | AS->addUnknownInst(Inst, AA); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 433 | } |
| 434 | |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 435 | void AliasSetTracker::add(Instruction *I) { |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 436 | // Dispatch to one of the other add methods. |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 437 | if (LoadInst *LI = dyn_cast<LoadInst>(I)) |
Chris Lattner | 12c1155 | 2004-07-21 05:18:04 +0000 | [diff] [blame] | 438 | return add(LI); |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 439 | if (StoreInst *SI = dyn_cast<StoreInst>(I)) |
Chris Lattner | 12c1155 | 2004-07-21 05:18:04 +0000 | [diff] [blame] | 440 | return add(SI); |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 441 | if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I)) |
Dan Gohman | 235fc57 | 2008-04-14 18:34:50 +0000 | [diff] [blame] | 442 | return add(VAAI); |
Daniel Neilson | 136d97e | 2018-05-30 14:43:39 +0000 | [diff] [blame] | 443 | if (AnyMemSetInst *MSI = dyn_cast<AnyMemSetInst>(I)) |
Haicheng Wu | 5ce6e32 | 2016-02-17 02:01:50 +0000 | [diff] [blame] | 444 | return add(MSI); |
Daniel Neilson | 136d97e | 2018-05-30 14:43:39 +0000 | [diff] [blame] | 445 | if (AnyMemTransferInst *MTI = dyn_cast<AnyMemTransferInst>(I)) |
Chad Rosier | db638de | 2016-10-19 19:09:03 +0000 | [diff] [blame] | 446 | return add(MTI); |
Philip Reames | fe1f0fe | 2018-09-07 21:36:11 +0000 | [diff] [blame] | 447 | |
| 448 | // Handle all calls with known mod/ref sets genericall |
Chandler Carruth | 81aa712 | 2019-01-07 05:42:51 +0000 | [diff] [blame] | 449 | if (auto *Call = dyn_cast<CallBase>(I)) |
| 450 | if (Call->onlyAccessesArgMemory()) { |
| 451 | auto getAccessFromModRef = [](ModRefInfo MRI) { |
| 452 | if (isRefSet(MRI) && isModSet(MRI)) |
| 453 | return AliasSet::ModRefAccess; |
| 454 | else if (isModSet(MRI)) |
| 455 | return AliasSet::ModAccess; |
| 456 | else if (isRefSet(MRI)) |
| 457 | return AliasSet::RefAccess; |
| 458 | else |
| 459 | return AliasSet::NoAccess; |
| 460 | }; |
Philip Reames | fe1f0fe | 2018-09-07 21:36:11 +0000 | [diff] [blame] | 461 | |
Chandler Carruth | 81aa712 | 2019-01-07 05:42:51 +0000 | [diff] [blame] | 462 | ModRefInfo CallMask = createModRefInfo(AA.getModRefBehavior(Call)); |
Philip Reames | fe1f0fe | 2018-09-07 21:36:11 +0000 | [diff] [blame] | 463 | |
Chandler Carruth | 81aa712 | 2019-01-07 05:42:51 +0000 | [diff] [blame] | 464 | // Some intrinsics are marked as modifying memory for control flow |
| 465 | // modelling purposes, but don't actually modify any specific memory |
| 466 | // location. |
| 467 | using namespace PatternMatch; |
| 468 | if (Call->use_empty() && |
| 469 | match(Call, m_Intrinsic<Intrinsic::invariant_start>())) |
| 470 | CallMask = clearMod(CallMask); |
| 471 | |
| 472 | for (auto IdxArgPair : enumerate(Call->args())) { |
| 473 | int ArgIdx = IdxArgPair.index(); |
| 474 | const Value *Arg = IdxArgPair.value(); |
| 475 | if (!Arg->getType()->isPointerTy()) |
| 476 | continue; |
| 477 | MemoryLocation ArgLoc = |
| 478 | MemoryLocation::getForArgument(Call, ArgIdx, nullptr); |
| 479 | ModRefInfo ArgMask = AA.getArgModRefInfo(Call, ArgIdx); |
| 480 | ArgMask = intersectModRef(CallMask, ArgMask); |
| 481 | if (!isNoModRef(ArgMask)) |
| 482 | addPointer(ArgLoc, getAccessFromModRef(ArgMask)); |
| 483 | } |
| 484 | return; |
Philip Reames | fe1f0fe | 2018-09-07 21:36:11 +0000 | [diff] [blame] | 485 | } |
Chandler Carruth | 81aa712 | 2019-01-07 05:42:51 +0000 | [diff] [blame] | 486 | |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 487 | return addUnknown(I); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 488 | } |
| 489 | |
Chris Lattner | 319d05b | 2003-03-03 23:28:05 +0000 | [diff] [blame] | 490 | void AliasSetTracker::add(BasicBlock &BB) { |
Duncan P. N. Exon Smith | d3a5adc | 2015-10-10 00:53:03 +0000 | [diff] [blame] | 491 | for (auto &I : BB) |
| 492 | add(&I); |
Chris Lattner | 319d05b | 2003-03-03 23:28:05 +0000 | [diff] [blame] | 493 | } |
| 494 | |
| 495 | void AliasSetTracker::add(const AliasSetTracker &AST) { |
| 496 | assert(&AA == &AST.AA && |
| 497 | "Merging AliasSetTracker objects with different Alias Analyses!"); |
| 498 | |
| 499 | // Loop over all of the alias sets in AST, adding the pointers contained |
| 500 | // therein into the current alias sets. This can cause alias sets to be |
| 501 | // merged together in the current AST. |
Benjamin Kramer | 8d0d2b6 | 2016-06-26 17:27:42 +0000 | [diff] [blame] | 502 | for (const AliasSet &AS : AST) { |
| 503 | if (AS.Forward) |
| 504 | continue; // Ignore forwarding alias sets |
Chris Lattner | 319d05b | 2003-03-03 23:28:05 +0000 | [diff] [blame] | 505 | |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 506 | // If there are any call sites in the alias set, add them to this AST. |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 507 | for (unsigned i = 0, e = AS.UnknownInsts.size(); i != e; ++i) |
Sanjoy Das | c32a573 | 2017-03-11 01:15:48 +0000 | [diff] [blame] | 508 | if (auto *Inst = AS.getUnknownInst(i)) |
| 509 | add(Inst); |
Chris Lattner | 319d05b | 2003-03-03 23:28:05 +0000 | [diff] [blame] | 510 | |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 511 | // Loop over all of the pointers in this alias set. |
Philip Reames | 0ff071a | 2018-08-21 17:59:11 +0000 | [diff] [blame] | 512 | for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) |
Alina Sbirlea | 6be73e7 | 2018-10-29 22:25:59 +0000 | [diff] [blame] | 513 | addPointer( |
| 514 | MemoryLocation(ASI.getPointer(), ASI.getSize(), ASI.getAAInfo()), |
| 515 | (AliasSet::AccessLattice)AS.Access); |
Chris Lattner | 6e1f510 | 2010-08-29 04:06:55 +0000 | [diff] [blame] | 516 | } |
Chris Lattner | 319d05b | 2003-03-03 23:28:05 +0000 | [diff] [blame] | 517 | } |
| 518 | |
Chris Lattner | c43e0ae | 2004-05-23 21:10:58 +0000 | [diff] [blame] | 519 | // deleteValue method - This method is used to remove a pointer value from the |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 520 | // AliasSetTracker entirely. It should be used when an instruction is deleted |
| 521 | // from the program to update the AST. If you don't use this, you would have |
| 522 | // dangling pointers to deleted instructions. |
| 523 | // |
Chris Lattner | c43e0ae | 2004-05-23 21:10:58 +0000 | [diff] [blame] | 524 | void AliasSetTracker::deleteValue(Value *PtrVal) { |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 525 | // First, look up the PointerRec for this pointer. |
Benjamin Kramer | 992c25a | 2012-06-30 22:37:15 +0000 | [diff] [blame] | 526 | PointerMapType::iterator I = PointerMap.find_as(PtrVal); |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 527 | if (I == PointerMap.end()) return; // Noop |
| 528 | |
| 529 | // If we found one, remove the pointer from the alias set it is in. |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 530 | AliasSet::PointerRec *PtrValEnt = I->second; |
| 531 | AliasSet *AS = PtrValEnt->getAliasSet(*this); |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 532 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 533 | // Unlink and delete from the list of values. |
| 534 | PtrValEnt->eraseFromList(); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 535 | |
| 536 | if (AS->Alias == AliasSet::SetMayAlias) { |
| 537 | AS->SetSize--; |
| 538 | TotalMayAliasSetSize--; |
| 539 | } |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 540 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 541 | // Stop using the alias set. |
Chris Lattner | b8a31ac | 2004-07-22 07:58:18 +0000 | [diff] [blame] | 542 | AS->dropRef(*this); |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 543 | |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 544 | PointerMap.erase(I); |
| 545 | } |
| 546 | |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 547 | // copyValue - This method should be used whenever a preexisting value in the |
| 548 | // program is copied or cloned, introducing a new value. Note that it is ok for |
| 549 | // clients that use this method to introduce the same value multiple times: if |
| 550 | // the tracker already knows about a value, it will ignore the request. |
| 551 | // |
| 552 | void AliasSetTracker::copyValue(Value *From, Value *To) { |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 553 | // First, look up the PointerRec for this pointer. |
Benjamin Kramer | 992c25a | 2012-06-30 22:37:15 +0000 | [diff] [blame] | 554 | PointerMapType::iterator I = PointerMap.find_as(From); |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 555 | if (I == PointerMap.end()) |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 556 | return; // Noop |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 557 | assert(I->second->hasAliasSet() && "Dead entry?"); |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 558 | |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 559 | AliasSet::PointerRec &Entry = getEntryFor(To); |
| 560 | if (Entry.hasAliasSet()) return; // Already in the tracker! |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 561 | |
Xinliang David Li | b9ecebc | 2016-08-11 23:09:56 +0000 | [diff] [blame] | 562 | // getEntryFor above may invalidate iterator \c I, so reinitialize it. |
Benjamin Kramer | 992c25a | 2012-06-30 22:37:15 +0000 | [diff] [blame] | 563 | I = PointerMap.find_as(From); |
Xinliang David Li | b9ecebc | 2016-08-11 23:09:56 +0000 | [diff] [blame] | 564 | // Add it to the alias set it aliases... |
Chris Lattner | d7168dd | 2009-03-09 05:11:09 +0000 | [diff] [blame] | 565 | AliasSet *AS = I->second->getAliasSet(*this); |
Dan Gohman | fb8096d | 2010-10-18 21:28:00 +0000 | [diff] [blame] | 566 | AS->addPointer(*this, Entry, I->second->getSize(), |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 567 | I->second->getAAInfo(), |
Dan Gohman | a8702ea | 2010-10-18 20:44:50 +0000 | [diff] [blame] | 568 | true); |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 569 | } |
| 570 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 571 | AliasSet &AliasSetTracker::mergeAllAliasSets() { |
| 572 | assert(!AliasAnyAS && (TotalMayAliasSetSize > SaturationThreshold) && |
| 573 | "Full merge should happen once, when the saturation threshold is " |
| 574 | "reached"); |
Chris Lattner | b66e648 | 2004-09-14 19:15:32 +0000 | [diff] [blame] | 575 | |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 576 | // Collect all alias sets, so that we can drop references with impunity |
| 577 | // without worrying about iterator invalidation. |
| 578 | std::vector<AliasSet *> ASVector; |
| 579 | ASVector.reserve(SaturationThreshold); |
| 580 | for (iterator I = begin(), E = end(); I != E; I++) |
| 581 | ASVector.push_back(&*I); |
| 582 | |
| 583 | // Copy all instructions and pointers into a new set, and forward all other |
| 584 | // sets to it. |
| 585 | AliasSets.push_back(new AliasSet()); |
| 586 | AliasAnyAS = &AliasSets.back(); |
| 587 | AliasAnyAS->Alias = AliasSet::SetMayAlias; |
| 588 | AliasAnyAS->Access = AliasSet::ModRefAccess; |
| 589 | AliasAnyAS->AliasAny = true; |
| 590 | |
| 591 | for (auto Cur : ASVector) { |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 592 | // If Cur was already forwarding, just forward to the new AS instead. |
| 593 | AliasSet *FwdTo = Cur->Forward; |
| 594 | if (FwdTo) { |
| 595 | Cur->Forward = AliasAnyAS; |
Alina Sbirlea | a2d30e9 | 2017-12-05 20:12:23 +0000 | [diff] [blame] | 596 | AliasAnyAS->addRef(); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 597 | FwdTo->dropRef(*this); |
| 598 | continue; |
| 599 | } |
| 600 | |
| 601 | // Otherwise, perform the actual merge. |
| 602 | AliasAnyAS->mergeSetIn(*Cur, *this); |
| 603 | } |
| 604 | |
| 605 | return *AliasAnyAS; |
| 606 | } |
| 607 | |
Alina Sbirlea | 6be73e7 | 2018-10-29 22:25:59 +0000 | [diff] [blame] | 608 | AliasSet &AliasSetTracker::addPointer(MemoryLocation Loc, |
Chad Rosier | 6d823ec | 2016-10-19 18:50:32 +0000 | [diff] [blame] | 609 | AliasSet::AccessLattice E) { |
Alina Sbirlea | 6be73e7 | 2018-10-29 22:25:59 +0000 | [diff] [blame] | 610 | AliasSet &AS = getAliasSetFor(Loc); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 611 | AS.Access |= E; |
| 612 | |
| 613 | if (!AliasAnyAS && (TotalMayAliasSetSize > SaturationThreshold)) { |
| 614 | // The AST is now saturated. From here on, we conservatively consider all |
| 615 | // pointers to alias each-other. |
| 616 | return mergeAllAliasSets(); |
| 617 | } |
| 618 | |
| 619 | return AS; |
| 620 | } |
Chris Lattner | 2cffeec | 2003-12-18 08:11:56 +0000 | [diff] [blame] | 621 | |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 622 | //===----------------------------------------------------------------------===// |
| 623 | // AliasSet/AliasSetTracker Printing Support |
| 624 | //===----------------------------------------------------------------------===// |
| 625 | |
Chris Lattner | 791102f | 2009-08-23 05:17:37 +0000 | [diff] [blame] | 626 | void AliasSet::print(raw_ostream &OS) const { |
Roman Divacky | 5932429 | 2012-09-05 22:26:57 +0000 | [diff] [blame] | 627 | OS << " AliasSet[" << (const void*)this << ", " << RefCount << "] "; |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 628 | OS << (Alias == SetMustAlias ? "must" : "may") << " alias, "; |
| 629 | switch (Access) { |
Hal Finkel | 5b601e1 | 2015-10-28 22:13:41 +0000 | [diff] [blame] | 630 | case NoAccess: OS << "No access "; break; |
| 631 | case RefAccess: OS << "Ref "; break; |
| 632 | case ModAccess: OS << "Mod "; break; |
| 633 | case ModRefAccess: OS << "Mod/Ref "; break; |
Chandler Carruth | ab6ddad | 2015-06-22 02:12:52 +0000 | [diff] [blame] | 634 | default: llvm_unreachable("Bad value for Access!"); |
Chris Lattner | 009cc3d | 2002-09-26 21:49:07 +0000 | [diff] [blame] | 635 | } |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 636 | if (Forward) |
| 637 | OS << " forwarding to " << (void*)Forward; |
| 638 | |
Dan Gohman | cb406c2 | 2007-10-03 19:26:29 +0000 | [diff] [blame] | 639 | if (!empty()) { |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 640 | OS << "Pointers: "; |
| 641 | for (iterator I = begin(), E = end(); I != E; ++I) { |
| 642 | if (I != begin()) OS << ", "; |
Chandler Carruth | 560e395 | 2014-01-09 02:29:41 +0000 | [diff] [blame] | 643 | I.getPointer()->printAsOperand(OS << "("); |
George Burgess IV | ea46abe | 2018-10-10 21:28:44 +0000 | [diff] [blame] | 644 | if (I.getSize() == LocationSize::unknown()) |
Philip Reames | c351fea | 2018-08-17 23:17:31 +0000 | [diff] [blame] | 645 | OS << ", unknown)"; |
| 646 | else |
| 647 | OS << ", " << I.getSize() << ")"; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 648 | } |
| 649 | } |
Eli Friedman | 6f3ba37 | 2011-07-27 00:46:46 +0000 | [diff] [blame] | 650 | if (!UnknownInsts.empty()) { |
| 651 | OS << "\n " << UnknownInsts.size() << " Unknown instructions: "; |
| 652 | for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i) { |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 653 | if (i) OS << ", "; |
Jakub Kuderski | bdacec9 | 2018-06-27 16:34:30 +0000 | [diff] [blame] | 654 | if (auto *I = getUnknownInst(i)) { |
| 655 | if (I->hasName()) |
| 656 | I->printAsOperand(OS); |
| 657 | else |
| 658 | I->print(OS); |
| 659 | } |
Misha Brukman | 2b37d7c | 2005-04-21 21:13:18 +0000 | [diff] [blame] | 660 | } |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 661 | } |
| 662 | OS << "\n"; |
| 663 | } |
| 664 | |
Chris Lattner | 791102f | 2009-08-23 05:17:37 +0000 | [diff] [blame] | 665 | void AliasSetTracker::print(raw_ostream &OS) const { |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 666 | OS << "Alias Set Tracker: " << AliasSets.size() << " alias sets for " |
| 667 | << PointerMap.size() << " pointer values.\n"; |
Benjamin Kramer | 8d0d2b6 | 2016-06-26 17:27:42 +0000 | [diff] [blame] | 668 | for (const AliasSet &AS : *this) |
| 669 | AS.print(OS); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 670 | OS << "\n"; |
| 671 | } |
| 672 | |
Aaron Ballman | 1d03d38 | 2017-10-15 14:32:27 +0000 | [diff] [blame] | 673 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
Yaron Keren | 5530798 | 2016-01-29 20:50:44 +0000 | [diff] [blame] | 674 | LLVM_DUMP_METHOD void AliasSet::dump() const { print(dbgs()); } |
| 675 | LLVM_DUMP_METHOD void AliasSetTracker::dump() const { print(dbgs()); } |
Manman Ren | cc77eec | 2012-09-06 19:55:56 +0000 | [diff] [blame] | 676 | #endif |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 677 | |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 678 | //===----------------------------------------------------------------------===// |
Dan Gohman | b5b56ba | 2009-07-30 20:21:41 +0000 | [diff] [blame] | 679 | // ASTCallbackVH Class Implementation |
| 680 | //===----------------------------------------------------------------------===// |
| 681 | |
| 682 | void AliasSetTracker::ASTCallbackVH::deleted() { |
| 683 | assert(AST && "ASTCallbackVH called with a null AliasSetTracker!"); |
| 684 | AST->deleteValue(getValPtr()); |
| 685 | // this now dangles! |
| 686 | } |
| 687 | |
Eli Friedman | 9055ccd | 2011-04-09 06:55:46 +0000 | [diff] [blame] | 688 | void AliasSetTracker::ASTCallbackVH::allUsesReplacedWith(Value *V) { |
| 689 | AST->copyValue(getValPtr(), V); |
| 690 | } |
| 691 | |
Dan Gohman | b5b56ba | 2009-07-30 20:21:41 +0000 | [diff] [blame] | 692 | AliasSetTracker::ASTCallbackVH::ASTCallbackVH(Value *V, AliasSetTracker *ast) |
Dan Gohman | a818c30 | 2009-07-31 18:21:48 +0000 | [diff] [blame] | 693 | : CallbackVH(V), AST(ast) {} |
| 694 | |
| 695 | AliasSetTracker::ASTCallbackVH & |
| 696 | AliasSetTracker::ASTCallbackVH::operator=(Value *V) { |
| 697 | return *this = ASTCallbackVH(V, AST); |
| 698 | } |
Dan Gohman | b5b56ba | 2009-07-30 20:21:41 +0000 | [diff] [blame] | 699 | |
| 700 | //===----------------------------------------------------------------------===// |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 701 | // AliasSetPrinter Pass |
| 702 | //===----------------------------------------------------------------------===// |
| 703 | |
| 704 | namespace { |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 705 | |
Nick Lewycky | 6726b6d | 2009-10-25 06:33:48 +0000 | [diff] [blame] | 706 | class AliasSetPrinter : public FunctionPass { |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 707 | AliasSetTracker *Tracker; |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 708 | |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 709 | public: |
Nick Lewycky | ecd94c8 | 2007-05-06 13:37:16 +0000 | [diff] [blame] | 710 | static char ID; // Pass identification, replacement for typeid |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 711 | |
Owen Anderson | 081c34b | 2010-10-19 17:21:58 +0000 | [diff] [blame] | 712 | AliasSetPrinter() : FunctionPass(ID) { |
| 713 | initializeAliasSetPrinterPass(*PassRegistry::getPassRegistry()); |
| 714 | } |
Devang Patel | 794fd75 | 2007-05-01 21:15:47 +0000 | [diff] [blame] | 715 | |
Craig Topper | c37e6c0 | 2014-03-05 07:30:04 +0000 | [diff] [blame] | 716 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 717 | AU.setPreservesAll(); |
Chandler Carruth | 9146833 | 2015-09-09 17:55:00 +0000 | [diff] [blame] | 718 | AU.addRequired<AAResultsWrapperPass>(); |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 719 | } |
| 720 | |
Craig Topper | c37e6c0 | 2014-03-05 07:30:04 +0000 | [diff] [blame] | 721 | bool runOnFunction(Function &F) override { |
Chandler Carruth | 9146833 | 2015-09-09 17:55:00 +0000 | [diff] [blame] | 722 | auto &AAWP = getAnalysis<AAResultsWrapperPass>(); |
| 723 | Tracker = new AliasSetTracker(AAWP.getAAResults()); |
Michael Kuperstein | 15095e4 | 2016-08-19 17:05:22 +0000 | [diff] [blame] | 724 | errs() << "Alias sets for function '" << F.getName() << "':\n"; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 725 | for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) |
Chris Lattner | 6ffe551 | 2004-04-27 15:13:33 +0000 | [diff] [blame] | 726 | Tracker->add(&*I); |
David Greene | 4850a89 | 2009-12-23 22:49:57 +0000 | [diff] [blame] | 727 | Tracker->print(errs()); |
Chris Lattner | 4983cf7 | 2006-01-03 06:05:22 +0000 | [diff] [blame] | 728 | delete Tracker; |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 729 | return false; |
| 730 | } |
Chris Lattner | 9971ac4 | 2003-02-24 20:37:56 +0000 | [diff] [blame] | 731 | }; |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 732 | |
| 733 | } // end anonymous namespace |
Dan Gohman | 844731a | 2008-05-13 00:00:25 +0000 | [diff] [blame] | 734 | |
| 735 | char AliasSetPrinter::ID = 0; |
Eugene Zelenko | 4114bcf | 2017-07-24 23:16:33 +0000 | [diff] [blame] | 736 | |
Owen Anderson | 2ab36d3 | 2010-10-12 19:48:12 +0000 | [diff] [blame] | 737 | INITIALIZE_PASS_BEGIN(AliasSetPrinter, "print-alias-sets", |
| 738 | "Alias Set Printer", false, true) |
Chandler Carruth | 9146833 | 2015-09-09 17:55:00 +0000 | [diff] [blame] | 739 | INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) |
Owen Anderson | 2ab36d3 | 2010-10-12 19:48:12 +0000 | [diff] [blame] | 740 | INITIALIZE_PASS_END(AliasSetPrinter, "print-alias-sets", |
Owen Anderson | ce665bd | 2010-10-07 22:25:06 +0000 | [diff] [blame] | 741 | "Alias Set Printer", false, true) |