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