| File: | src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ADT/SmallBitVector.h |
| Warning: | line 376, column 51 The result of the left shift is undefined due to shifting by '4294967295', which is greater or equal to the width of type 'uintptr_t' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | //===-- DependenceAnalysis.cpp - DA Implementation --------------*- C++ -*-===// | ||||||||||||||||||||
| 2 | // | ||||||||||||||||||||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||||||||||||||||||||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | ||||||||||||||||||||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||||||||||||||||||
| 6 | // | ||||||||||||||||||||
| 7 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 8 | // | ||||||||||||||||||||
| 9 | // DependenceAnalysis is an LLVM pass that analyses dependences between memory | ||||||||||||||||||||
| 10 | // accesses. Currently, it is an (incomplete) implementation of the approach | ||||||||||||||||||||
| 11 | // described in | ||||||||||||||||||||
| 12 | // | ||||||||||||||||||||
| 13 | // Practical Dependence Testing | ||||||||||||||||||||
| 14 | // Goff, Kennedy, Tseng | ||||||||||||||||||||
| 15 | // PLDI 1991 | ||||||||||||||||||||
| 16 | // | ||||||||||||||||||||
| 17 | // There's a single entry point that analyzes the dependence between a pair | ||||||||||||||||||||
| 18 | // of memory references in a function, returning either NULL, for no dependence, | ||||||||||||||||||||
| 19 | // or a more-or-less detailed description of the dependence between them. | ||||||||||||||||||||
| 20 | // | ||||||||||||||||||||
| 21 | // Currently, the implementation cannot propagate constraints between | ||||||||||||||||||||
| 22 | // coupled RDIV subscripts and lacks a multi-subscript MIV test. | ||||||||||||||||||||
| 23 | // Both of these are conservative weaknesses; | ||||||||||||||||||||
| 24 | // that is, not a source of correctness problems. | ||||||||||||||||||||
| 25 | // | ||||||||||||||||||||
| 26 | // Since Clang linearizes some array subscripts, the dependence | ||||||||||||||||||||
| 27 | // analysis is using SCEV->delinearize to recover the representation of multiple | ||||||||||||||||||||
| 28 | // subscripts, and thus avoid the more expensive and less precise MIV tests. The | ||||||||||||||||||||
| 29 | // delinearization is controlled by the flag -da-delinearize. | ||||||||||||||||||||
| 30 | // | ||||||||||||||||||||
| 31 | // We should pay some careful attention to the possibility of integer overflow | ||||||||||||||||||||
| 32 | // in the implementation of the various tests. This could happen with Add, | ||||||||||||||||||||
| 33 | // Subtract, or Multiply, with both APInt's and SCEV's. | ||||||||||||||||||||
| 34 | // | ||||||||||||||||||||
| 35 | // Some non-linear subscript pairs can be handled by the GCD test | ||||||||||||||||||||
| 36 | // (and perhaps other tests). | ||||||||||||||||||||
| 37 | // Should explore how often these things occur. | ||||||||||||||||||||
| 38 | // | ||||||||||||||||||||
| 39 | // Finally, it seems like certain test cases expose weaknesses in the SCEV | ||||||||||||||||||||
| 40 | // simplification, especially in the handling of sign and zero extensions. | ||||||||||||||||||||
| 41 | // It could be useful to spend time exploring these. | ||||||||||||||||||||
| 42 | // | ||||||||||||||||||||
| 43 | // Please note that this is work in progress and the interface is subject to | ||||||||||||||||||||
| 44 | // change. | ||||||||||||||||||||
| 45 | // | ||||||||||||||||||||
| 46 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 47 | // // | ||||||||||||||||||||
| 48 | // In memory of Ken Kennedy, 1945 - 2007 // | ||||||||||||||||||||
| 49 | // // | ||||||||||||||||||||
| 50 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 51 | |||||||||||||||||||||
| 52 | #include "llvm/Analysis/DependenceAnalysis.h" | ||||||||||||||||||||
| 53 | #include "llvm/ADT/STLExtras.h" | ||||||||||||||||||||
| 54 | #include "llvm/ADT/Statistic.h" | ||||||||||||||||||||
| 55 | #include "llvm/Analysis/AliasAnalysis.h" | ||||||||||||||||||||
| 56 | #include "llvm/Analysis/LoopInfo.h" | ||||||||||||||||||||
| 57 | #include "llvm/Analysis/ScalarEvolution.h" | ||||||||||||||||||||
| 58 | #include "llvm/Analysis/ScalarEvolutionExpressions.h" | ||||||||||||||||||||
| 59 | #include "llvm/Analysis/ValueTracking.h" | ||||||||||||||||||||
| 60 | #include "llvm/Config/llvm-config.h" | ||||||||||||||||||||
| 61 | #include "llvm/IR/InstIterator.h" | ||||||||||||||||||||
| 62 | #include "llvm/IR/Module.h" | ||||||||||||||||||||
| 63 | #include "llvm/IR/Operator.h" | ||||||||||||||||||||
| 64 | #include "llvm/InitializePasses.h" | ||||||||||||||||||||
| 65 | #include "llvm/Support/CommandLine.h" | ||||||||||||||||||||
| 66 | #include "llvm/Support/Debug.h" | ||||||||||||||||||||
| 67 | #include "llvm/Support/ErrorHandling.h" | ||||||||||||||||||||
| 68 | #include "llvm/Support/raw_ostream.h" | ||||||||||||||||||||
| 69 | |||||||||||||||||||||
| 70 | using namespace llvm; | ||||||||||||||||||||
| 71 | |||||||||||||||||||||
| 72 | #define DEBUG_TYPE"da" "da" | ||||||||||||||||||||
| 73 | |||||||||||||||||||||
| 74 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 75 | // statistics | ||||||||||||||||||||
| 76 | |||||||||||||||||||||
| 77 | STATISTIC(TotalArrayPairs, "Array pairs tested")static llvm::Statistic TotalArrayPairs = {"da", "TotalArrayPairs" , "Array pairs tested"}; | ||||||||||||||||||||
| 78 | STATISTIC(SeparableSubscriptPairs, "Separable subscript pairs")static llvm::Statistic SeparableSubscriptPairs = {"da", "SeparableSubscriptPairs" , "Separable subscript pairs"}; | ||||||||||||||||||||
| 79 | STATISTIC(CoupledSubscriptPairs, "Coupled subscript pairs")static llvm::Statistic CoupledSubscriptPairs = {"da", "CoupledSubscriptPairs" , "Coupled subscript pairs"}; | ||||||||||||||||||||
| 80 | STATISTIC(NonlinearSubscriptPairs, "Nonlinear subscript pairs")static llvm::Statistic NonlinearSubscriptPairs = {"da", "NonlinearSubscriptPairs" , "Nonlinear subscript pairs"}; | ||||||||||||||||||||
| 81 | STATISTIC(ZIVapplications, "ZIV applications")static llvm::Statistic ZIVapplications = {"da", "ZIVapplications" , "ZIV applications"}; | ||||||||||||||||||||
| 82 | STATISTIC(ZIVindependence, "ZIV independence")static llvm::Statistic ZIVindependence = {"da", "ZIVindependence" , "ZIV independence"}; | ||||||||||||||||||||
| 83 | STATISTIC(StrongSIVapplications, "Strong SIV applications")static llvm::Statistic StrongSIVapplications = {"da", "StrongSIVapplications" , "Strong SIV applications"}; | ||||||||||||||||||||
| 84 | STATISTIC(StrongSIVsuccesses, "Strong SIV successes")static llvm::Statistic StrongSIVsuccesses = {"da", "StrongSIVsuccesses" , "Strong SIV successes"}; | ||||||||||||||||||||
| 85 | STATISTIC(StrongSIVindependence, "Strong SIV independence")static llvm::Statistic StrongSIVindependence = {"da", "StrongSIVindependence" , "Strong SIV independence"}; | ||||||||||||||||||||
| 86 | STATISTIC(WeakCrossingSIVapplications, "Weak-Crossing SIV applications")static llvm::Statistic WeakCrossingSIVapplications = {"da", "WeakCrossingSIVapplications" , "Weak-Crossing SIV applications"}; | ||||||||||||||||||||
| 87 | STATISTIC(WeakCrossingSIVsuccesses, "Weak-Crossing SIV successes")static llvm::Statistic WeakCrossingSIVsuccesses = {"da", "WeakCrossingSIVsuccesses" , "Weak-Crossing SIV successes"}; | ||||||||||||||||||||
| 88 | STATISTIC(WeakCrossingSIVindependence, "Weak-Crossing SIV independence")static llvm::Statistic WeakCrossingSIVindependence = {"da", "WeakCrossingSIVindependence" , "Weak-Crossing SIV independence"}; | ||||||||||||||||||||
| 89 | STATISTIC(ExactSIVapplications, "Exact SIV applications")static llvm::Statistic ExactSIVapplications = {"da", "ExactSIVapplications" , "Exact SIV applications"}; | ||||||||||||||||||||
| 90 | STATISTIC(ExactSIVsuccesses, "Exact SIV successes")static llvm::Statistic ExactSIVsuccesses = {"da", "ExactSIVsuccesses" , "Exact SIV successes"}; | ||||||||||||||||||||
| 91 | STATISTIC(ExactSIVindependence, "Exact SIV independence")static llvm::Statistic ExactSIVindependence = {"da", "ExactSIVindependence" , "Exact SIV independence"}; | ||||||||||||||||||||
| 92 | STATISTIC(WeakZeroSIVapplications, "Weak-Zero SIV applications")static llvm::Statistic WeakZeroSIVapplications = {"da", "WeakZeroSIVapplications" , "Weak-Zero SIV applications"}; | ||||||||||||||||||||
| 93 | STATISTIC(WeakZeroSIVsuccesses, "Weak-Zero SIV successes")static llvm::Statistic WeakZeroSIVsuccesses = {"da", "WeakZeroSIVsuccesses" , "Weak-Zero SIV successes"}; | ||||||||||||||||||||
| 94 | STATISTIC(WeakZeroSIVindependence, "Weak-Zero SIV independence")static llvm::Statistic WeakZeroSIVindependence = {"da", "WeakZeroSIVindependence" , "Weak-Zero SIV independence"}; | ||||||||||||||||||||
| 95 | STATISTIC(ExactRDIVapplications, "Exact RDIV applications")static llvm::Statistic ExactRDIVapplications = {"da", "ExactRDIVapplications" , "Exact RDIV applications"}; | ||||||||||||||||||||
| 96 | STATISTIC(ExactRDIVindependence, "Exact RDIV independence")static llvm::Statistic ExactRDIVindependence = {"da", "ExactRDIVindependence" , "Exact RDIV independence"}; | ||||||||||||||||||||
| 97 | STATISTIC(SymbolicRDIVapplications, "Symbolic RDIV applications")static llvm::Statistic SymbolicRDIVapplications = {"da", "SymbolicRDIVapplications" , "Symbolic RDIV applications"}; | ||||||||||||||||||||
| 98 | STATISTIC(SymbolicRDIVindependence, "Symbolic RDIV independence")static llvm::Statistic SymbolicRDIVindependence = {"da", "SymbolicRDIVindependence" , "Symbolic RDIV independence"}; | ||||||||||||||||||||
| 99 | STATISTIC(DeltaApplications, "Delta applications")static llvm::Statistic DeltaApplications = {"da", "DeltaApplications" , "Delta applications"}; | ||||||||||||||||||||
| 100 | STATISTIC(DeltaSuccesses, "Delta successes")static llvm::Statistic DeltaSuccesses = {"da", "DeltaSuccesses" , "Delta successes"}; | ||||||||||||||||||||
| 101 | STATISTIC(DeltaIndependence, "Delta independence")static llvm::Statistic DeltaIndependence = {"da", "DeltaIndependence" , "Delta independence"}; | ||||||||||||||||||||
| 102 | STATISTIC(DeltaPropagations, "Delta propagations")static llvm::Statistic DeltaPropagations = {"da", "DeltaPropagations" , "Delta propagations"}; | ||||||||||||||||||||
| 103 | STATISTIC(GCDapplications, "GCD applications")static llvm::Statistic GCDapplications = {"da", "GCDapplications" , "GCD applications"}; | ||||||||||||||||||||
| 104 | STATISTIC(GCDsuccesses, "GCD successes")static llvm::Statistic GCDsuccesses = {"da", "GCDsuccesses", "GCD successes" }; | ||||||||||||||||||||
| 105 | STATISTIC(GCDindependence, "GCD independence")static llvm::Statistic GCDindependence = {"da", "GCDindependence" , "GCD independence"}; | ||||||||||||||||||||
| 106 | STATISTIC(BanerjeeApplications, "Banerjee applications")static llvm::Statistic BanerjeeApplications = {"da", "BanerjeeApplications" , "Banerjee applications"}; | ||||||||||||||||||||
| 107 | STATISTIC(BanerjeeIndependence, "Banerjee independence")static llvm::Statistic BanerjeeIndependence = {"da", "BanerjeeIndependence" , "Banerjee independence"}; | ||||||||||||||||||||
| 108 | STATISTIC(BanerjeeSuccesses, "Banerjee successes")static llvm::Statistic BanerjeeSuccesses = {"da", "BanerjeeSuccesses" , "Banerjee successes"}; | ||||||||||||||||||||
| 109 | |||||||||||||||||||||
| 110 | static cl::opt<bool> | ||||||||||||||||||||
| 111 | Delinearize("da-delinearize", cl::init(true), cl::Hidden, cl::ZeroOrMore, | ||||||||||||||||||||
| 112 | cl::desc("Try to delinearize array references.")); | ||||||||||||||||||||
| 113 | static cl::opt<bool> DisableDelinearizationChecks( | ||||||||||||||||||||
| 114 | "da-disable-delinearization-checks", cl::init(false), cl::Hidden, | ||||||||||||||||||||
| 115 | cl::ZeroOrMore, | ||||||||||||||||||||
| 116 | cl::desc( | ||||||||||||||||||||
| 117 | "Disable checks that try to statically verify validity of " | ||||||||||||||||||||
| 118 | "delinearized subscripts. Enabling this option may result in incorrect " | ||||||||||||||||||||
| 119 | "dependence vectors for languages that allow the subscript of one " | ||||||||||||||||||||
| 120 | "dimension to underflow or overflow into another dimension.")); | ||||||||||||||||||||
| 121 | |||||||||||||||||||||
| 122 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 123 | // basics | ||||||||||||||||||||
| 124 | |||||||||||||||||||||
| 125 | DependenceAnalysis::Result | ||||||||||||||||||||
| 126 | DependenceAnalysis::run(Function &F, FunctionAnalysisManager &FAM) { | ||||||||||||||||||||
| 127 | auto &AA = FAM.getResult<AAManager>(F); | ||||||||||||||||||||
| 128 | auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F); | ||||||||||||||||||||
| 129 | auto &LI = FAM.getResult<LoopAnalysis>(F); | ||||||||||||||||||||
| 130 | return DependenceInfo(&F, &AA, &SE, &LI); | ||||||||||||||||||||
| 131 | } | ||||||||||||||||||||
| 132 | |||||||||||||||||||||
| 133 | AnalysisKey DependenceAnalysis::Key; | ||||||||||||||||||||
| 134 | |||||||||||||||||||||
| 135 | INITIALIZE_PASS_BEGIN(DependenceAnalysisWrapperPass, "da",static void *initializeDependenceAnalysisWrapperPassPassOnce( PassRegistry &Registry) { | ||||||||||||||||||||
| 136 | "Dependence Analysis", true, true)static void *initializeDependenceAnalysisWrapperPassPassOnce( PassRegistry &Registry) { | ||||||||||||||||||||
| 137 | INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)initializeLoopInfoWrapperPassPass(Registry); | ||||||||||||||||||||
| 138 | INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)initializeScalarEvolutionWrapperPassPass(Registry); | ||||||||||||||||||||
| 139 | INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)initializeAAResultsWrapperPassPass(Registry); | ||||||||||||||||||||
| 140 | INITIALIZE_PASS_END(DependenceAnalysisWrapperPass, "da", "Dependence Analysis",PassInfo *PI = new PassInfo( "Dependence Analysis", "da", & DependenceAnalysisWrapperPass::ID, PassInfo::NormalCtor_t(callDefaultCtor <DependenceAnalysisWrapperPass>), true, true); Registry .registerPass(*PI, true); return PI; } static llvm::once_flag InitializeDependenceAnalysisWrapperPassPassFlag; void llvm:: initializeDependenceAnalysisWrapperPassPass(PassRegistry & Registry) { llvm::call_once(InitializeDependenceAnalysisWrapperPassPassFlag , initializeDependenceAnalysisWrapperPassPassOnce, std::ref(Registry )); } | ||||||||||||||||||||
| 141 | true, true)PassInfo *PI = new PassInfo( "Dependence Analysis", "da", & DependenceAnalysisWrapperPass::ID, PassInfo::NormalCtor_t(callDefaultCtor <DependenceAnalysisWrapperPass>), true, true); Registry .registerPass(*PI, true); return PI; } static llvm::once_flag InitializeDependenceAnalysisWrapperPassPassFlag; void llvm:: initializeDependenceAnalysisWrapperPassPass(PassRegistry & Registry) { llvm::call_once(InitializeDependenceAnalysisWrapperPassPassFlag , initializeDependenceAnalysisWrapperPassPassOnce, std::ref(Registry )); } | ||||||||||||||||||||
| 142 | |||||||||||||||||||||
| 143 | char DependenceAnalysisWrapperPass::ID = 0; | ||||||||||||||||||||
| 144 | |||||||||||||||||||||
| 145 | DependenceAnalysisWrapperPass::DependenceAnalysisWrapperPass() | ||||||||||||||||||||
| 146 | : FunctionPass(ID) { | ||||||||||||||||||||
| 147 | initializeDependenceAnalysisWrapperPassPass(*PassRegistry::getPassRegistry()); | ||||||||||||||||||||
| 148 | } | ||||||||||||||||||||
| 149 | |||||||||||||||||||||
| 150 | FunctionPass *llvm::createDependenceAnalysisWrapperPass() { | ||||||||||||||||||||
| 151 | return new DependenceAnalysisWrapperPass(); | ||||||||||||||||||||
| 152 | } | ||||||||||||||||||||
| 153 | |||||||||||||||||||||
| 154 | bool DependenceAnalysisWrapperPass::runOnFunction(Function &F) { | ||||||||||||||||||||
| 155 | auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); | ||||||||||||||||||||
| 156 | auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE(); | ||||||||||||||||||||
| 157 | auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); | ||||||||||||||||||||
| 158 | info.reset(new DependenceInfo(&F, &AA, &SE, &LI)); | ||||||||||||||||||||
| 159 | return false; | ||||||||||||||||||||
| 160 | } | ||||||||||||||||||||
| 161 | |||||||||||||||||||||
| 162 | DependenceInfo &DependenceAnalysisWrapperPass::getDI() const { return *info; } | ||||||||||||||||||||
| 163 | |||||||||||||||||||||
| 164 | void DependenceAnalysisWrapperPass::releaseMemory() { info.reset(); } | ||||||||||||||||||||
| 165 | |||||||||||||||||||||
| 166 | void DependenceAnalysisWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { | ||||||||||||||||||||
| 167 | AU.setPreservesAll(); | ||||||||||||||||||||
| 168 | AU.addRequiredTransitive<AAResultsWrapperPass>(); | ||||||||||||||||||||
| 169 | AU.addRequiredTransitive<ScalarEvolutionWrapperPass>(); | ||||||||||||||||||||
| 170 | AU.addRequiredTransitive<LoopInfoWrapperPass>(); | ||||||||||||||||||||
| 171 | } | ||||||||||||||||||||
| 172 | |||||||||||||||||||||
| 173 | // Used to test the dependence analyzer. | ||||||||||||||||||||
| 174 | // Looks through the function, noting instructions that may access memory. | ||||||||||||||||||||
| 175 | // Calls depends() on every possible pair and prints out the result. | ||||||||||||||||||||
| 176 | // Ignores all other instructions. | ||||||||||||||||||||
| 177 | static void dumpExampleDependence(raw_ostream &OS, DependenceInfo *DA) { | ||||||||||||||||||||
| 178 | auto *F = DA->getFunction(); | ||||||||||||||||||||
| 179 | for (inst_iterator SrcI = inst_begin(F), SrcE = inst_end(F); SrcI != SrcE; | ||||||||||||||||||||
| 180 | ++SrcI) { | ||||||||||||||||||||
| 181 | if (SrcI->mayReadOrWriteMemory()) { | ||||||||||||||||||||
| 182 | for (inst_iterator DstI = SrcI, DstE = inst_end(F); | ||||||||||||||||||||
| 183 | DstI != DstE; ++DstI) { | ||||||||||||||||||||
| 184 | if (DstI->mayReadOrWriteMemory()) { | ||||||||||||||||||||
| 185 | OS << "Src:" << *SrcI << " --> Dst:" << *DstI << "\n"; | ||||||||||||||||||||
| 186 | OS << " da analyze - "; | ||||||||||||||||||||
| 187 | if (auto D = DA->depends(&*SrcI, &*DstI, true)) { | ||||||||||||||||||||
| 188 | D->dump(OS); | ||||||||||||||||||||
| 189 | for (unsigned Level = 1; Level <= D->getLevels(); Level++) { | ||||||||||||||||||||
| 190 | if (D->isSplitable(Level)) { | ||||||||||||||||||||
| 191 | OS << " da analyze - split level = " << Level; | ||||||||||||||||||||
| 192 | OS << ", iteration = " << *DA->getSplitIteration(*D, Level); | ||||||||||||||||||||
| 193 | OS << "!\n"; | ||||||||||||||||||||
| 194 | } | ||||||||||||||||||||
| 195 | } | ||||||||||||||||||||
| 196 | } | ||||||||||||||||||||
| 197 | else | ||||||||||||||||||||
| 198 | OS << "none!\n"; | ||||||||||||||||||||
| 199 | } | ||||||||||||||||||||
| 200 | } | ||||||||||||||||||||
| 201 | } | ||||||||||||||||||||
| 202 | } | ||||||||||||||||||||
| 203 | } | ||||||||||||||||||||
| 204 | |||||||||||||||||||||
| 205 | void DependenceAnalysisWrapperPass::print(raw_ostream &OS, | ||||||||||||||||||||
| 206 | const Module *) const { | ||||||||||||||||||||
| 207 | dumpExampleDependence(OS, info.get()); | ||||||||||||||||||||
| 208 | } | ||||||||||||||||||||
| 209 | |||||||||||||||||||||
| 210 | PreservedAnalyses | ||||||||||||||||||||
| 211 | DependenceAnalysisPrinterPass::run(Function &F, FunctionAnalysisManager &FAM) { | ||||||||||||||||||||
| 212 | OS << "'Dependence Analysis' for function '" << F.getName() << "':\n"; | ||||||||||||||||||||
| 213 | dumpExampleDependence(OS, &FAM.getResult<DependenceAnalysis>(F)); | ||||||||||||||||||||
| 214 | return PreservedAnalyses::all(); | ||||||||||||||||||||
| 215 | } | ||||||||||||||||||||
| 216 | |||||||||||||||||||||
| 217 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 218 | // Dependence methods | ||||||||||||||||||||
| 219 | |||||||||||||||||||||
| 220 | // Returns true if this is an input dependence. | ||||||||||||||||||||
| 221 | bool Dependence::isInput() const { | ||||||||||||||||||||
| 222 | return Src->mayReadFromMemory() && Dst->mayReadFromMemory(); | ||||||||||||||||||||
| 223 | } | ||||||||||||||||||||
| 224 | |||||||||||||||||||||
| 225 | |||||||||||||||||||||
| 226 | // Returns true if this is an output dependence. | ||||||||||||||||||||
| 227 | bool Dependence::isOutput() const { | ||||||||||||||||||||
| 228 | return Src->mayWriteToMemory() && Dst->mayWriteToMemory(); | ||||||||||||||||||||
| 229 | } | ||||||||||||||||||||
| 230 | |||||||||||||||||||||
| 231 | |||||||||||||||||||||
| 232 | // Returns true if this is an flow (aka true) dependence. | ||||||||||||||||||||
| 233 | bool Dependence::isFlow() const { | ||||||||||||||||||||
| 234 | return Src->mayWriteToMemory() && Dst->mayReadFromMemory(); | ||||||||||||||||||||
| 235 | } | ||||||||||||||||||||
| 236 | |||||||||||||||||||||
| 237 | |||||||||||||||||||||
| 238 | // Returns true if this is an anti dependence. | ||||||||||||||||||||
| 239 | bool Dependence::isAnti() const { | ||||||||||||||||||||
| 240 | return Src->mayReadFromMemory() && Dst->mayWriteToMemory(); | ||||||||||||||||||||
| 241 | } | ||||||||||||||||||||
| 242 | |||||||||||||||||||||
| 243 | |||||||||||||||||||||
| 244 | // Returns true if a particular level is scalar; that is, | ||||||||||||||||||||
| 245 | // if no subscript in the source or destination mention the induction | ||||||||||||||||||||
| 246 | // variable associated with the loop at this level. | ||||||||||||||||||||
| 247 | // Leave this out of line, so it will serve as a virtual method anchor | ||||||||||||||||||||
| 248 | bool Dependence::isScalar(unsigned level) const { | ||||||||||||||||||||
| 249 | return false; | ||||||||||||||||||||
| 250 | } | ||||||||||||||||||||
| 251 | |||||||||||||||||||||
| 252 | |||||||||||||||||||||
| 253 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 254 | // FullDependence methods | ||||||||||||||||||||
| 255 | |||||||||||||||||||||
| 256 | FullDependence::FullDependence(Instruction *Source, Instruction *Destination, | ||||||||||||||||||||
| 257 | bool PossiblyLoopIndependent, | ||||||||||||||||||||
| 258 | unsigned CommonLevels) | ||||||||||||||||||||
| 259 | : Dependence(Source, Destination), Levels(CommonLevels), | ||||||||||||||||||||
| 260 | LoopIndependent(PossiblyLoopIndependent) { | ||||||||||||||||||||
| 261 | Consistent = true; | ||||||||||||||||||||
| 262 | if (CommonLevels) | ||||||||||||||||||||
| 263 | DV = std::make_unique<DVEntry[]>(CommonLevels); | ||||||||||||||||||||
| 264 | } | ||||||||||||||||||||
| 265 | |||||||||||||||||||||
| 266 | // The rest are simple getters that hide the implementation. | ||||||||||||||||||||
| 267 | |||||||||||||||||||||
| 268 | // getDirection - Returns the direction associated with a particular level. | ||||||||||||||||||||
| 269 | unsigned FullDependence::getDirection(unsigned Level) const { | ||||||||||||||||||||
| 270 | assert(0 < Level && Level <= Levels && "Level out of range")((void)0); | ||||||||||||||||||||
| 271 | return DV[Level - 1].Direction; | ||||||||||||||||||||
| 272 | } | ||||||||||||||||||||
| 273 | |||||||||||||||||||||
| 274 | |||||||||||||||||||||
| 275 | // Returns the distance (or NULL) associated with a particular level. | ||||||||||||||||||||
| 276 | const SCEV *FullDependence::getDistance(unsigned Level) const { | ||||||||||||||||||||
| 277 | assert(0 < Level && Level <= Levels && "Level out of range")((void)0); | ||||||||||||||||||||
| 278 | return DV[Level - 1].Distance; | ||||||||||||||||||||
| 279 | } | ||||||||||||||||||||
| 280 | |||||||||||||||||||||
| 281 | |||||||||||||||||||||
| 282 | // Returns true if a particular level is scalar; that is, | ||||||||||||||||||||
| 283 | // if no subscript in the source or destination mention the induction | ||||||||||||||||||||
| 284 | // variable associated with the loop at this level. | ||||||||||||||||||||
| 285 | bool FullDependence::isScalar(unsigned Level) const { | ||||||||||||||||||||
| 286 | assert(0 < Level && Level <= Levels && "Level out of range")((void)0); | ||||||||||||||||||||
| 287 | return DV[Level - 1].Scalar; | ||||||||||||||||||||
| 288 | } | ||||||||||||||||||||
| 289 | |||||||||||||||||||||
| 290 | |||||||||||||||||||||
| 291 | // Returns true if peeling the first iteration from this loop | ||||||||||||||||||||
| 292 | // will break this dependence. | ||||||||||||||||||||
| 293 | bool FullDependence::isPeelFirst(unsigned Level) const { | ||||||||||||||||||||
| 294 | assert(0 < Level && Level <= Levels && "Level out of range")((void)0); | ||||||||||||||||||||
| 295 | return DV[Level - 1].PeelFirst; | ||||||||||||||||||||
| 296 | } | ||||||||||||||||||||
| 297 | |||||||||||||||||||||
| 298 | |||||||||||||||||||||
| 299 | // Returns true if peeling the last iteration from this loop | ||||||||||||||||||||
| 300 | // will break this dependence. | ||||||||||||||||||||
| 301 | bool FullDependence::isPeelLast(unsigned Level) const { | ||||||||||||||||||||
| 302 | assert(0 < Level && Level <= Levels && "Level out of range")((void)0); | ||||||||||||||||||||
| 303 | return DV[Level - 1].PeelLast; | ||||||||||||||||||||
| 304 | } | ||||||||||||||||||||
| 305 | |||||||||||||||||||||
| 306 | |||||||||||||||||||||
| 307 | // Returns true if splitting this loop will break the dependence. | ||||||||||||||||||||
| 308 | bool FullDependence::isSplitable(unsigned Level) const { | ||||||||||||||||||||
| 309 | assert(0 < Level && Level <= Levels && "Level out of range")((void)0); | ||||||||||||||||||||
| 310 | return DV[Level - 1].Splitable; | ||||||||||||||||||||
| 311 | } | ||||||||||||||||||||
| 312 | |||||||||||||||||||||
| 313 | |||||||||||||||||||||
| 314 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 315 | // DependenceInfo::Constraint methods | ||||||||||||||||||||
| 316 | |||||||||||||||||||||
| 317 | // If constraint is a point <X, Y>, returns X. | ||||||||||||||||||||
| 318 | // Otherwise assert. | ||||||||||||||||||||
| 319 | const SCEV *DependenceInfo::Constraint::getX() const { | ||||||||||||||||||||
| 320 | assert(Kind == Point && "Kind should be Point")((void)0); | ||||||||||||||||||||
| 321 | return A; | ||||||||||||||||||||
| 322 | } | ||||||||||||||||||||
| 323 | |||||||||||||||||||||
| 324 | |||||||||||||||||||||
| 325 | // If constraint is a point <X, Y>, returns Y. | ||||||||||||||||||||
| 326 | // Otherwise assert. | ||||||||||||||||||||
| 327 | const SCEV *DependenceInfo::Constraint::getY() const { | ||||||||||||||||||||
| 328 | assert(Kind == Point && "Kind should be Point")((void)0); | ||||||||||||||||||||
| 329 | return B; | ||||||||||||||||||||
| 330 | } | ||||||||||||||||||||
| 331 | |||||||||||||||||||||
| 332 | |||||||||||||||||||||
| 333 | // If constraint is a line AX + BY = C, returns A. | ||||||||||||||||||||
| 334 | // Otherwise assert. | ||||||||||||||||||||
| 335 | const SCEV *DependenceInfo::Constraint::getA() const { | ||||||||||||||||||||
| 336 | assert((Kind == Line || Kind == Distance) &&((void)0) | ||||||||||||||||||||
| 337 | "Kind should be Line (or Distance)")((void)0); | ||||||||||||||||||||
| 338 | return A; | ||||||||||||||||||||
| 339 | } | ||||||||||||||||||||
| 340 | |||||||||||||||||||||
| 341 | |||||||||||||||||||||
| 342 | // If constraint is a line AX + BY = C, returns B. | ||||||||||||||||||||
| 343 | // Otherwise assert. | ||||||||||||||||||||
| 344 | const SCEV *DependenceInfo::Constraint::getB() const { | ||||||||||||||||||||
| 345 | assert((Kind == Line || Kind == Distance) &&((void)0) | ||||||||||||||||||||
| 346 | "Kind should be Line (or Distance)")((void)0); | ||||||||||||||||||||
| 347 | return B; | ||||||||||||||||||||
| 348 | } | ||||||||||||||||||||
| 349 | |||||||||||||||||||||
| 350 | |||||||||||||||||||||
| 351 | // If constraint is a line AX + BY = C, returns C. | ||||||||||||||||||||
| 352 | // Otherwise assert. | ||||||||||||||||||||
| 353 | const SCEV *DependenceInfo::Constraint::getC() const { | ||||||||||||||||||||
| 354 | assert((Kind == Line || Kind == Distance) &&((void)0) | ||||||||||||||||||||
| 355 | "Kind should be Line (or Distance)")((void)0); | ||||||||||||||||||||
| 356 | return C; | ||||||||||||||||||||
| 357 | } | ||||||||||||||||||||
| 358 | |||||||||||||||||||||
| 359 | |||||||||||||||||||||
| 360 | // If constraint is a distance, returns D. | ||||||||||||||||||||
| 361 | // Otherwise assert. | ||||||||||||||||||||
| 362 | const SCEV *DependenceInfo::Constraint::getD() const { | ||||||||||||||||||||
| 363 | assert(Kind == Distance && "Kind should be Distance")((void)0); | ||||||||||||||||||||
| 364 | return SE->getNegativeSCEV(C); | ||||||||||||||||||||
| 365 | } | ||||||||||||||||||||
| 366 | |||||||||||||||||||||
| 367 | |||||||||||||||||||||
| 368 | // Returns the loop associated with this constraint. | ||||||||||||||||||||
| 369 | const Loop *DependenceInfo::Constraint::getAssociatedLoop() const { | ||||||||||||||||||||
| 370 | assert((Kind == Distance || Kind == Line || Kind == Point) &&((void)0) | ||||||||||||||||||||
| 371 | "Kind should be Distance, Line, or Point")((void)0); | ||||||||||||||||||||
| 372 | return AssociatedLoop; | ||||||||||||||||||||
| 373 | } | ||||||||||||||||||||
| 374 | |||||||||||||||||||||
| 375 | void DependenceInfo::Constraint::setPoint(const SCEV *X, const SCEV *Y, | ||||||||||||||||||||
| 376 | const Loop *CurLoop) { | ||||||||||||||||||||
| 377 | Kind = Point; | ||||||||||||||||||||
| 378 | A = X; | ||||||||||||||||||||
| 379 | B = Y; | ||||||||||||||||||||
| 380 | AssociatedLoop = CurLoop; | ||||||||||||||||||||
| 381 | } | ||||||||||||||||||||
| 382 | |||||||||||||||||||||
| 383 | void DependenceInfo::Constraint::setLine(const SCEV *AA, const SCEV *BB, | ||||||||||||||||||||
| 384 | const SCEV *CC, const Loop *CurLoop) { | ||||||||||||||||||||
| 385 | Kind = Line; | ||||||||||||||||||||
| 386 | A = AA; | ||||||||||||||||||||
| 387 | B = BB; | ||||||||||||||||||||
| 388 | C = CC; | ||||||||||||||||||||
| 389 | AssociatedLoop = CurLoop; | ||||||||||||||||||||
| 390 | } | ||||||||||||||||||||
| 391 | |||||||||||||||||||||
| 392 | void DependenceInfo::Constraint::setDistance(const SCEV *D, | ||||||||||||||||||||
| 393 | const Loop *CurLoop) { | ||||||||||||||||||||
| 394 | Kind = Distance; | ||||||||||||||||||||
| 395 | A = SE->getOne(D->getType()); | ||||||||||||||||||||
| 396 | B = SE->getNegativeSCEV(A); | ||||||||||||||||||||
| 397 | C = SE->getNegativeSCEV(D); | ||||||||||||||||||||
| 398 | AssociatedLoop = CurLoop; | ||||||||||||||||||||
| 399 | } | ||||||||||||||||||||
| 400 | |||||||||||||||||||||
| 401 | void DependenceInfo::Constraint::setEmpty() { Kind = Empty; } | ||||||||||||||||||||
| 402 | |||||||||||||||||||||
| 403 | void DependenceInfo::Constraint::setAny(ScalarEvolution *NewSE) { | ||||||||||||||||||||
| 404 | SE = NewSE; | ||||||||||||||||||||
| 405 | Kind = Any; | ||||||||||||||||||||
| 406 | } | ||||||||||||||||||||
| 407 | |||||||||||||||||||||
| 408 | #if !defined(NDEBUG1) || defined(LLVM_ENABLE_DUMP) | ||||||||||||||||||||
| 409 | // For debugging purposes. Dumps the constraint out to OS. | ||||||||||||||||||||
| 410 | LLVM_DUMP_METHOD__attribute__((noinline)) void DependenceInfo::Constraint::dump(raw_ostream &OS) const { | ||||||||||||||||||||
| 411 | if (isEmpty()) | ||||||||||||||||||||
| 412 | OS << " Empty\n"; | ||||||||||||||||||||
| 413 | else if (isAny()) | ||||||||||||||||||||
| 414 | OS << " Any\n"; | ||||||||||||||||||||
| 415 | else if (isPoint()) | ||||||||||||||||||||
| 416 | OS << " Point is <" << *getX() << ", " << *getY() << ">\n"; | ||||||||||||||||||||
| 417 | else if (isDistance()) | ||||||||||||||||||||
| 418 | OS << " Distance is " << *getD() << | ||||||||||||||||||||
| 419 | " (" << *getA() << "*X + " << *getB() << "*Y = " << *getC() << ")\n"; | ||||||||||||||||||||
| 420 | else if (isLine()) | ||||||||||||||||||||
| 421 | OS << " Line is " << *getA() << "*X + " << | ||||||||||||||||||||
| 422 | *getB() << "*Y = " << *getC() << "\n"; | ||||||||||||||||||||
| 423 | else | ||||||||||||||||||||
| 424 | llvm_unreachable("unknown constraint type in Constraint::dump")__builtin_unreachable(); | ||||||||||||||||||||
| 425 | } | ||||||||||||||||||||
| 426 | #endif | ||||||||||||||||||||
| 427 | |||||||||||||||||||||
| 428 | |||||||||||||||||||||
| 429 | // Updates X with the intersection | ||||||||||||||||||||
| 430 | // of the Constraints X and Y. Returns true if X has changed. | ||||||||||||||||||||
| 431 | // Corresponds to Figure 4 from the paper | ||||||||||||||||||||
| 432 | // | ||||||||||||||||||||
| 433 | // Practical Dependence Testing | ||||||||||||||||||||
| 434 | // Goff, Kennedy, Tseng | ||||||||||||||||||||
| 435 | // PLDI 1991 | ||||||||||||||||||||
| 436 | bool DependenceInfo::intersectConstraints(Constraint *X, const Constraint *Y) { | ||||||||||||||||||||
| 437 | ++DeltaApplications; | ||||||||||||||||||||
| 438 | LLVM_DEBUG(dbgs() << "\tintersect constraints\n")do { } while (false); | ||||||||||||||||||||
| 439 | LLVM_DEBUG(dbgs() << "\t X ="; X->dump(dbgs()))do { } while (false); | ||||||||||||||||||||
| 440 | LLVM_DEBUG(dbgs() << "\t Y ="; Y->dump(dbgs()))do { } while (false); | ||||||||||||||||||||
| 441 | assert(!Y->isPoint() && "Y must not be a Point")((void)0); | ||||||||||||||||||||
| 442 | if (X->isAny()) { | ||||||||||||||||||||
| 443 | if (Y->isAny()) | ||||||||||||||||||||
| 444 | return false; | ||||||||||||||||||||
| 445 | *X = *Y; | ||||||||||||||||||||
| 446 | return true; | ||||||||||||||||||||
| 447 | } | ||||||||||||||||||||
| 448 | if (X->isEmpty()) | ||||||||||||||||||||
| 449 | return false; | ||||||||||||||||||||
| 450 | if (Y->isEmpty()) { | ||||||||||||||||||||
| 451 | X->setEmpty(); | ||||||||||||||||||||
| 452 | return true; | ||||||||||||||||||||
| 453 | } | ||||||||||||||||||||
| 454 | |||||||||||||||||||||
| 455 | if (X->isDistance() && Y->isDistance()) { | ||||||||||||||||||||
| 456 | LLVM_DEBUG(dbgs() << "\t intersect 2 distances\n")do { } while (false); | ||||||||||||||||||||
| 457 | if (isKnownPredicate(CmpInst::ICMP_EQ, X->getD(), Y->getD())) | ||||||||||||||||||||
| 458 | return false; | ||||||||||||||||||||
| 459 | if (isKnownPredicate(CmpInst::ICMP_NE, X->getD(), Y->getD())) { | ||||||||||||||||||||
| 460 | X->setEmpty(); | ||||||||||||||||||||
| 461 | ++DeltaSuccesses; | ||||||||||||||||||||
| 462 | return true; | ||||||||||||||||||||
| 463 | } | ||||||||||||||||||||
| 464 | // Hmmm, interesting situation. | ||||||||||||||||||||
| 465 | // I guess if either is constant, keep it and ignore the other. | ||||||||||||||||||||
| 466 | if (isa<SCEVConstant>(Y->getD())) { | ||||||||||||||||||||
| 467 | *X = *Y; | ||||||||||||||||||||
| 468 | return true; | ||||||||||||||||||||
| 469 | } | ||||||||||||||||||||
| 470 | return false; | ||||||||||||||||||||
| 471 | } | ||||||||||||||||||||
| 472 | |||||||||||||||||||||
| 473 | // At this point, the pseudo-code in Figure 4 of the paper | ||||||||||||||||||||
| 474 | // checks if (X->isPoint() && Y->isPoint()). | ||||||||||||||||||||
| 475 | // This case can't occur in our implementation, | ||||||||||||||||||||
| 476 | // since a Point can only arise as the result of intersecting | ||||||||||||||||||||
| 477 | // two Line constraints, and the right-hand value, Y, is never | ||||||||||||||||||||
| 478 | // the result of an intersection. | ||||||||||||||||||||
| 479 | assert(!(X->isPoint() && Y->isPoint()) &&((void)0) | ||||||||||||||||||||
| 480 | "We shouldn't ever see X->isPoint() && Y->isPoint()")((void)0); | ||||||||||||||||||||
| 481 | |||||||||||||||||||||
| 482 | if (X->isLine() && Y->isLine()) { | ||||||||||||||||||||
| 483 | LLVM_DEBUG(dbgs() << "\t intersect 2 lines\n")do { } while (false); | ||||||||||||||||||||
| 484 | const SCEV *Prod1 = SE->getMulExpr(X->getA(), Y->getB()); | ||||||||||||||||||||
| 485 | const SCEV *Prod2 = SE->getMulExpr(X->getB(), Y->getA()); | ||||||||||||||||||||
| 486 | if (isKnownPredicate(CmpInst::ICMP_EQ, Prod1, Prod2)) { | ||||||||||||||||||||
| 487 | // slopes are equal, so lines are parallel | ||||||||||||||||||||
| 488 | LLVM_DEBUG(dbgs() << "\t\tsame slope\n")do { } while (false); | ||||||||||||||||||||
| 489 | Prod1 = SE->getMulExpr(X->getC(), Y->getB()); | ||||||||||||||||||||
| 490 | Prod2 = SE->getMulExpr(X->getB(), Y->getC()); | ||||||||||||||||||||
| 491 | if (isKnownPredicate(CmpInst::ICMP_EQ, Prod1, Prod2)) | ||||||||||||||||||||
| 492 | return false; | ||||||||||||||||||||
| 493 | if (isKnownPredicate(CmpInst::ICMP_NE, Prod1, Prod2)) { | ||||||||||||||||||||
| 494 | X->setEmpty(); | ||||||||||||||||||||
| 495 | ++DeltaSuccesses; | ||||||||||||||||||||
| 496 | return true; | ||||||||||||||||||||
| 497 | } | ||||||||||||||||||||
| 498 | return false; | ||||||||||||||||||||
| 499 | } | ||||||||||||||||||||
| 500 | if (isKnownPredicate(CmpInst::ICMP_NE, Prod1, Prod2)) { | ||||||||||||||||||||
| 501 | // slopes differ, so lines intersect | ||||||||||||||||||||
| 502 | LLVM_DEBUG(dbgs() << "\t\tdifferent slopes\n")do { } while (false); | ||||||||||||||||||||
| 503 | const SCEV *C1B2 = SE->getMulExpr(X->getC(), Y->getB()); | ||||||||||||||||||||
| 504 | const SCEV *C1A2 = SE->getMulExpr(X->getC(), Y->getA()); | ||||||||||||||||||||
| 505 | const SCEV *C2B1 = SE->getMulExpr(Y->getC(), X->getB()); | ||||||||||||||||||||
| 506 | const SCEV *C2A1 = SE->getMulExpr(Y->getC(), X->getA()); | ||||||||||||||||||||
| 507 | const SCEV *A1B2 = SE->getMulExpr(X->getA(), Y->getB()); | ||||||||||||||||||||
| 508 | const SCEV *A2B1 = SE->getMulExpr(Y->getA(), X->getB()); | ||||||||||||||||||||
| 509 | const SCEVConstant *C1A2_C2A1 = | ||||||||||||||||||||
| 510 | dyn_cast<SCEVConstant>(SE->getMinusSCEV(C1A2, C2A1)); | ||||||||||||||||||||
| 511 | const SCEVConstant *C1B2_C2B1 = | ||||||||||||||||||||
| 512 | dyn_cast<SCEVConstant>(SE->getMinusSCEV(C1B2, C2B1)); | ||||||||||||||||||||
| 513 | const SCEVConstant *A1B2_A2B1 = | ||||||||||||||||||||
| 514 | dyn_cast<SCEVConstant>(SE->getMinusSCEV(A1B2, A2B1)); | ||||||||||||||||||||
| 515 | const SCEVConstant *A2B1_A1B2 = | ||||||||||||||||||||
| 516 | dyn_cast<SCEVConstant>(SE->getMinusSCEV(A2B1, A1B2)); | ||||||||||||||||||||
| 517 | if (!C1B2_C2B1 || !C1A2_C2A1 || | ||||||||||||||||||||
| 518 | !A1B2_A2B1 || !A2B1_A1B2) | ||||||||||||||||||||
| 519 | return false; | ||||||||||||||||||||
| 520 | APInt Xtop = C1B2_C2B1->getAPInt(); | ||||||||||||||||||||
| 521 | APInt Xbot = A1B2_A2B1->getAPInt(); | ||||||||||||||||||||
| 522 | APInt Ytop = C1A2_C2A1->getAPInt(); | ||||||||||||||||||||
| 523 | APInt Ybot = A2B1_A1B2->getAPInt(); | ||||||||||||||||||||
| 524 | LLVM_DEBUG(dbgs() << "\t\tXtop = " << Xtop << "\n")do { } while (false); | ||||||||||||||||||||
| 525 | LLVM_DEBUG(dbgs() << "\t\tXbot = " << Xbot << "\n")do { } while (false); | ||||||||||||||||||||
| 526 | LLVM_DEBUG(dbgs() << "\t\tYtop = " << Ytop << "\n")do { } while (false); | ||||||||||||||||||||
| 527 | LLVM_DEBUG(dbgs() << "\t\tYbot = " << Ybot << "\n")do { } while (false); | ||||||||||||||||||||
| 528 | APInt Xq = Xtop; // these need to be initialized, even | ||||||||||||||||||||
| 529 | APInt Xr = Xtop; // though they're just going to be overwritten | ||||||||||||||||||||
| 530 | APInt::sdivrem(Xtop, Xbot, Xq, Xr); | ||||||||||||||||||||
| 531 | APInt Yq = Ytop; | ||||||||||||||||||||
| 532 | APInt Yr = Ytop; | ||||||||||||||||||||
| 533 | APInt::sdivrem(Ytop, Ybot, Yq, Yr); | ||||||||||||||||||||
| 534 | if (Xr != 0 || Yr != 0) { | ||||||||||||||||||||
| 535 | X->setEmpty(); | ||||||||||||||||||||
| 536 | ++DeltaSuccesses; | ||||||||||||||||||||
| 537 | return true; | ||||||||||||||||||||
| 538 | } | ||||||||||||||||||||
| 539 | LLVM_DEBUG(dbgs() << "\t\tX = " << Xq << ", Y = " << Yq << "\n")do { } while (false); | ||||||||||||||||||||
| 540 | if (Xq.slt(0) || Yq.slt(0)) { | ||||||||||||||||||||
| 541 | X->setEmpty(); | ||||||||||||||||||||
| 542 | ++DeltaSuccesses; | ||||||||||||||||||||
| 543 | return true; | ||||||||||||||||||||
| 544 | } | ||||||||||||||||||||
| 545 | if (const SCEVConstant *CUB = | ||||||||||||||||||||
| 546 | collectConstantUpperBound(X->getAssociatedLoop(), Prod1->getType())) { | ||||||||||||||||||||
| 547 | const APInt &UpperBound = CUB->getAPInt(); | ||||||||||||||||||||
| 548 | LLVM_DEBUG(dbgs() << "\t\tupper bound = " << UpperBound << "\n")do { } while (false); | ||||||||||||||||||||
| 549 | if (Xq.sgt(UpperBound) || Yq.sgt(UpperBound)) { | ||||||||||||||||||||
| 550 | X->setEmpty(); | ||||||||||||||||||||
| 551 | ++DeltaSuccesses; | ||||||||||||||||||||
| 552 | return true; | ||||||||||||||||||||
| 553 | } | ||||||||||||||||||||
| 554 | } | ||||||||||||||||||||
| 555 | X->setPoint(SE->getConstant(Xq), | ||||||||||||||||||||
| 556 | SE->getConstant(Yq), | ||||||||||||||||||||
| 557 | X->getAssociatedLoop()); | ||||||||||||||||||||
| 558 | ++DeltaSuccesses; | ||||||||||||||||||||
| 559 | return true; | ||||||||||||||||||||
| 560 | } | ||||||||||||||||||||
| 561 | return false; | ||||||||||||||||||||
| 562 | } | ||||||||||||||||||||
| 563 | |||||||||||||||||||||
| 564 | // if (X->isLine() && Y->isPoint()) This case can't occur. | ||||||||||||||||||||
| 565 | assert(!(X->isLine() && Y->isPoint()) && "This case should never occur")((void)0); | ||||||||||||||||||||
| 566 | |||||||||||||||||||||
| 567 | if (X->isPoint() && Y->isLine()) { | ||||||||||||||||||||
| 568 | LLVM_DEBUG(dbgs() << "\t intersect Point and Line\n")do { } while (false); | ||||||||||||||||||||
| 569 | const SCEV *A1X1 = SE->getMulExpr(Y->getA(), X->getX()); | ||||||||||||||||||||
| 570 | const SCEV *B1Y1 = SE->getMulExpr(Y->getB(), X->getY()); | ||||||||||||||||||||
| 571 | const SCEV *Sum = SE->getAddExpr(A1X1, B1Y1); | ||||||||||||||||||||
| 572 | if (isKnownPredicate(CmpInst::ICMP_EQ, Sum, Y->getC())) | ||||||||||||||||||||
| 573 | return false; | ||||||||||||||||||||
| 574 | if (isKnownPredicate(CmpInst::ICMP_NE, Sum, Y->getC())) { | ||||||||||||||||||||
| 575 | X->setEmpty(); | ||||||||||||||||||||
| 576 | ++DeltaSuccesses; | ||||||||||||||||||||
| 577 | return true; | ||||||||||||||||||||
| 578 | } | ||||||||||||||||||||
| 579 | return false; | ||||||||||||||||||||
| 580 | } | ||||||||||||||||||||
| 581 | |||||||||||||||||||||
| 582 | llvm_unreachable("shouldn't reach the end of Constraint intersection")__builtin_unreachable(); | ||||||||||||||||||||
| 583 | return false; | ||||||||||||||||||||
| 584 | } | ||||||||||||||||||||
| 585 | |||||||||||||||||||||
| 586 | |||||||||||||||||||||
| 587 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 588 | // DependenceInfo methods | ||||||||||||||||||||
| 589 | |||||||||||||||||||||
| 590 | // For debugging purposes. Dumps a dependence to OS. | ||||||||||||||||||||
| 591 | void Dependence::dump(raw_ostream &OS) const { | ||||||||||||||||||||
| 592 | bool Splitable = false; | ||||||||||||||||||||
| 593 | if (isConfused()) | ||||||||||||||||||||
| 594 | OS << "confused"; | ||||||||||||||||||||
| 595 | else { | ||||||||||||||||||||
| 596 | if (isConsistent()) | ||||||||||||||||||||
| 597 | OS << "consistent "; | ||||||||||||||||||||
| 598 | if (isFlow()) | ||||||||||||||||||||
| 599 | OS << "flow"; | ||||||||||||||||||||
| 600 | else if (isOutput()) | ||||||||||||||||||||
| 601 | OS << "output"; | ||||||||||||||||||||
| 602 | else if (isAnti()) | ||||||||||||||||||||
| 603 | OS << "anti"; | ||||||||||||||||||||
| 604 | else if (isInput()) | ||||||||||||||||||||
| 605 | OS << "input"; | ||||||||||||||||||||
| 606 | unsigned Levels = getLevels(); | ||||||||||||||||||||
| 607 | OS << " ["; | ||||||||||||||||||||
| 608 | for (unsigned II = 1; II <= Levels; ++II) { | ||||||||||||||||||||
| 609 | if (isSplitable(II)) | ||||||||||||||||||||
| 610 | Splitable = true; | ||||||||||||||||||||
| 611 | if (isPeelFirst(II)) | ||||||||||||||||||||
| 612 | OS << 'p'; | ||||||||||||||||||||
| 613 | const SCEV *Distance = getDistance(II); | ||||||||||||||||||||
| 614 | if (Distance) | ||||||||||||||||||||
| 615 | OS << *Distance; | ||||||||||||||||||||
| 616 | else if (isScalar(II)) | ||||||||||||||||||||
| 617 | OS << "S"; | ||||||||||||||||||||
| 618 | else { | ||||||||||||||||||||
| 619 | unsigned Direction = getDirection(II); | ||||||||||||||||||||
| 620 | if (Direction == DVEntry::ALL) | ||||||||||||||||||||
| 621 | OS << "*"; | ||||||||||||||||||||
| 622 | else { | ||||||||||||||||||||
| 623 | if (Direction & DVEntry::LT) | ||||||||||||||||||||
| 624 | OS << "<"; | ||||||||||||||||||||
| 625 | if (Direction & DVEntry::EQ) | ||||||||||||||||||||
| 626 | OS << "="; | ||||||||||||||||||||
| 627 | if (Direction & DVEntry::GT) | ||||||||||||||||||||
| 628 | OS << ">"; | ||||||||||||||||||||
| 629 | } | ||||||||||||||||||||
| 630 | } | ||||||||||||||||||||
| 631 | if (isPeelLast(II)) | ||||||||||||||||||||
| 632 | OS << 'p'; | ||||||||||||||||||||
| 633 | if (II < Levels) | ||||||||||||||||||||
| 634 | OS << " "; | ||||||||||||||||||||
| 635 | } | ||||||||||||||||||||
| 636 | if (isLoopIndependent()) | ||||||||||||||||||||
| 637 | OS << "|<"; | ||||||||||||||||||||
| 638 | OS << "]"; | ||||||||||||||||||||
| 639 | if (Splitable) | ||||||||||||||||||||
| 640 | OS << " splitable"; | ||||||||||||||||||||
| 641 | } | ||||||||||||||||||||
| 642 | OS << "!\n"; | ||||||||||||||||||||
| 643 | } | ||||||||||||||||||||
| 644 | |||||||||||||||||||||
| 645 | // Returns NoAlias/MayAliass/MustAlias for two memory locations based upon their | ||||||||||||||||||||
| 646 | // underlaying objects. If LocA and LocB are known to not alias (for any reason: | ||||||||||||||||||||
| 647 | // tbaa, non-overlapping regions etc), then it is known there is no dependecy. | ||||||||||||||||||||
| 648 | // Otherwise the underlying objects are checked to see if they point to | ||||||||||||||||||||
| 649 | // different identifiable objects. | ||||||||||||||||||||
| 650 | static AliasResult underlyingObjectsAlias(AAResults *AA, | ||||||||||||||||||||
| 651 | const DataLayout &DL, | ||||||||||||||||||||
| 652 | const MemoryLocation &LocA, | ||||||||||||||||||||
| 653 | const MemoryLocation &LocB) { | ||||||||||||||||||||
| 654 | // Check the original locations (minus size) for noalias, which can happen for | ||||||||||||||||||||
| 655 | // tbaa, incompatible underlying object locations, etc. | ||||||||||||||||||||
| 656 | MemoryLocation LocAS = | ||||||||||||||||||||
| 657 | MemoryLocation::getBeforeOrAfter(LocA.Ptr, LocA.AATags); | ||||||||||||||||||||
| 658 | MemoryLocation LocBS = | ||||||||||||||||||||
| 659 | MemoryLocation::getBeforeOrAfter(LocB.Ptr, LocB.AATags); | ||||||||||||||||||||
| 660 | if (AA->isNoAlias(LocAS, LocBS)) | ||||||||||||||||||||
| 661 | return AliasResult::NoAlias; | ||||||||||||||||||||
| 662 | |||||||||||||||||||||
| 663 | // Check the underlying objects are the same | ||||||||||||||||||||
| 664 | const Value *AObj = getUnderlyingObject(LocA.Ptr); | ||||||||||||||||||||
| 665 | const Value *BObj = getUnderlyingObject(LocB.Ptr); | ||||||||||||||||||||
| 666 | |||||||||||||||||||||
| 667 | // If the underlying objects are the same, they must alias | ||||||||||||||||||||
| 668 | if (AObj == BObj) | ||||||||||||||||||||
| 669 | return AliasResult::MustAlias; | ||||||||||||||||||||
| 670 | |||||||||||||||||||||
| 671 | // We may have hit the recursion limit for underlying objects, or have | ||||||||||||||||||||
| 672 | // underlying objects where we don't know they will alias. | ||||||||||||||||||||
| 673 | if (!isIdentifiedObject(AObj) || !isIdentifiedObject(BObj)) | ||||||||||||||||||||
| 674 | return AliasResult::MayAlias; | ||||||||||||||||||||
| 675 | |||||||||||||||||||||
| 676 | // Otherwise we know the objects are different and both identified objects so | ||||||||||||||||||||
| 677 | // must not alias. | ||||||||||||||||||||
| 678 | return AliasResult::NoAlias; | ||||||||||||||||||||
| 679 | } | ||||||||||||||||||||
| 680 | |||||||||||||||||||||
| 681 | |||||||||||||||||||||
| 682 | // Returns true if the load or store can be analyzed. Atomic and volatile | ||||||||||||||||||||
| 683 | // operations have properties which this analysis does not understand. | ||||||||||||||||||||
| 684 | static | ||||||||||||||||||||
| 685 | bool isLoadOrStore(const Instruction *I) { | ||||||||||||||||||||
| 686 | if (const LoadInst *LI
| ||||||||||||||||||||
| 687 | return LI->isUnordered(); | ||||||||||||||||||||
| 688 | else if (const StoreInst *SI = dyn_cast<StoreInst>(I)) | ||||||||||||||||||||
| 689 | return SI->isUnordered(); | ||||||||||||||||||||
| 690 | return false; | ||||||||||||||||||||
| 691 | } | ||||||||||||||||||||
| 692 | |||||||||||||||||||||
| 693 | |||||||||||||||||||||
| 694 | // Examines the loop nesting of the Src and Dst | ||||||||||||||||||||
| 695 | // instructions and establishes their shared loops. Sets the variables | ||||||||||||||||||||
| 696 | // CommonLevels, SrcLevels, and MaxLevels. | ||||||||||||||||||||
| 697 | // The source and destination instructions needn't be contained in the same | ||||||||||||||||||||
| 698 | // loop. The routine establishNestingLevels finds the level of most deeply | ||||||||||||||||||||
| 699 | // nested loop that contains them both, CommonLevels. An instruction that's | ||||||||||||||||||||
| 700 | // not contained in a loop is at level = 0. MaxLevels is equal to the level | ||||||||||||||||||||
| 701 | // of the source plus the level of the destination, minus CommonLevels. | ||||||||||||||||||||
| 702 | // This lets us allocate vectors MaxLevels in length, with room for every | ||||||||||||||||||||
| 703 | // distinct loop referenced in both the source and destination subscripts. | ||||||||||||||||||||
| 704 | // The variable SrcLevels is the nesting depth of the source instruction. | ||||||||||||||||||||
| 705 | // It's used to help calculate distinct loops referenced by the destination. | ||||||||||||||||||||
| 706 | // Here's the map from loops to levels: | ||||||||||||||||||||
| 707 | // 0 - unused | ||||||||||||||||||||
| 708 | // 1 - outermost common loop | ||||||||||||||||||||
| 709 | // ... - other common loops | ||||||||||||||||||||
| 710 | // CommonLevels - innermost common loop | ||||||||||||||||||||
| 711 | // ... - loops containing Src but not Dst | ||||||||||||||||||||
| 712 | // SrcLevels - innermost loop containing Src but not Dst | ||||||||||||||||||||
| 713 | // ... - loops containing Dst but not Src | ||||||||||||||||||||
| 714 | // MaxLevels - innermost loops containing Dst but not Src | ||||||||||||||||||||
| 715 | // Consider the follow code fragment: | ||||||||||||||||||||
| 716 | // for (a = ...) { | ||||||||||||||||||||
| 717 | // for (b = ...) { | ||||||||||||||||||||
| 718 | // for (c = ...) { | ||||||||||||||||||||
| 719 | // for (d = ...) { | ||||||||||||||||||||
| 720 | // A[] = ...; | ||||||||||||||||||||
| 721 | // } | ||||||||||||||||||||
| 722 | // } | ||||||||||||||||||||
| 723 | // for (e = ...) { | ||||||||||||||||||||
| 724 | // for (f = ...) { | ||||||||||||||||||||
| 725 | // for (g = ...) { | ||||||||||||||||||||
| 726 | // ... = A[]; | ||||||||||||||||||||
| 727 | // } | ||||||||||||||||||||
| 728 | // } | ||||||||||||||||||||
| 729 | // } | ||||||||||||||||||||
| 730 | // } | ||||||||||||||||||||
| 731 | // } | ||||||||||||||||||||
| 732 | // If we're looking at the possibility of a dependence between the store | ||||||||||||||||||||
| 733 | // to A (the Src) and the load from A (the Dst), we'll note that they | ||||||||||||||||||||
| 734 | // have 2 loops in common, so CommonLevels will equal 2 and the direction | ||||||||||||||||||||
| 735 | // vector for Result will have 2 entries. SrcLevels = 4 and MaxLevels = 7. | ||||||||||||||||||||
| 736 | // A map from loop names to loop numbers would look like | ||||||||||||||||||||
| 737 | // a - 1 | ||||||||||||||||||||
| 738 | // b - 2 = CommonLevels | ||||||||||||||||||||
| 739 | // c - 3 | ||||||||||||||||||||
| 740 | // d - 4 = SrcLevels | ||||||||||||||||||||
| 741 | // e - 5 | ||||||||||||||||||||
| 742 | // f - 6 | ||||||||||||||||||||
| 743 | // g - 7 = MaxLevels | ||||||||||||||||||||
| 744 | void DependenceInfo::establishNestingLevels(const Instruction *Src, | ||||||||||||||||||||
| 745 | const Instruction *Dst) { | ||||||||||||||||||||
| 746 | const BasicBlock *SrcBlock = Src->getParent(); | ||||||||||||||||||||
| 747 | const BasicBlock *DstBlock = Dst->getParent(); | ||||||||||||||||||||
| 748 | unsigned SrcLevel = LI->getLoopDepth(SrcBlock); | ||||||||||||||||||||
| 749 | unsigned DstLevel = LI->getLoopDepth(DstBlock); | ||||||||||||||||||||
| 750 | const Loop *SrcLoop = LI->getLoopFor(SrcBlock); | ||||||||||||||||||||
| 751 | const Loop *DstLoop = LI->getLoopFor(DstBlock); | ||||||||||||||||||||
| 752 | SrcLevels = SrcLevel; | ||||||||||||||||||||
| 753 | MaxLevels = SrcLevel + DstLevel; | ||||||||||||||||||||
| 754 | while (SrcLevel > DstLevel) { | ||||||||||||||||||||
| 755 | SrcLoop = SrcLoop->getParentLoop(); | ||||||||||||||||||||
| 756 | SrcLevel--; | ||||||||||||||||||||
| 757 | } | ||||||||||||||||||||
| 758 | while (DstLevel > SrcLevel) { | ||||||||||||||||||||
| 759 | DstLoop = DstLoop->getParentLoop(); | ||||||||||||||||||||
| 760 | DstLevel--; | ||||||||||||||||||||
| 761 | } | ||||||||||||||||||||
| 762 | while (SrcLoop != DstLoop) { | ||||||||||||||||||||
| 763 | SrcLoop = SrcLoop->getParentLoop(); | ||||||||||||||||||||
| 764 | DstLoop = DstLoop->getParentLoop(); | ||||||||||||||||||||
| 765 | SrcLevel--; | ||||||||||||||||||||
| 766 | } | ||||||||||||||||||||
| 767 | CommonLevels = SrcLevel; | ||||||||||||||||||||
| 768 | MaxLevels -= CommonLevels; | ||||||||||||||||||||
| 769 | } | ||||||||||||||||||||
| 770 | |||||||||||||||||||||
| 771 | |||||||||||||||||||||
| 772 | // Given one of the loops containing the source, return | ||||||||||||||||||||
| 773 | // its level index in our numbering scheme. | ||||||||||||||||||||
| 774 | unsigned DependenceInfo::mapSrcLoop(const Loop *SrcLoop) const { | ||||||||||||||||||||
| 775 | return SrcLoop->getLoopDepth(); | ||||||||||||||||||||
| 776 | } | ||||||||||||||||||||
| 777 | |||||||||||||||||||||
| 778 | |||||||||||||||||||||
| 779 | // Given one of the loops containing the destination, | ||||||||||||||||||||
| 780 | // return its level index in our numbering scheme. | ||||||||||||||||||||
| 781 | unsigned DependenceInfo::mapDstLoop(const Loop *DstLoop) const { | ||||||||||||||||||||
| 782 | unsigned D = DstLoop->getLoopDepth(); | ||||||||||||||||||||
| 783 | if (D > CommonLevels) | ||||||||||||||||||||
| 784 | return D - CommonLevels + SrcLevels; | ||||||||||||||||||||
| 785 | else | ||||||||||||||||||||
| 786 | return D; | ||||||||||||||||||||
| 787 | } | ||||||||||||||||||||
| 788 | |||||||||||||||||||||
| 789 | |||||||||||||||||||||
| 790 | // Returns true if Expression is loop invariant in LoopNest. | ||||||||||||||||||||
| 791 | bool DependenceInfo::isLoopInvariant(const SCEV *Expression, | ||||||||||||||||||||
| 792 | const Loop *LoopNest) const { | ||||||||||||||||||||
| 793 | if (!LoopNest) | ||||||||||||||||||||
| 794 | return true; | ||||||||||||||||||||
| 795 | return SE->isLoopInvariant(Expression, LoopNest) && | ||||||||||||||||||||
| 796 | isLoopInvariant(Expression, LoopNest->getParentLoop()); | ||||||||||||||||||||
| 797 | } | ||||||||||||||||||||
| 798 | |||||||||||||||||||||
| 799 | |||||||||||||||||||||
| 800 | |||||||||||||||||||||
| 801 | // Finds the set of loops from the LoopNest that | ||||||||||||||||||||
| 802 | // have a level <= CommonLevels and are referred to by the SCEV Expression. | ||||||||||||||||||||
| 803 | void DependenceInfo::collectCommonLoops(const SCEV *Expression, | ||||||||||||||||||||
| 804 | const Loop *LoopNest, | ||||||||||||||||||||
| 805 | SmallBitVector &Loops) const { | ||||||||||||||||||||
| 806 | while (LoopNest) { | ||||||||||||||||||||
| 807 | unsigned Level = LoopNest->getLoopDepth(); | ||||||||||||||||||||
| 808 | if (Level <= CommonLevels && !SE->isLoopInvariant(Expression, LoopNest)) | ||||||||||||||||||||
| 809 | Loops.set(Level); | ||||||||||||||||||||
| 810 | LoopNest = LoopNest->getParentLoop(); | ||||||||||||||||||||
| 811 | } | ||||||||||||||||||||
| 812 | } | ||||||||||||||||||||
| 813 | |||||||||||||||||||||
| 814 | void DependenceInfo::unifySubscriptType(ArrayRef<Subscript *> Pairs) { | ||||||||||||||||||||
| 815 | |||||||||||||||||||||
| 816 | unsigned widestWidthSeen = 0; | ||||||||||||||||||||
| 817 | Type *widestType; | ||||||||||||||||||||
| 818 | |||||||||||||||||||||
| 819 | // Go through each pair and find the widest bit to which we need | ||||||||||||||||||||
| 820 | // to extend all of them. | ||||||||||||||||||||
| 821 | for (Subscript *Pair : Pairs) { | ||||||||||||||||||||
| 822 | const SCEV *Src = Pair->Src; | ||||||||||||||||||||
| 823 | const SCEV *Dst = Pair->Dst; | ||||||||||||||||||||
| 824 | IntegerType *SrcTy = dyn_cast<IntegerType>(Src->getType()); | ||||||||||||||||||||
| 825 | IntegerType *DstTy = dyn_cast<IntegerType>(Dst->getType()); | ||||||||||||||||||||
| 826 | if (SrcTy == nullptr || DstTy == nullptr) { | ||||||||||||||||||||
| 827 | assert(SrcTy == DstTy && "This function only unify integer types and "((void)0) | ||||||||||||||||||||
| 828 | "expect Src and Dst share the same type "((void)0) | ||||||||||||||||||||
| 829 | "otherwise.")((void)0); | ||||||||||||||||||||
| 830 | continue; | ||||||||||||||||||||
| 831 | } | ||||||||||||||||||||
| 832 | if (SrcTy->getBitWidth() > widestWidthSeen) { | ||||||||||||||||||||
| 833 | widestWidthSeen = SrcTy->getBitWidth(); | ||||||||||||||||||||
| 834 | widestType = SrcTy; | ||||||||||||||||||||
| 835 | } | ||||||||||||||||||||
| 836 | if (DstTy->getBitWidth() > widestWidthSeen) { | ||||||||||||||||||||
| 837 | widestWidthSeen = DstTy->getBitWidth(); | ||||||||||||||||||||
| 838 | widestType = DstTy; | ||||||||||||||||||||
| 839 | } | ||||||||||||||||||||
| 840 | } | ||||||||||||||||||||
| 841 | |||||||||||||||||||||
| 842 | |||||||||||||||||||||
| 843 | assert(widestWidthSeen > 0)((void)0); | ||||||||||||||||||||
| 844 | |||||||||||||||||||||
| 845 | // Now extend each pair to the widest seen. | ||||||||||||||||||||
| 846 | for (Subscript *Pair : Pairs) { | ||||||||||||||||||||
| 847 | const SCEV *Src = Pair->Src; | ||||||||||||||||||||
| 848 | const SCEV *Dst = Pair->Dst; | ||||||||||||||||||||
| 849 | IntegerType *SrcTy = dyn_cast<IntegerType>(Src->getType()); | ||||||||||||||||||||
| 850 | IntegerType *DstTy = dyn_cast<IntegerType>(Dst->getType()); | ||||||||||||||||||||
| 851 | if (SrcTy == nullptr || DstTy == nullptr) { | ||||||||||||||||||||
| 852 | assert(SrcTy == DstTy && "This function only unify integer types and "((void)0) | ||||||||||||||||||||
| 853 | "expect Src and Dst share the same type "((void)0) | ||||||||||||||||||||
| 854 | "otherwise.")((void)0); | ||||||||||||||||||||
| 855 | continue; | ||||||||||||||||||||
| 856 | } | ||||||||||||||||||||
| 857 | if (SrcTy->getBitWidth() < widestWidthSeen) | ||||||||||||||||||||
| 858 | // Sign-extend Src to widestType | ||||||||||||||||||||
| 859 | Pair->Src = SE->getSignExtendExpr(Src, widestType); | ||||||||||||||||||||
| 860 | if (DstTy->getBitWidth() < widestWidthSeen) { | ||||||||||||||||||||
| 861 | // Sign-extend Dst to widestType | ||||||||||||||||||||
| 862 | Pair->Dst = SE->getSignExtendExpr(Dst, widestType); | ||||||||||||||||||||
| 863 | } | ||||||||||||||||||||
| 864 | } | ||||||||||||||||||||
| 865 | } | ||||||||||||||||||||
| 866 | |||||||||||||||||||||
| 867 | // removeMatchingExtensions - Examines a subscript pair. | ||||||||||||||||||||
| 868 | // If the source and destination are identically sign (or zero) | ||||||||||||||||||||
| 869 | // extended, it strips off the extension in an effect to simplify | ||||||||||||||||||||
| 870 | // the actual analysis. | ||||||||||||||||||||
| 871 | void DependenceInfo::removeMatchingExtensions(Subscript *Pair) { | ||||||||||||||||||||
| 872 | const SCEV *Src = Pair->Src; | ||||||||||||||||||||
| 873 | const SCEV *Dst = Pair->Dst; | ||||||||||||||||||||
| 874 | if ((isa<SCEVZeroExtendExpr>(Src) && isa<SCEVZeroExtendExpr>(Dst)) || | ||||||||||||||||||||
| 875 | (isa<SCEVSignExtendExpr>(Src) && isa<SCEVSignExtendExpr>(Dst))) { | ||||||||||||||||||||
| 876 | const SCEVIntegralCastExpr *SrcCast = cast<SCEVIntegralCastExpr>(Src); | ||||||||||||||||||||
| 877 | const SCEVIntegralCastExpr *DstCast = cast<SCEVIntegralCastExpr>(Dst); | ||||||||||||||||||||
| 878 | const SCEV *SrcCastOp = SrcCast->getOperand(); | ||||||||||||||||||||
| 879 | const SCEV *DstCastOp = DstCast->getOperand(); | ||||||||||||||||||||
| 880 | if (SrcCastOp->getType() == DstCastOp->getType()) { | ||||||||||||||||||||
| 881 | Pair->Src = SrcCastOp; | ||||||||||||||||||||
| 882 | Pair->Dst = DstCastOp; | ||||||||||||||||||||
| 883 | } | ||||||||||||||||||||
| 884 | } | ||||||||||||||||||||
| 885 | } | ||||||||||||||||||||
| 886 | |||||||||||||||||||||
| 887 | // Examine the scev and return true iff it's linear. | ||||||||||||||||||||
| 888 | // Collect any loops mentioned in the set of "Loops". | ||||||||||||||||||||
| 889 | bool DependenceInfo::checkSubscript(const SCEV *Expr, const Loop *LoopNest, | ||||||||||||||||||||
| 890 | SmallBitVector &Loops, bool IsSrc) { | ||||||||||||||||||||
| 891 | const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr); | ||||||||||||||||||||
| 892 | if (!AddRec) | ||||||||||||||||||||
| 893 | return isLoopInvariant(Expr, LoopNest); | ||||||||||||||||||||
| 894 | const SCEV *Start = AddRec->getStart(); | ||||||||||||||||||||
| 895 | const SCEV *Step = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 896 | const SCEV *UB = SE->getBackedgeTakenCount(AddRec->getLoop()); | ||||||||||||||||||||
| 897 | if (!isa<SCEVCouldNotCompute>(UB)) { | ||||||||||||||||||||
| 898 | if (SE->getTypeSizeInBits(Start->getType()) < | ||||||||||||||||||||
| 899 | SE->getTypeSizeInBits(UB->getType())) { | ||||||||||||||||||||
| 900 | if (!AddRec->getNoWrapFlags()) | ||||||||||||||||||||
| 901 | return false; | ||||||||||||||||||||
| 902 | } | ||||||||||||||||||||
| 903 | } | ||||||||||||||||||||
| 904 | if (!isLoopInvariant(Step, LoopNest)) | ||||||||||||||||||||
| 905 | return false; | ||||||||||||||||||||
| 906 | if (IsSrc) | ||||||||||||||||||||
| 907 | Loops.set(mapSrcLoop(AddRec->getLoop())); | ||||||||||||||||||||
| 908 | else | ||||||||||||||||||||
| 909 | Loops.set(mapDstLoop(AddRec->getLoop())); | ||||||||||||||||||||
| 910 | return checkSubscript(Start, LoopNest, Loops, IsSrc); | ||||||||||||||||||||
| 911 | } | ||||||||||||||||||||
| 912 | |||||||||||||||||||||
| 913 | // Examine the scev and return true iff it's linear. | ||||||||||||||||||||
| 914 | // Collect any loops mentioned in the set of "Loops". | ||||||||||||||||||||
| 915 | bool DependenceInfo::checkSrcSubscript(const SCEV *Src, const Loop *LoopNest, | ||||||||||||||||||||
| 916 | SmallBitVector &Loops) { | ||||||||||||||||||||
| 917 | return checkSubscript(Src, LoopNest, Loops, true); | ||||||||||||||||||||
| 918 | } | ||||||||||||||||||||
| 919 | |||||||||||||||||||||
| 920 | // Examine the scev and return true iff it's linear. | ||||||||||||||||||||
| 921 | // Collect any loops mentioned in the set of "Loops". | ||||||||||||||||||||
| 922 | bool DependenceInfo::checkDstSubscript(const SCEV *Dst, const Loop *LoopNest, | ||||||||||||||||||||
| 923 | SmallBitVector &Loops) { | ||||||||||||||||||||
| 924 | return checkSubscript(Dst, LoopNest, Loops, false); | ||||||||||||||||||||
| 925 | } | ||||||||||||||||||||
| 926 | |||||||||||||||||||||
| 927 | |||||||||||||||||||||
| 928 | // Examines the subscript pair (the Src and Dst SCEVs) | ||||||||||||||||||||
| 929 | // and classifies it as either ZIV, SIV, RDIV, MIV, or Nonlinear. | ||||||||||||||||||||
| 930 | // Collects the associated loops in a set. | ||||||||||||||||||||
| 931 | DependenceInfo::Subscript::ClassificationKind | ||||||||||||||||||||
| 932 | DependenceInfo::classifyPair(const SCEV *Src, const Loop *SrcLoopNest, | ||||||||||||||||||||
| 933 | const SCEV *Dst, const Loop *DstLoopNest, | ||||||||||||||||||||
| 934 | SmallBitVector &Loops) { | ||||||||||||||||||||
| 935 | SmallBitVector SrcLoops(MaxLevels + 1); | ||||||||||||||||||||
| 936 | SmallBitVector DstLoops(MaxLevels + 1); | ||||||||||||||||||||
| 937 | if (!checkSrcSubscript(Src, SrcLoopNest, SrcLoops)) | ||||||||||||||||||||
| 938 | return Subscript::NonLinear; | ||||||||||||||||||||
| 939 | if (!checkDstSubscript(Dst, DstLoopNest, DstLoops)) | ||||||||||||||||||||
| 940 | return Subscript::NonLinear; | ||||||||||||||||||||
| 941 | Loops = SrcLoops; | ||||||||||||||||||||
| 942 | Loops |= DstLoops; | ||||||||||||||||||||
| 943 | unsigned N = Loops.count(); | ||||||||||||||||||||
| 944 | if (N == 0) | ||||||||||||||||||||
| 945 | return Subscript::ZIV; | ||||||||||||||||||||
| 946 | if (N == 1) | ||||||||||||||||||||
| 947 | return Subscript::SIV; | ||||||||||||||||||||
| 948 | if (N == 2 && (SrcLoops.count() == 0 || | ||||||||||||||||||||
| 949 | DstLoops.count() == 0 || | ||||||||||||||||||||
| 950 | (SrcLoops.count() == 1 && DstLoops.count() == 1))) | ||||||||||||||||||||
| 951 | return Subscript::RDIV; | ||||||||||||||||||||
| 952 | return Subscript::MIV; | ||||||||||||||||||||
| 953 | } | ||||||||||||||||||||
| 954 | |||||||||||||||||||||
| 955 | |||||||||||||||||||||
| 956 | // A wrapper around SCEV::isKnownPredicate. | ||||||||||||||||||||
| 957 | // Looks for cases where we're interested in comparing for equality. | ||||||||||||||||||||
| 958 | // If both X and Y have been identically sign or zero extended, | ||||||||||||||||||||
| 959 | // it strips off the (confusing) extensions before invoking | ||||||||||||||||||||
| 960 | // SCEV::isKnownPredicate. Perhaps, someday, the ScalarEvolution package | ||||||||||||||||||||
| 961 | // will be similarly updated. | ||||||||||||||||||||
| 962 | // | ||||||||||||||||||||
| 963 | // If SCEV::isKnownPredicate can't prove the predicate, | ||||||||||||||||||||
| 964 | // we try simple subtraction, which seems to help in some cases | ||||||||||||||||||||
| 965 | // involving symbolics. | ||||||||||||||||||||
| 966 | bool DependenceInfo::isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *X, | ||||||||||||||||||||
| 967 | const SCEV *Y) const { | ||||||||||||||||||||
| 968 | if (Pred == CmpInst::ICMP_EQ || | ||||||||||||||||||||
| 969 | Pred == CmpInst::ICMP_NE) { | ||||||||||||||||||||
| 970 | if ((isa<SCEVSignExtendExpr>(X) && | ||||||||||||||||||||
| 971 | isa<SCEVSignExtendExpr>(Y)) || | ||||||||||||||||||||
| 972 | (isa<SCEVZeroExtendExpr>(X) && | ||||||||||||||||||||
| 973 | isa<SCEVZeroExtendExpr>(Y))) { | ||||||||||||||||||||
| 974 | const SCEVIntegralCastExpr *CX = cast<SCEVIntegralCastExpr>(X); | ||||||||||||||||||||
| 975 | const SCEVIntegralCastExpr *CY = cast<SCEVIntegralCastExpr>(Y); | ||||||||||||||||||||
| 976 | const SCEV *Xop = CX->getOperand(); | ||||||||||||||||||||
| 977 | const SCEV *Yop = CY->getOperand(); | ||||||||||||||||||||
| 978 | if (Xop->getType() == Yop->getType()) { | ||||||||||||||||||||
| 979 | X = Xop; | ||||||||||||||||||||
| 980 | Y = Yop; | ||||||||||||||||||||
| 981 | } | ||||||||||||||||||||
| 982 | } | ||||||||||||||||||||
| 983 | } | ||||||||||||||||||||
| 984 | if (SE->isKnownPredicate(Pred, X, Y)) | ||||||||||||||||||||
| 985 | return true; | ||||||||||||||||||||
| 986 | // If SE->isKnownPredicate can't prove the condition, | ||||||||||||||||||||
| 987 | // we try the brute-force approach of subtracting | ||||||||||||||||||||
| 988 | // and testing the difference. | ||||||||||||||||||||
| 989 | // By testing with SE->isKnownPredicate first, we avoid | ||||||||||||||||||||
| 990 | // the possibility of overflow when the arguments are constants. | ||||||||||||||||||||
| 991 | const SCEV *Delta = SE->getMinusSCEV(X, Y); | ||||||||||||||||||||
| 992 | switch (Pred) { | ||||||||||||||||||||
| 993 | case CmpInst::ICMP_EQ: | ||||||||||||||||||||
| 994 | return Delta->isZero(); | ||||||||||||||||||||
| 995 | case CmpInst::ICMP_NE: | ||||||||||||||||||||
| 996 | return SE->isKnownNonZero(Delta); | ||||||||||||||||||||
| 997 | case CmpInst::ICMP_SGE: | ||||||||||||||||||||
| 998 | return SE->isKnownNonNegative(Delta); | ||||||||||||||||||||
| 999 | case CmpInst::ICMP_SLE: | ||||||||||||||||||||
| 1000 | return SE->isKnownNonPositive(Delta); | ||||||||||||||||||||
| 1001 | case CmpInst::ICMP_SGT: | ||||||||||||||||||||
| 1002 | return SE->isKnownPositive(Delta); | ||||||||||||||||||||
| 1003 | case CmpInst::ICMP_SLT: | ||||||||||||||||||||
| 1004 | return SE->isKnownNegative(Delta); | ||||||||||||||||||||
| 1005 | default: | ||||||||||||||||||||
| 1006 | llvm_unreachable("unexpected predicate in isKnownPredicate")__builtin_unreachable(); | ||||||||||||||||||||
| 1007 | } | ||||||||||||||||||||
| 1008 | } | ||||||||||||||||||||
| 1009 | |||||||||||||||||||||
| 1010 | /// Compare to see if S is less than Size, using isKnownNegative(S - max(Size, 1)) | ||||||||||||||||||||
| 1011 | /// with some extra checking if S is an AddRec and we can prove less-than using | ||||||||||||||||||||
| 1012 | /// the loop bounds. | ||||||||||||||||||||
| 1013 | bool DependenceInfo::isKnownLessThan(const SCEV *S, const SCEV *Size) const { | ||||||||||||||||||||
| 1014 | // First unify to the same type | ||||||||||||||||||||
| 1015 | auto *SType = dyn_cast<IntegerType>(S->getType()); | ||||||||||||||||||||
| 1016 | auto *SizeType = dyn_cast<IntegerType>(Size->getType()); | ||||||||||||||||||||
| 1017 | if (!SType || !SizeType) | ||||||||||||||||||||
| 1018 | return false; | ||||||||||||||||||||
| 1019 | Type *MaxType = | ||||||||||||||||||||
| 1020 | (SType->getBitWidth() >= SizeType->getBitWidth()) ? SType : SizeType; | ||||||||||||||||||||
| 1021 | S = SE->getTruncateOrZeroExtend(S, MaxType); | ||||||||||||||||||||
| 1022 | Size = SE->getTruncateOrZeroExtend(Size, MaxType); | ||||||||||||||||||||
| 1023 | |||||||||||||||||||||
| 1024 | // Special check for addrecs using BE taken count | ||||||||||||||||||||
| 1025 | const SCEV *Bound = SE->getMinusSCEV(S, Size); | ||||||||||||||||||||
| 1026 | if (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Bound)) { | ||||||||||||||||||||
| 1027 | if (AddRec->isAffine()) { | ||||||||||||||||||||
| 1028 | const SCEV *BECount = SE->getBackedgeTakenCount(AddRec->getLoop()); | ||||||||||||||||||||
| 1029 | if (!isa<SCEVCouldNotCompute>(BECount)) { | ||||||||||||||||||||
| 1030 | const SCEV *Limit = AddRec->evaluateAtIteration(BECount, *SE); | ||||||||||||||||||||
| 1031 | if (SE->isKnownNegative(Limit)) | ||||||||||||||||||||
| 1032 | return true; | ||||||||||||||||||||
| 1033 | } | ||||||||||||||||||||
| 1034 | } | ||||||||||||||||||||
| 1035 | } | ||||||||||||||||||||
| 1036 | |||||||||||||||||||||
| 1037 | // Check using normal isKnownNegative | ||||||||||||||||||||
| 1038 | const SCEV *LimitedBound = | ||||||||||||||||||||
| 1039 | SE->getMinusSCEV(S, SE->getSMaxExpr(Size, SE->getOne(Size->getType()))); | ||||||||||||||||||||
| 1040 | return SE->isKnownNegative(LimitedBound); | ||||||||||||||||||||
| 1041 | } | ||||||||||||||||||||
| 1042 | |||||||||||||||||||||
| 1043 | bool DependenceInfo::isKnownNonNegative(const SCEV *S, const Value *Ptr) const { | ||||||||||||||||||||
| 1044 | bool Inbounds = false; | ||||||||||||||||||||
| 1045 | if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(Ptr)) | ||||||||||||||||||||
| 1046 | Inbounds = SrcGEP->isInBounds(); | ||||||||||||||||||||
| 1047 | if (Inbounds) { | ||||||||||||||||||||
| 1048 | if (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(S)) { | ||||||||||||||||||||
| 1049 | if (AddRec->isAffine()) { | ||||||||||||||||||||
| 1050 | // We know S is for Ptr, the operand on a load/store, so doesn't wrap. | ||||||||||||||||||||
| 1051 | // If both parts are NonNegative, the end result will be NonNegative | ||||||||||||||||||||
| 1052 | if (SE->isKnownNonNegative(AddRec->getStart()) && | ||||||||||||||||||||
| 1053 | SE->isKnownNonNegative(AddRec->getOperand(1))) | ||||||||||||||||||||
| 1054 | return true; | ||||||||||||||||||||
| 1055 | } | ||||||||||||||||||||
| 1056 | } | ||||||||||||||||||||
| 1057 | } | ||||||||||||||||||||
| 1058 | |||||||||||||||||||||
| 1059 | return SE->isKnownNonNegative(S); | ||||||||||||||||||||
| 1060 | } | ||||||||||||||||||||
| 1061 | |||||||||||||||||||||
| 1062 | // All subscripts are all the same type. | ||||||||||||||||||||
| 1063 | // Loop bound may be smaller (e.g., a char). | ||||||||||||||||||||
| 1064 | // Should zero extend loop bound, since it's always >= 0. | ||||||||||||||||||||
| 1065 | // This routine collects upper bound and extends or truncates if needed. | ||||||||||||||||||||
| 1066 | // Truncating is safe when subscripts are known not to wrap. Cases without | ||||||||||||||||||||
| 1067 | // nowrap flags should have been rejected earlier. | ||||||||||||||||||||
| 1068 | // Return null if no bound available. | ||||||||||||||||||||
| 1069 | const SCEV *DependenceInfo::collectUpperBound(const Loop *L, Type *T) const { | ||||||||||||||||||||
| 1070 | if (SE->hasLoopInvariantBackedgeTakenCount(L)) { | ||||||||||||||||||||
| 1071 | const SCEV *UB = SE->getBackedgeTakenCount(L); | ||||||||||||||||||||
| 1072 | return SE->getTruncateOrZeroExtend(UB, T); | ||||||||||||||||||||
| 1073 | } | ||||||||||||||||||||
| 1074 | return nullptr; | ||||||||||||||||||||
| 1075 | } | ||||||||||||||||||||
| 1076 | |||||||||||||||||||||
| 1077 | |||||||||||||||||||||
| 1078 | // Calls collectUpperBound(), then attempts to cast it to SCEVConstant. | ||||||||||||||||||||
| 1079 | // If the cast fails, returns NULL. | ||||||||||||||||||||
| 1080 | const SCEVConstant *DependenceInfo::collectConstantUpperBound(const Loop *L, | ||||||||||||||||||||
| 1081 | Type *T) const { | ||||||||||||||||||||
| 1082 | if (const SCEV *UB = collectUpperBound(L, T)) | ||||||||||||||||||||
| 1083 | return dyn_cast<SCEVConstant>(UB); | ||||||||||||||||||||
| 1084 | return nullptr; | ||||||||||||||||||||
| 1085 | } | ||||||||||||||||||||
| 1086 | |||||||||||||||||||||
| 1087 | |||||||||||||||||||||
| 1088 | // testZIV - | ||||||||||||||||||||
| 1089 | // When we have a pair of subscripts of the form [c1] and [c2], | ||||||||||||||||||||
| 1090 | // where c1 and c2 are both loop invariant, we attack it using | ||||||||||||||||||||
| 1091 | // the ZIV test. Basically, we test by comparing the two values, | ||||||||||||||||||||
| 1092 | // but there are actually three possible results: | ||||||||||||||||||||
| 1093 | // 1) the values are equal, so there's a dependence | ||||||||||||||||||||
| 1094 | // 2) the values are different, so there's no dependence | ||||||||||||||||||||
| 1095 | // 3) the values might be equal, so we have to assume a dependence. | ||||||||||||||||||||
| 1096 | // | ||||||||||||||||||||
| 1097 | // Return true if dependence disproved. | ||||||||||||||||||||
| 1098 | bool DependenceInfo::testZIV(const SCEV *Src, const SCEV *Dst, | ||||||||||||||||||||
| 1099 | FullDependence &Result) const { | ||||||||||||||||||||
| 1100 | LLVM_DEBUG(dbgs() << " src = " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 1101 | LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 1102 | ++ZIVapplications; | ||||||||||||||||||||
| 1103 | if (isKnownPredicate(CmpInst::ICMP_EQ, Src, Dst)) { | ||||||||||||||||||||
| 1104 | LLVM_DEBUG(dbgs() << " provably dependent\n")do { } while (false); | ||||||||||||||||||||
| 1105 | return false; // provably dependent | ||||||||||||||||||||
| 1106 | } | ||||||||||||||||||||
| 1107 | if (isKnownPredicate(CmpInst::ICMP_NE, Src, Dst)) { | ||||||||||||||||||||
| 1108 | LLVM_DEBUG(dbgs() << " provably independent\n")do { } while (false); | ||||||||||||||||||||
| 1109 | ++ZIVindependence; | ||||||||||||||||||||
| 1110 | return true; // provably independent | ||||||||||||||||||||
| 1111 | } | ||||||||||||||||||||
| 1112 | LLVM_DEBUG(dbgs() << " possibly dependent\n")do { } while (false); | ||||||||||||||||||||
| 1113 | Result.Consistent = false; | ||||||||||||||||||||
| 1114 | return false; // possibly dependent | ||||||||||||||||||||
| 1115 | } | ||||||||||||||||||||
| 1116 | |||||||||||||||||||||
| 1117 | |||||||||||||||||||||
| 1118 | // strongSIVtest - | ||||||||||||||||||||
| 1119 | // From the paper, Practical Dependence Testing, Section 4.2.1 | ||||||||||||||||||||
| 1120 | // | ||||||||||||||||||||
| 1121 | // When we have a pair of subscripts of the form [c1 + a*i] and [c2 + a*i], | ||||||||||||||||||||
| 1122 | // where i is an induction variable, c1 and c2 are loop invariant, | ||||||||||||||||||||
| 1123 | // and a is a constant, we can solve it exactly using the Strong SIV test. | ||||||||||||||||||||
| 1124 | // | ||||||||||||||||||||
| 1125 | // Can prove independence. Failing that, can compute distance (and direction). | ||||||||||||||||||||
| 1126 | // In the presence of symbolic terms, we can sometimes make progress. | ||||||||||||||||||||
| 1127 | // | ||||||||||||||||||||
| 1128 | // If there's a dependence, | ||||||||||||||||||||
| 1129 | // | ||||||||||||||||||||
| 1130 | // c1 + a*i = c2 + a*i' | ||||||||||||||||||||
| 1131 | // | ||||||||||||||||||||
| 1132 | // The dependence distance is | ||||||||||||||||||||
| 1133 | // | ||||||||||||||||||||
| 1134 | // d = i' - i = (c1 - c2)/a | ||||||||||||||||||||
| 1135 | // | ||||||||||||||||||||
| 1136 | // A dependence only exists if d is an integer and abs(d) <= U, where U is the | ||||||||||||||||||||
| 1137 | // loop's upper bound. If a dependence exists, the dependence direction is | ||||||||||||||||||||
| 1138 | // defined as | ||||||||||||||||||||
| 1139 | // | ||||||||||||||||||||
| 1140 | // { < if d > 0 | ||||||||||||||||||||
| 1141 | // direction = { = if d = 0 | ||||||||||||||||||||
| 1142 | // { > if d < 0 | ||||||||||||||||||||
| 1143 | // | ||||||||||||||||||||
| 1144 | // Return true if dependence disproved. | ||||||||||||||||||||
| 1145 | bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst, | ||||||||||||||||||||
| 1146 | const SCEV *DstConst, const Loop *CurLoop, | ||||||||||||||||||||
| 1147 | unsigned Level, FullDependence &Result, | ||||||||||||||||||||
| 1148 | Constraint &NewConstraint) const { | ||||||||||||||||||||
| 1149 | LLVM_DEBUG(dbgs() << "\tStrong SIV test\n")do { } while (false); | ||||||||||||||||||||
| 1150 | LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff)do { } while (false); | ||||||||||||||||||||
| 1151 | LLVM_DEBUG(dbgs() << ", " << *Coeff->getType() << "\n")do { } while (false); | ||||||||||||||||||||
| 1152 | LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst)do { } while (false); | ||||||||||||||||||||
| 1153 | LLVM_DEBUG(dbgs() << ", " << *SrcConst->getType() << "\n")do { } while (false); | ||||||||||||||||||||
| 1154 | LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst)do { } while (false); | ||||||||||||||||||||
| 1155 | LLVM_DEBUG(dbgs() << ", " << *DstConst->getType() << "\n")do { } while (false); | ||||||||||||||||||||
| 1156 | ++StrongSIVapplications; | ||||||||||||||||||||
| 1157 | assert(0 < Level && Level <= CommonLevels && "level out of range")((void)0); | ||||||||||||||||||||
| 1158 | Level--; | ||||||||||||||||||||
| 1159 | |||||||||||||||||||||
| 1160 | const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst); | ||||||||||||||||||||
| 1161 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta)do { } while (false); | ||||||||||||||||||||
| 1162 | LLVM_DEBUG(dbgs() << ", " << *Delta->getType() << "\n")do { } while (false); | ||||||||||||||||||||
| 1163 | |||||||||||||||||||||
| 1164 | // check that |Delta| < iteration count | ||||||||||||||||||||
| 1165 | if (const SCEV *UpperBound = collectUpperBound(CurLoop, Delta->getType())) { | ||||||||||||||||||||
| 1166 | LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound)do { } while (false); | ||||||||||||||||||||
| 1167 | LLVM_DEBUG(dbgs() << ", " << *UpperBound->getType() << "\n")do { } while (false); | ||||||||||||||||||||
| 1168 | const SCEV *AbsDelta = | ||||||||||||||||||||
| 1169 | SE->isKnownNonNegative(Delta) ? Delta : SE->getNegativeSCEV(Delta); | ||||||||||||||||||||
| 1170 | const SCEV *AbsCoeff = | ||||||||||||||||||||
| 1171 | SE->isKnownNonNegative(Coeff) ? Coeff : SE->getNegativeSCEV(Coeff); | ||||||||||||||||||||
| 1172 | const SCEV *Product = SE->getMulExpr(UpperBound, AbsCoeff); | ||||||||||||||||||||
| 1173 | if (isKnownPredicate(CmpInst::ICMP_SGT, AbsDelta, Product)) { | ||||||||||||||||||||
| 1174 | // Distance greater than trip count - no dependence | ||||||||||||||||||||
| 1175 | ++StrongSIVindependence; | ||||||||||||||||||||
| 1176 | ++StrongSIVsuccesses; | ||||||||||||||||||||
| 1177 | return true; | ||||||||||||||||||||
| 1178 | } | ||||||||||||||||||||
| 1179 | } | ||||||||||||||||||||
| 1180 | |||||||||||||||||||||
| 1181 | // Can we compute distance? | ||||||||||||||||||||
| 1182 | if (isa<SCEVConstant>(Delta) && isa<SCEVConstant>(Coeff)) { | ||||||||||||||||||||
| 1183 | APInt ConstDelta = cast<SCEVConstant>(Delta)->getAPInt(); | ||||||||||||||||||||
| 1184 | APInt ConstCoeff = cast<SCEVConstant>(Coeff)->getAPInt(); | ||||||||||||||||||||
| 1185 | APInt Distance = ConstDelta; // these need to be initialized | ||||||||||||||||||||
| 1186 | APInt Remainder = ConstDelta; | ||||||||||||||||||||
| 1187 | APInt::sdivrem(ConstDelta, ConstCoeff, Distance, Remainder); | ||||||||||||||||||||
| 1188 | LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n")do { } while (false); | ||||||||||||||||||||
| 1189 | LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n")do { } while (false); | ||||||||||||||||||||
| 1190 | // Make sure Coeff divides Delta exactly | ||||||||||||||||||||
| 1191 | if (Remainder != 0) { | ||||||||||||||||||||
| 1192 | // Coeff doesn't divide Distance, no dependence | ||||||||||||||||||||
| 1193 | ++StrongSIVindependence; | ||||||||||||||||||||
| 1194 | ++StrongSIVsuccesses; | ||||||||||||||||||||
| 1195 | return true; | ||||||||||||||||||||
| 1196 | } | ||||||||||||||||||||
| 1197 | Result.DV[Level].Distance = SE->getConstant(Distance); | ||||||||||||||||||||
| 1198 | NewConstraint.setDistance(SE->getConstant(Distance), CurLoop); | ||||||||||||||||||||
| 1199 | if (Distance.sgt(0)) | ||||||||||||||||||||
| 1200 | Result.DV[Level].Direction &= Dependence::DVEntry::LT; | ||||||||||||||||||||
| 1201 | else if (Distance.slt(0)) | ||||||||||||||||||||
| 1202 | Result.DV[Level].Direction &= Dependence::DVEntry::GT; | ||||||||||||||||||||
| 1203 | else | ||||||||||||||||||||
| 1204 | Result.DV[Level].Direction &= Dependence::DVEntry::EQ; | ||||||||||||||||||||
| 1205 | ++StrongSIVsuccesses; | ||||||||||||||||||||
| 1206 | } | ||||||||||||||||||||
| 1207 | else if (Delta->isZero()) { | ||||||||||||||||||||
| 1208 | // since 0/X == 0 | ||||||||||||||||||||
| 1209 | Result.DV[Level].Distance = Delta; | ||||||||||||||||||||
| 1210 | NewConstraint.setDistance(Delta, CurLoop); | ||||||||||||||||||||
| 1211 | Result.DV[Level].Direction &= Dependence::DVEntry::EQ; | ||||||||||||||||||||
| 1212 | ++StrongSIVsuccesses; | ||||||||||||||||||||
| 1213 | } | ||||||||||||||||||||
| 1214 | else { | ||||||||||||||||||||
| 1215 | if (Coeff->isOne()) { | ||||||||||||||||||||
| 1216 | LLVM_DEBUG(dbgs() << "\t Distance = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1217 | Result.DV[Level].Distance = Delta; // since X/1 == X | ||||||||||||||||||||
| 1218 | NewConstraint.setDistance(Delta, CurLoop); | ||||||||||||||||||||
| 1219 | } | ||||||||||||||||||||
| 1220 | else { | ||||||||||||||||||||
| 1221 | Result.Consistent = false; | ||||||||||||||||||||
| 1222 | NewConstraint.setLine(Coeff, | ||||||||||||||||||||
| 1223 | SE->getNegativeSCEV(Coeff), | ||||||||||||||||||||
| 1224 | SE->getNegativeSCEV(Delta), CurLoop); | ||||||||||||||||||||
| 1225 | } | ||||||||||||||||||||
| 1226 | |||||||||||||||||||||
| 1227 | // maybe we can get a useful direction | ||||||||||||||||||||
| 1228 | bool DeltaMaybeZero = !SE->isKnownNonZero(Delta); | ||||||||||||||||||||
| 1229 | bool DeltaMaybePositive = !SE->isKnownNonPositive(Delta); | ||||||||||||||||||||
| 1230 | bool DeltaMaybeNegative = !SE->isKnownNonNegative(Delta); | ||||||||||||||||||||
| 1231 | bool CoeffMaybePositive = !SE->isKnownNonPositive(Coeff); | ||||||||||||||||||||
| 1232 | bool CoeffMaybeNegative = !SE->isKnownNonNegative(Coeff); | ||||||||||||||||||||
| 1233 | // The double negatives above are confusing. | ||||||||||||||||||||
| 1234 | // It helps to read !SE->isKnownNonZero(Delta) | ||||||||||||||||||||
| 1235 | // as "Delta might be Zero" | ||||||||||||||||||||
| 1236 | unsigned NewDirection = Dependence::DVEntry::NONE; | ||||||||||||||||||||
| 1237 | if ((DeltaMaybePositive && CoeffMaybePositive) || | ||||||||||||||||||||
| 1238 | (DeltaMaybeNegative && CoeffMaybeNegative)) | ||||||||||||||||||||
| 1239 | NewDirection = Dependence::DVEntry::LT; | ||||||||||||||||||||
| 1240 | if (DeltaMaybeZero) | ||||||||||||||||||||
| 1241 | NewDirection |= Dependence::DVEntry::EQ; | ||||||||||||||||||||
| 1242 | if ((DeltaMaybeNegative && CoeffMaybePositive) || | ||||||||||||||||||||
| 1243 | (DeltaMaybePositive && CoeffMaybeNegative)) | ||||||||||||||||||||
| 1244 | NewDirection |= Dependence::DVEntry::GT; | ||||||||||||||||||||
| 1245 | if (NewDirection < Result.DV[Level].Direction) | ||||||||||||||||||||
| 1246 | ++StrongSIVsuccesses; | ||||||||||||||||||||
| 1247 | Result.DV[Level].Direction &= NewDirection; | ||||||||||||||||||||
| 1248 | } | ||||||||||||||||||||
| 1249 | return false; | ||||||||||||||||||||
| 1250 | } | ||||||||||||||||||||
| 1251 | |||||||||||||||||||||
| 1252 | |||||||||||||||||||||
| 1253 | // weakCrossingSIVtest - | ||||||||||||||||||||
| 1254 | // From the paper, Practical Dependence Testing, Section 4.2.2 | ||||||||||||||||||||
| 1255 | // | ||||||||||||||||||||
| 1256 | // When we have a pair of subscripts of the form [c1 + a*i] and [c2 - a*i], | ||||||||||||||||||||
| 1257 | // where i is an induction variable, c1 and c2 are loop invariant, | ||||||||||||||||||||
| 1258 | // and a is a constant, we can solve it exactly using the | ||||||||||||||||||||
| 1259 | // Weak-Crossing SIV test. | ||||||||||||||||||||
| 1260 | // | ||||||||||||||||||||
| 1261 | // Given c1 + a*i = c2 - a*i', we can look for the intersection of | ||||||||||||||||||||
| 1262 | // the two lines, where i = i', yielding | ||||||||||||||||||||
| 1263 | // | ||||||||||||||||||||
| 1264 | // c1 + a*i = c2 - a*i | ||||||||||||||||||||
| 1265 | // 2a*i = c2 - c1 | ||||||||||||||||||||
| 1266 | // i = (c2 - c1)/2a | ||||||||||||||||||||
| 1267 | // | ||||||||||||||||||||
| 1268 | // If i < 0, there is no dependence. | ||||||||||||||||||||
| 1269 | // If i > upperbound, there is no dependence. | ||||||||||||||||||||
| 1270 | // If i = 0 (i.e., if c1 = c2), there's a dependence with distance = 0. | ||||||||||||||||||||
| 1271 | // If i = upperbound, there's a dependence with distance = 0. | ||||||||||||||||||||
| 1272 | // If i is integral, there's a dependence (all directions). | ||||||||||||||||||||
| 1273 | // If the non-integer part = 1/2, there's a dependence (<> directions). | ||||||||||||||||||||
| 1274 | // Otherwise, there's no dependence. | ||||||||||||||||||||
| 1275 | // | ||||||||||||||||||||
| 1276 | // Can prove independence. Failing that, | ||||||||||||||||||||
| 1277 | // can sometimes refine the directions. | ||||||||||||||||||||
| 1278 | // Can determine iteration for splitting. | ||||||||||||||||||||
| 1279 | // | ||||||||||||||||||||
| 1280 | // Return true if dependence disproved. | ||||||||||||||||||||
| 1281 | bool DependenceInfo::weakCrossingSIVtest( | ||||||||||||||||||||
| 1282 | const SCEV *Coeff, const SCEV *SrcConst, const SCEV *DstConst, | ||||||||||||||||||||
| 1283 | const Loop *CurLoop, unsigned Level, FullDependence &Result, | ||||||||||||||||||||
| 1284 | Constraint &NewConstraint, const SCEV *&SplitIter) const { | ||||||||||||||||||||
| 1285 | LLVM_DEBUG(dbgs() << "\tWeak-Crossing SIV test\n")do { } while (false); | ||||||||||||||||||||
| 1286 | LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n")do { } while (false); | ||||||||||||||||||||
| 1287 | LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1288 | LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1289 | ++WeakCrossingSIVapplications; | ||||||||||||||||||||
| 1290 | assert(0 < Level && Level <= CommonLevels && "Level out of range")((void)0); | ||||||||||||||||||||
| 1291 | Level--; | ||||||||||||||||||||
| 1292 | Result.Consistent = false; | ||||||||||||||||||||
| 1293 | const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); | ||||||||||||||||||||
| 1294 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1295 | NewConstraint.setLine(Coeff, Coeff, Delta, CurLoop); | ||||||||||||||||||||
| 1296 | if (Delta->isZero()) { | ||||||||||||||||||||
| 1297 | Result.DV[Level].Direction &= unsigned(~Dependence::DVEntry::LT); | ||||||||||||||||||||
| 1298 | Result.DV[Level].Direction &= unsigned(~Dependence::DVEntry::GT); | ||||||||||||||||||||
| 1299 | ++WeakCrossingSIVsuccesses; | ||||||||||||||||||||
| 1300 | if (!Result.DV[Level].Direction) { | ||||||||||||||||||||
| 1301 | ++WeakCrossingSIVindependence; | ||||||||||||||||||||
| 1302 | return true; | ||||||||||||||||||||
| 1303 | } | ||||||||||||||||||||
| 1304 | Result.DV[Level].Distance = Delta; // = 0 | ||||||||||||||||||||
| 1305 | return false; | ||||||||||||||||||||
| 1306 | } | ||||||||||||||||||||
| 1307 | const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(Coeff); | ||||||||||||||||||||
| 1308 | if (!ConstCoeff) | ||||||||||||||||||||
| 1309 | return false; | ||||||||||||||||||||
| 1310 | |||||||||||||||||||||
| 1311 | Result.DV[Level].Splitable = true; | ||||||||||||||||||||
| 1312 | if (SE->isKnownNegative(ConstCoeff)) { | ||||||||||||||||||||
| 1313 | ConstCoeff = dyn_cast<SCEVConstant>(SE->getNegativeSCEV(ConstCoeff)); | ||||||||||||||||||||
| 1314 | assert(ConstCoeff &&((void)0) | ||||||||||||||||||||
| 1315 | "dynamic cast of negative of ConstCoeff should yield constant")((void)0); | ||||||||||||||||||||
| 1316 | Delta = SE->getNegativeSCEV(Delta); | ||||||||||||||||||||
| 1317 | } | ||||||||||||||||||||
| 1318 | assert(SE->isKnownPositive(ConstCoeff) && "ConstCoeff should be positive")((void)0); | ||||||||||||||||||||
| 1319 | |||||||||||||||||||||
| 1320 | // compute SplitIter for use by DependenceInfo::getSplitIteration() | ||||||||||||||||||||
| 1321 | SplitIter = SE->getUDivExpr( | ||||||||||||||||||||
| 1322 | SE->getSMaxExpr(SE->getZero(Delta->getType()), Delta), | ||||||||||||||||||||
| 1323 | SE->getMulExpr(SE->getConstant(Delta->getType(), 2), ConstCoeff)); | ||||||||||||||||||||
| 1324 | LLVM_DEBUG(dbgs() << "\t Split iter = " << *SplitIter << "\n")do { } while (false); | ||||||||||||||||||||
| 1325 | |||||||||||||||||||||
| 1326 | const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta); | ||||||||||||||||||||
| 1327 | if (!ConstDelta) | ||||||||||||||||||||
| 1328 | return false; | ||||||||||||||||||||
| 1329 | |||||||||||||||||||||
| 1330 | // We're certain that ConstCoeff > 0; therefore, | ||||||||||||||||||||
| 1331 | // if Delta < 0, then no dependence. | ||||||||||||||||||||
| 1332 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1333 | LLVM_DEBUG(dbgs() << "\t ConstCoeff = " << *ConstCoeff << "\n")do { } while (false); | ||||||||||||||||||||
| 1334 | if (SE->isKnownNegative(Delta)) { | ||||||||||||||||||||
| 1335 | // No dependence, Delta < 0 | ||||||||||||||||||||
| 1336 | ++WeakCrossingSIVindependence; | ||||||||||||||||||||
| 1337 | ++WeakCrossingSIVsuccesses; | ||||||||||||||||||||
| 1338 | return true; | ||||||||||||||||||||
| 1339 | } | ||||||||||||||||||||
| 1340 | |||||||||||||||||||||
| 1341 | // We're certain that Delta > 0 and ConstCoeff > 0. | ||||||||||||||||||||
| 1342 | // Check Delta/(2*ConstCoeff) against upper loop bound | ||||||||||||||||||||
| 1343 | if (const SCEV *UpperBound = collectUpperBound(CurLoop, Delta->getType())) { | ||||||||||||||||||||
| 1344 | LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n")do { } while (false); | ||||||||||||||||||||
| 1345 | const SCEV *ConstantTwo = SE->getConstant(UpperBound->getType(), 2); | ||||||||||||||||||||
| 1346 | const SCEV *ML = SE->getMulExpr(SE->getMulExpr(ConstCoeff, UpperBound), | ||||||||||||||||||||
| 1347 | ConstantTwo); | ||||||||||||||||||||
| 1348 | LLVM_DEBUG(dbgs() << "\t ML = " << *ML << "\n")do { } while (false); | ||||||||||||||||||||
| 1349 | if (isKnownPredicate(CmpInst::ICMP_SGT, Delta, ML)) { | ||||||||||||||||||||
| 1350 | // Delta too big, no dependence | ||||||||||||||||||||
| 1351 | ++WeakCrossingSIVindependence; | ||||||||||||||||||||
| 1352 | ++WeakCrossingSIVsuccesses; | ||||||||||||||||||||
| 1353 | return true; | ||||||||||||||||||||
| 1354 | } | ||||||||||||||||||||
| 1355 | if (isKnownPredicate(CmpInst::ICMP_EQ, Delta, ML)) { | ||||||||||||||||||||
| 1356 | // i = i' = UB | ||||||||||||||||||||
| 1357 | Result.DV[Level].Direction &= unsigned(~Dependence::DVEntry::LT); | ||||||||||||||||||||
| 1358 | Result.DV[Level].Direction &= unsigned(~Dependence::DVEntry::GT); | ||||||||||||||||||||
| 1359 | ++WeakCrossingSIVsuccesses; | ||||||||||||||||||||
| 1360 | if (!Result.DV[Level].Direction) { | ||||||||||||||||||||
| 1361 | ++WeakCrossingSIVindependence; | ||||||||||||||||||||
| 1362 | return true; | ||||||||||||||||||||
| 1363 | } | ||||||||||||||||||||
| 1364 | Result.DV[Level].Splitable = false; | ||||||||||||||||||||
| 1365 | Result.DV[Level].Distance = SE->getZero(Delta->getType()); | ||||||||||||||||||||
| 1366 | return false; | ||||||||||||||||||||
| 1367 | } | ||||||||||||||||||||
| 1368 | } | ||||||||||||||||||||
| 1369 | |||||||||||||||||||||
| 1370 | // check that Coeff divides Delta | ||||||||||||||||||||
| 1371 | APInt APDelta = ConstDelta->getAPInt(); | ||||||||||||||||||||
| 1372 | APInt APCoeff = ConstCoeff->getAPInt(); | ||||||||||||||||||||
| 1373 | APInt Distance = APDelta; // these need to be initialzed | ||||||||||||||||||||
| 1374 | APInt Remainder = APDelta; | ||||||||||||||||||||
| 1375 | APInt::sdivrem(APDelta, APCoeff, Distance, Remainder); | ||||||||||||||||||||
| 1376 | LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n")do { } while (false); | ||||||||||||||||||||
| 1377 | if (Remainder != 0) { | ||||||||||||||||||||
| 1378 | // Coeff doesn't divide Delta, no dependence | ||||||||||||||||||||
| 1379 | ++WeakCrossingSIVindependence; | ||||||||||||||||||||
| 1380 | ++WeakCrossingSIVsuccesses; | ||||||||||||||||||||
| 1381 | return true; | ||||||||||||||||||||
| 1382 | } | ||||||||||||||||||||
| 1383 | LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n")do { } while (false); | ||||||||||||||||||||
| 1384 | |||||||||||||||||||||
| 1385 | // if 2*Coeff doesn't divide Delta, then the equal direction isn't possible | ||||||||||||||||||||
| 1386 | APInt Two = APInt(Distance.getBitWidth(), 2, true); | ||||||||||||||||||||
| 1387 | Remainder = Distance.srem(Two); | ||||||||||||||||||||
| 1388 | LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n")do { } while (false); | ||||||||||||||||||||
| 1389 | if (Remainder != 0) { | ||||||||||||||||||||
| 1390 | // Equal direction isn't possible | ||||||||||||||||||||
| 1391 | Result.DV[Level].Direction &= unsigned(~Dependence::DVEntry::EQ); | ||||||||||||||||||||
| 1392 | ++WeakCrossingSIVsuccesses; | ||||||||||||||||||||
| 1393 | } | ||||||||||||||||||||
| 1394 | return false; | ||||||||||||||||||||
| 1395 | } | ||||||||||||||||||||
| 1396 | |||||||||||||||||||||
| 1397 | |||||||||||||||||||||
| 1398 | // Kirch's algorithm, from | ||||||||||||||||||||
| 1399 | // | ||||||||||||||||||||
| 1400 | // Optimizing Supercompilers for Supercomputers | ||||||||||||||||||||
| 1401 | // Michael Wolfe | ||||||||||||||||||||
| 1402 | // MIT Press, 1989 | ||||||||||||||||||||
| 1403 | // | ||||||||||||||||||||
| 1404 | // Program 2.1, page 29. | ||||||||||||||||||||
| 1405 | // Computes the GCD of AM and BM. | ||||||||||||||||||||
| 1406 | // Also finds a solution to the equation ax - by = gcd(a, b). | ||||||||||||||||||||
| 1407 | // Returns true if dependence disproved; i.e., gcd does not divide Delta. | ||||||||||||||||||||
| 1408 | static bool findGCD(unsigned Bits, const APInt &AM, const APInt &BM, | ||||||||||||||||||||
| 1409 | const APInt &Delta, APInt &G, APInt &X, APInt &Y) { | ||||||||||||||||||||
| 1410 | APInt A0(Bits, 1, true), A1(Bits, 0, true); | ||||||||||||||||||||
| 1411 | APInt B0(Bits, 0, true), B1(Bits, 1, true); | ||||||||||||||||||||
| 1412 | APInt G0 = AM.abs(); | ||||||||||||||||||||
| 1413 | APInt G1 = BM.abs(); | ||||||||||||||||||||
| 1414 | APInt Q = G0; // these need to be initialized | ||||||||||||||||||||
| 1415 | APInt R = G0; | ||||||||||||||||||||
| 1416 | APInt::sdivrem(G0, G1, Q, R); | ||||||||||||||||||||
| 1417 | while (R != 0) { | ||||||||||||||||||||
| 1418 | APInt A2 = A0 - Q*A1; A0 = A1; A1 = A2; | ||||||||||||||||||||
| 1419 | APInt B2 = B0 - Q*B1; B0 = B1; B1 = B2; | ||||||||||||||||||||
| 1420 | G0 = G1; G1 = R; | ||||||||||||||||||||
| 1421 | APInt::sdivrem(G0, G1, Q, R); | ||||||||||||||||||||
| 1422 | } | ||||||||||||||||||||
| 1423 | G = G1; | ||||||||||||||||||||
| 1424 | LLVM_DEBUG(dbgs() << "\t GCD = " << G << "\n")do { } while (false); | ||||||||||||||||||||
| 1425 | X = AM.slt(0) ? -A1 : A1; | ||||||||||||||||||||
| 1426 | Y = BM.slt(0) ? B1 : -B1; | ||||||||||||||||||||
| 1427 | |||||||||||||||||||||
| 1428 | // make sure gcd divides Delta | ||||||||||||||||||||
| 1429 | R = Delta.srem(G); | ||||||||||||||||||||
| 1430 | if (R != 0) | ||||||||||||||||||||
| 1431 | return true; // gcd doesn't divide Delta, no dependence | ||||||||||||||||||||
| 1432 | Q = Delta.sdiv(G); | ||||||||||||||||||||
| 1433 | return false; | ||||||||||||||||||||
| 1434 | } | ||||||||||||||||||||
| 1435 | |||||||||||||||||||||
| 1436 | static APInt floorOfQuotient(const APInt &A, const APInt &B) { | ||||||||||||||||||||
| 1437 | APInt Q = A; // these need to be initialized | ||||||||||||||||||||
| 1438 | APInt R = A; | ||||||||||||||||||||
| 1439 | APInt::sdivrem(A, B, Q, R); | ||||||||||||||||||||
| 1440 | if (R == 0) | ||||||||||||||||||||
| 1441 | return Q; | ||||||||||||||||||||
| 1442 | if ((A.sgt(0) && B.sgt(0)) || | ||||||||||||||||||||
| 1443 | (A.slt(0) && B.slt(0))) | ||||||||||||||||||||
| 1444 | return Q; | ||||||||||||||||||||
| 1445 | else | ||||||||||||||||||||
| 1446 | return Q - 1; | ||||||||||||||||||||
| 1447 | } | ||||||||||||||||||||
| 1448 | |||||||||||||||||||||
| 1449 | static APInt ceilingOfQuotient(const APInt &A, const APInt &B) { | ||||||||||||||||||||
| 1450 | APInt Q = A; // these need to be initialized | ||||||||||||||||||||
| 1451 | APInt R = A; | ||||||||||||||||||||
| 1452 | APInt::sdivrem(A, B, Q, R); | ||||||||||||||||||||
| 1453 | if (R == 0) | ||||||||||||||||||||
| 1454 | return Q; | ||||||||||||||||||||
| 1455 | if ((A.sgt(0) && B.sgt(0)) || | ||||||||||||||||||||
| 1456 | (A.slt(0) && B.slt(0))) | ||||||||||||||||||||
| 1457 | return Q + 1; | ||||||||||||||||||||
| 1458 | else | ||||||||||||||||||||
| 1459 | return Q; | ||||||||||||||||||||
| 1460 | } | ||||||||||||||||||||
| 1461 | |||||||||||||||||||||
| 1462 | // exactSIVtest - | ||||||||||||||||||||
| 1463 | // When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*i], | ||||||||||||||||||||
| 1464 | // where i is an induction variable, c1 and c2 are loop invariant, and a1 | ||||||||||||||||||||
| 1465 | // and a2 are constant, we can solve it exactly using an algorithm developed | ||||||||||||||||||||
| 1466 | // by Banerjee and Wolfe. See Algorithm 6.2.1 (case 2.5) in: | ||||||||||||||||||||
| 1467 | // | ||||||||||||||||||||
| 1468 | // Dependence Analysis for Supercomputing | ||||||||||||||||||||
| 1469 | // Utpal Banerjee | ||||||||||||||||||||
| 1470 | // Kluwer Academic Publishers, 1988 | ||||||||||||||||||||
| 1471 | // | ||||||||||||||||||||
| 1472 | // It's slower than the specialized tests (strong SIV, weak-zero SIV, etc), | ||||||||||||||||||||
| 1473 | // so use them if possible. They're also a bit better with symbolics and, | ||||||||||||||||||||
| 1474 | // in the case of the strong SIV test, can compute Distances. | ||||||||||||||||||||
| 1475 | // | ||||||||||||||||||||
| 1476 | // Return true if dependence disproved. | ||||||||||||||||||||
| 1477 | // | ||||||||||||||||||||
| 1478 | // This is a modified version of the original Banerjee algorithm. The original | ||||||||||||||||||||
| 1479 | // only tested whether Dst depends on Src. This algorithm extends that and | ||||||||||||||||||||
| 1480 | // returns all the dependencies that exist between Dst and Src. | ||||||||||||||||||||
| 1481 | bool DependenceInfo::exactSIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff, | ||||||||||||||||||||
| 1482 | const SCEV *SrcConst, const SCEV *DstConst, | ||||||||||||||||||||
| 1483 | const Loop *CurLoop, unsigned Level, | ||||||||||||||||||||
| 1484 | FullDependence &Result, | ||||||||||||||||||||
| 1485 | Constraint &NewConstraint) const { | ||||||||||||||||||||
| 1486 | LLVM_DEBUG(dbgs() << "\tExact SIV test\n")do { } while (false); | ||||||||||||||||||||
| 1487 | LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n")do { } while (false); | ||||||||||||||||||||
| 1488 | LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n")do { } while (false); | ||||||||||||||||||||
| 1489 | LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1490 | LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1491 | ++ExactSIVapplications; | ||||||||||||||||||||
| 1492 | assert(0 < Level && Level <= CommonLevels && "Level out of range")((void)0); | ||||||||||||||||||||
| 1493 | Level--; | ||||||||||||||||||||
| 1494 | Result.Consistent = false; | ||||||||||||||||||||
| 1495 | const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); | ||||||||||||||||||||
| 1496 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1497 | NewConstraint.setLine(SrcCoeff, SE->getNegativeSCEV(DstCoeff), Delta, | ||||||||||||||||||||
| 1498 | CurLoop); | ||||||||||||||||||||
| 1499 | const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta); | ||||||||||||||||||||
| 1500 | const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff); | ||||||||||||||||||||
| 1501 | const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff); | ||||||||||||||||||||
| 1502 | if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff) | ||||||||||||||||||||
| 1503 | return false; | ||||||||||||||||||||
| 1504 | |||||||||||||||||||||
| 1505 | // find gcd | ||||||||||||||||||||
| 1506 | APInt G, X, Y; | ||||||||||||||||||||
| 1507 | APInt AM = ConstSrcCoeff->getAPInt(); | ||||||||||||||||||||
| 1508 | APInt BM = ConstDstCoeff->getAPInt(); | ||||||||||||||||||||
| 1509 | APInt CM = ConstDelta->getAPInt(); | ||||||||||||||||||||
| 1510 | unsigned Bits = AM.getBitWidth(); | ||||||||||||||||||||
| 1511 | if (findGCD(Bits, AM, BM, CM, G, X, Y)) { | ||||||||||||||||||||
| 1512 | // gcd doesn't divide Delta, no dependence | ||||||||||||||||||||
| 1513 | ++ExactSIVindependence; | ||||||||||||||||||||
| 1514 | ++ExactSIVsuccesses; | ||||||||||||||||||||
| 1515 | return true; | ||||||||||||||||||||
| 1516 | } | ||||||||||||||||||||
| 1517 | |||||||||||||||||||||
| 1518 | LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n")do { } while (false); | ||||||||||||||||||||
| 1519 | |||||||||||||||||||||
| 1520 | // since SCEV construction normalizes, LM = 0 | ||||||||||||||||||||
| 1521 | APInt UM(Bits, 1, true); | ||||||||||||||||||||
| 1522 | bool UMValid = false; | ||||||||||||||||||||
| 1523 | // UM is perhaps unavailable, let's check | ||||||||||||||||||||
| 1524 | if (const SCEVConstant *CUB = | ||||||||||||||||||||
| 1525 | collectConstantUpperBound(CurLoop, Delta->getType())) { | ||||||||||||||||||||
| 1526 | UM = CUB->getAPInt(); | ||||||||||||||||||||
| 1527 | LLVM_DEBUG(dbgs() << "\t UM = " << UM << "\n")do { } while (false); | ||||||||||||||||||||
| 1528 | UMValid = true; | ||||||||||||||||||||
| 1529 | } | ||||||||||||||||||||
| 1530 | |||||||||||||||||||||
| 1531 | APInt TU(APInt::getSignedMaxValue(Bits)); | ||||||||||||||||||||
| 1532 | APInt TL(APInt::getSignedMinValue(Bits)); | ||||||||||||||||||||
| 1533 | APInt TC = CM.sdiv(G); | ||||||||||||||||||||
| 1534 | APInt TX = X * TC; | ||||||||||||||||||||
| 1535 | APInt TY = Y * TC; | ||||||||||||||||||||
| 1536 | LLVM_DEBUG(dbgs() << "\t TC = " << TC << "\n")do { } while (false); | ||||||||||||||||||||
| 1537 | LLVM_DEBUG(dbgs() << "\t TX = " << TX << "\n")do { } while (false); | ||||||||||||||||||||
| 1538 | LLVM_DEBUG(dbgs() << "\t TY = " << TY << "\n")do { } while (false); | ||||||||||||||||||||
| 1539 | |||||||||||||||||||||
| 1540 | SmallVector<APInt, 2> TLVec, TUVec; | ||||||||||||||||||||
| 1541 | APInt TB = BM.sdiv(G); | ||||||||||||||||||||
| 1542 | if (TB.sgt(0)) { | ||||||||||||||||||||
| 1543 | TLVec.push_back(ceilingOfQuotient(-TX, TB)); | ||||||||||||||||||||
| 1544 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1545 | // New bound check - modification to Banerjee's e3 check | ||||||||||||||||||||
| 1546 | if (UMValid) { | ||||||||||||||||||||
| 1547 | TUVec.push_back(floorOfQuotient(UM - TX, TB)); | ||||||||||||||||||||
| 1548 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1549 | } | ||||||||||||||||||||
| 1550 | } else { | ||||||||||||||||||||
| 1551 | TUVec.push_back(floorOfQuotient(-TX, TB)); | ||||||||||||||||||||
| 1552 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1553 | // New bound check - modification to Banerjee's e3 check | ||||||||||||||||||||
| 1554 | if (UMValid) { | ||||||||||||||||||||
| 1555 | TLVec.push_back(ceilingOfQuotient(UM - TX, TB)); | ||||||||||||||||||||
| 1556 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1557 | } | ||||||||||||||||||||
| 1558 | } | ||||||||||||||||||||
| 1559 | |||||||||||||||||||||
| 1560 | APInt TA = AM.sdiv(G); | ||||||||||||||||||||
| 1561 | if (TA.sgt(0)) { | ||||||||||||||||||||
| 1562 | if (UMValid) { | ||||||||||||||||||||
| 1563 | TUVec.push_back(floorOfQuotient(UM - TY, TA)); | ||||||||||||||||||||
| 1564 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1565 | } | ||||||||||||||||||||
| 1566 | // New bound check - modification to Banerjee's e3 check | ||||||||||||||||||||
| 1567 | TLVec.push_back(ceilingOfQuotient(-TY, TA)); | ||||||||||||||||||||
| 1568 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1569 | } else { | ||||||||||||||||||||
| 1570 | if (UMValid) { | ||||||||||||||||||||
| 1571 | TLVec.push_back(ceilingOfQuotient(UM - TY, TA)); | ||||||||||||||||||||
| 1572 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1573 | } | ||||||||||||||||||||
| 1574 | // New bound check - modification to Banerjee's e3 check | ||||||||||||||||||||
| 1575 | TUVec.push_back(floorOfQuotient(-TY, TA)); | ||||||||||||||||||||
| 1576 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1577 | } | ||||||||||||||||||||
| 1578 | |||||||||||||||||||||
| 1579 | LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n")do { } while (false); | ||||||||||||||||||||
| 1580 | LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n")do { } while (false); | ||||||||||||||||||||
| 1581 | |||||||||||||||||||||
| 1582 | if (TLVec.empty() || TUVec.empty()) | ||||||||||||||||||||
| 1583 | return false; | ||||||||||||||||||||
| 1584 | TL = APIntOps::smax(TLVec.front(), TLVec.back()); | ||||||||||||||||||||
| 1585 | TU = APIntOps::smin(TUVec.front(), TUVec.back()); | ||||||||||||||||||||
| 1586 | LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n")do { } while (false); | ||||||||||||||||||||
| 1587 | LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n")do { } while (false); | ||||||||||||||||||||
| 1588 | |||||||||||||||||||||
| 1589 | if (TL.sgt(TU)) { | ||||||||||||||||||||
| 1590 | ++ExactSIVindependence; | ||||||||||||||||||||
| 1591 | ++ExactSIVsuccesses; | ||||||||||||||||||||
| 1592 | return true; | ||||||||||||||||||||
| 1593 | } | ||||||||||||||||||||
| 1594 | |||||||||||||||||||||
| 1595 | // explore directions | ||||||||||||||||||||
| 1596 | unsigned NewDirection = Dependence::DVEntry::NONE; | ||||||||||||||||||||
| 1597 | APInt LowerDistance, UpperDistance; | ||||||||||||||||||||
| 1598 | if (TA.sgt(TB)) { | ||||||||||||||||||||
| 1599 | LowerDistance = (TY - TX) + (TA - TB) * TL; | ||||||||||||||||||||
| 1600 | UpperDistance = (TY - TX) + (TA - TB) * TU; | ||||||||||||||||||||
| 1601 | } else { | ||||||||||||||||||||
| 1602 | LowerDistance = (TY - TX) + (TA - TB) * TU; | ||||||||||||||||||||
| 1603 | UpperDistance = (TY - TX) + (TA - TB) * TL; | ||||||||||||||||||||
| 1604 | } | ||||||||||||||||||||
| 1605 | |||||||||||||||||||||
| 1606 | LLVM_DEBUG(dbgs() << "\t LowerDistance = " << LowerDistance << "\n")do { } while (false); | ||||||||||||||||||||
| 1607 | LLVM_DEBUG(dbgs() << "\t UpperDistance = " << UpperDistance << "\n")do { } while (false); | ||||||||||||||||||||
| 1608 | |||||||||||||||||||||
| 1609 | APInt Zero(Bits, 0, true); | ||||||||||||||||||||
| 1610 | if (LowerDistance.sle(Zero) && UpperDistance.sge(Zero)) { | ||||||||||||||||||||
| 1611 | NewDirection |= Dependence::DVEntry::EQ; | ||||||||||||||||||||
| 1612 | ++ExactSIVsuccesses; | ||||||||||||||||||||
| 1613 | } | ||||||||||||||||||||
| 1614 | if (LowerDistance.slt(0)) { | ||||||||||||||||||||
| 1615 | NewDirection |= Dependence::DVEntry::GT; | ||||||||||||||||||||
| 1616 | ++ExactSIVsuccesses; | ||||||||||||||||||||
| 1617 | } | ||||||||||||||||||||
| 1618 | if (UpperDistance.sgt(0)) { | ||||||||||||||||||||
| 1619 | NewDirection |= Dependence::DVEntry::LT; | ||||||||||||||||||||
| 1620 | ++ExactSIVsuccesses; | ||||||||||||||||||||
| 1621 | } | ||||||||||||||||||||
| 1622 | |||||||||||||||||||||
| 1623 | // finished | ||||||||||||||||||||
| 1624 | Result.DV[Level].Direction &= NewDirection; | ||||||||||||||||||||
| 1625 | if (Result.DV[Level].Direction == Dependence::DVEntry::NONE) | ||||||||||||||||||||
| 1626 | ++ExactSIVindependence; | ||||||||||||||||||||
| 1627 | LLVM_DEBUG(dbgs() << "\t Result = ")do { } while (false); | ||||||||||||||||||||
| 1628 | LLVM_DEBUG(Result.dump(dbgs()))do { } while (false); | ||||||||||||||||||||
| 1629 | return Result.DV[Level].Direction == Dependence::DVEntry::NONE; | ||||||||||||||||||||
| 1630 | } | ||||||||||||||||||||
| 1631 | |||||||||||||||||||||
| 1632 | |||||||||||||||||||||
| 1633 | // Return true if the divisor evenly divides the dividend. | ||||||||||||||||||||
| 1634 | static | ||||||||||||||||||||
| 1635 | bool isRemainderZero(const SCEVConstant *Dividend, | ||||||||||||||||||||
| 1636 | const SCEVConstant *Divisor) { | ||||||||||||||||||||
| 1637 | const APInt &ConstDividend = Dividend->getAPInt(); | ||||||||||||||||||||
| 1638 | const APInt &ConstDivisor = Divisor->getAPInt(); | ||||||||||||||||||||
| 1639 | return ConstDividend.srem(ConstDivisor) == 0; | ||||||||||||||||||||
| 1640 | } | ||||||||||||||||||||
| 1641 | |||||||||||||||||||||
| 1642 | |||||||||||||||||||||
| 1643 | // weakZeroSrcSIVtest - | ||||||||||||||||||||
| 1644 | // From the paper, Practical Dependence Testing, Section 4.2.2 | ||||||||||||||||||||
| 1645 | // | ||||||||||||||||||||
| 1646 | // When we have a pair of subscripts of the form [c1] and [c2 + a*i], | ||||||||||||||||||||
| 1647 | // where i is an induction variable, c1 and c2 are loop invariant, | ||||||||||||||||||||
| 1648 | // and a is a constant, we can solve it exactly using the | ||||||||||||||||||||
| 1649 | // Weak-Zero SIV test. | ||||||||||||||||||||
| 1650 | // | ||||||||||||||||||||
| 1651 | // Given | ||||||||||||||||||||
| 1652 | // | ||||||||||||||||||||
| 1653 | // c1 = c2 + a*i | ||||||||||||||||||||
| 1654 | // | ||||||||||||||||||||
| 1655 | // we get | ||||||||||||||||||||
| 1656 | // | ||||||||||||||||||||
| 1657 | // (c1 - c2)/a = i | ||||||||||||||||||||
| 1658 | // | ||||||||||||||||||||
| 1659 | // If i is not an integer, there's no dependence. | ||||||||||||||||||||
| 1660 | // If i < 0 or > UB, there's no dependence. | ||||||||||||||||||||
| 1661 | // If i = 0, the direction is >= and peeling the | ||||||||||||||||||||
| 1662 | // 1st iteration will break the dependence. | ||||||||||||||||||||
| 1663 | // If i = UB, the direction is <= and peeling the | ||||||||||||||||||||
| 1664 | // last iteration will break the dependence. | ||||||||||||||||||||
| 1665 | // Otherwise, the direction is *. | ||||||||||||||||||||
| 1666 | // | ||||||||||||||||||||
| 1667 | // Can prove independence. Failing that, we can sometimes refine | ||||||||||||||||||||
| 1668 | // the directions. Can sometimes show that first or last | ||||||||||||||||||||
| 1669 | // iteration carries all the dependences (so worth peeling). | ||||||||||||||||||||
| 1670 | // | ||||||||||||||||||||
| 1671 | // (see also weakZeroDstSIVtest) | ||||||||||||||||||||
| 1672 | // | ||||||||||||||||||||
| 1673 | // Return true if dependence disproved. | ||||||||||||||||||||
| 1674 | bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *DstCoeff, | ||||||||||||||||||||
| 1675 | const SCEV *SrcConst, | ||||||||||||||||||||
| 1676 | const SCEV *DstConst, | ||||||||||||||||||||
| 1677 | const Loop *CurLoop, unsigned Level, | ||||||||||||||||||||
| 1678 | FullDependence &Result, | ||||||||||||||||||||
| 1679 | Constraint &NewConstraint) const { | ||||||||||||||||||||
| 1680 | // For the WeakSIV test, it's possible the loop isn't common to | ||||||||||||||||||||
| 1681 | // the Src and Dst loops. If it isn't, then there's no need to | ||||||||||||||||||||
| 1682 | // record a direction. | ||||||||||||||||||||
| 1683 | LLVM_DEBUG(dbgs() << "\tWeak-Zero (src) SIV test\n")do { } while (false); | ||||||||||||||||||||
| 1684 | LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << "\n")do { } while (false); | ||||||||||||||||||||
| 1685 | LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1686 | LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1687 | ++WeakZeroSIVapplications; | ||||||||||||||||||||
| 1688 | assert(0 < Level && Level <= MaxLevels && "Level out of range")((void)0); | ||||||||||||||||||||
| 1689 | Level--; | ||||||||||||||||||||
| 1690 | Result.Consistent = false; | ||||||||||||||||||||
| 1691 | const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst); | ||||||||||||||||||||
| 1692 | NewConstraint.setLine(SE->getZero(Delta->getType()), DstCoeff, Delta, | ||||||||||||||||||||
| 1693 | CurLoop); | ||||||||||||||||||||
| 1694 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1695 | if (isKnownPredicate(CmpInst::ICMP_EQ, SrcConst, DstConst)) { | ||||||||||||||||||||
| 1696 | if (Level < CommonLevels) { | ||||||||||||||||||||
| 1697 | Result.DV[Level].Direction &= Dependence::DVEntry::GE; | ||||||||||||||||||||
| 1698 | Result.DV[Level].PeelFirst = true; | ||||||||||||||||||||
| 1699 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1700 | } | ||||||||||||||||||||
| 1701 | return false; // dependences caused by first iteration | ||||||||||||||||||||
| 1702 | } | ||||||||||||||||||||
| 1703 | const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(DstCoeff); | ||||||||||||||||||||
| 1704 | if (!ConstCoeff) | ||||||||||||||||||||
| 1705 | return false; | ||||||||||||||||||||
| 1706 | const SCEV *AbsCoeff = | ||||||||||||||||||||
| 1707 | SE->isKnownNegative(ConstCoeff) ? | ||||||||||||||||||||
| 1708 | SE->getNegativeSCEV(ConstCoeff) : ConstCoeff; | ||||||||||||||||||||
| 1709 | const SCEV *NewDelta = | ||||||||||||||||||||
| 1710 | SE->isKnownNegative(ConstCoeff) ? SE->getNegativeSCEV(Delta) : Delta; | ||||||||||||||||||||
| 1711 | |||||||||||||||||||||
| 1712 | // check that Delta/SrcCoeff < iteration count | ||||||||||||||||||||
| 1713 | // really check NewDelta < count*AbsCoeff | ||||||||||||||||||||
| 1714 | if (const SCEV *UpperBound = collectUpperBound(CurLoop, Delta->getType())) { | ||||||||||||||||||||
| 1715 | LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n")do { } while (false); | ||||||||||||||||||||
| 1716 | const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound); | ||||||||||||||||||||
| 1717 | if (isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) { | ||||||||||||||||||||
| 1718 | ++WeakZeroSIVindependence; | ||||||||||||||||||||
| 1719 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1720 | return true; | ||||||||||||||||||||
| 1721 | } | ||||||||||||||||||||
| 1722 | if (isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) { | ||||||||||||||||||||
| 1723 | // dependences caused by last iteration | ||||||||||||||||||||
| 1724 | if (Level < CommonLevels) { | ||||||||||||||||||||
| 1725 | Result.DV[Level].Direction &= Dependence::DVEntry::LE; | ||||||||||||||||||||
| 1726 | Result.DV[Level].PeelLast = true; | ||||||||||||||||||||
| 1727 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1728 | } | ||||||||||||||||||||
| 1729 | return false; | ||||||||||||||||||||
| 1730 | } | ||||||||||||||||||||
| 1731 | } | ||||||||||||||||||||
| 1732 | |||||||||||||||||||||
| 1733 | // check that Delta/SrcCoeff >= 0 | ||||||||||||||||||||
| 1734 | // really check that NewDelta >= 0 | ||||||||||||||||||||
| 1735 | if (SE->isKnownNegative(NewDelta)) { | ||||||||||||||||||||
| 1736 | // No dependence, newDelta < 0 | ||||||||||||||||||||
| 1737 | ++WeakZeroSIVindependence; | ||||||||||||||||||||
| 1738 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1739 | return true; | ||||||||||||||||||||
| 1740 | } | ||||||||||||||||||||
| 1741 | |||||||||||||||||||||
| 1742 | // if SrcCoeff doesn't divide Delta, then no dependence | ||||||||||||||||||||
| 1743 | if (isa<SCEVConstant>(Delta) && | ||||||||||||||||||||
| 1744 | !isRemainderZero(cast<SCEVConstant>(Delta), ConstCoeff)) { | ||||||||||||||||||||
| 1745 | ++WeakZeroSIVindependence; | ||||||||||||||||||||
| 1746 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1747 | return true; | ||||||||||||||||||||
| 1748 | } | ||||||||||||||||||||
| 1749 | return false; | ||||||||||||||||||||
| 1750 | } | ||||||||||||||||||||
| 1751 | |||||||||||||||||||||
| 1752 | |||||||||||||||||||||
| 1753 | // weakZeroDstSIVtest - | ||||||||||||||||||||
| 1754 | // From the paper, Practical Dependence Testing, Section 4.2.2 | ||||||||||||||||||||
| 1755 | // | ||||||||||||||||||||
| 1756 | // When we have a pair of subscripts of the form [c1 + a*i] and [c2], | ||||||||||||||||||||
| 1757 | // where i is an induction variable, c1 and c2 are loop invariant, | ||||||||||||||||||||
| 1758 | // and a is a constant, we can solve it exactly using the | ||||||||||||||||||||
| 1759 | // Weak-Zero SIV test. | ||||||||||||||||||||
| 1760 | // | ||||||||||||||||||||
| 1761 | // Given | ||||||||||||||||||||
| 1762 | // | ||||||||||||||||||||
| 1763 | // c1 + a*i = c2 | ||||||||||||||||||||
| 1764 | // | ||||||||||||||||||||
| 1765 | // we get | ||||||||||||||||||||
| 1766 | // | ||||||||||||||||||||
| 1767 | // i = (c2 - c1)/a | ||||||||||||||||||||
| 1768 | // | ||||||||||||||||||||
| 1769 | // If i is not an integer, there's no dependence. | ||||||||||||||||||||
| 1770 | // If i < 0 or > UB, there's no dependence. | ||||||||||||||||||||
| 1771 | // If i = 0, the direction is <= and peeling the | ||||||||||||||||||||
| 1772 | // 1st iteration will break the dependence. | ||||||||||||||||||||
| 1773 | // If i = UB, the direction is >= and peeling the | ||||||||||||||||||||
| 1774 | // last iteration will break the dependence. | ||||||||||||||||||||
| 1775 | // Otherwise, the direction is *. | ||||||||||||||||||||
| 1776 | // | ||||||||||||||||||||
| 1777 | // Can prove independence. Failing that, we can sometimes refine | ||||||||||||||||||||
| 1778 | // the directions. Can sometimes show that first or last | ||||||||||||||||||||
| 1779 | // iteration carries all the dependences (so worth peeling). | ||||||||||||||||||||
| 1780 | // | ||||||||||||||||||||
| 1781 | // (see also weakZeroSrcSIVtest) | ||||||||||||||||||||
| 1782 | // | ||||||||||||||||||||
| 1783 | // Return true if dependence disproved. | ||||||||||||||||||||
| 1784 | bool DependenceInfo::weakZeroDstSIVtest(const SCEV *SrcCoeff, | ||||||||||||||||||||
| 1785 | const SCEV *SrcConst, | ||||||||||||||||||||
| 1786 | const SCEV *DstConst, | ||||||||||||||||||||
| 1787 | const Loop *CurLoop, unsigned Level, | ||||||||||||||||||||
| 1788 | FullDependence &Result, | ||||||||||||||||||||
| 1789 | Constraint &NewConstraint) const { | ||||||||||||||||||||
| 1790 | // For the WeakSIV test, it's possible the loop isn't common to the | ||||||||||||||||||||
| 1791 | // Src and Dst loops. If it isn't, then there's no need to record a direction. | ||||||||||||||||||||
| 1792 | LLVM_DEBUG(dbgs() << "\tWeak-Zero (dst) SIV test\n")do { } while (false); | ||||||||||||||||||||
| 1793 | LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << "\n")do { } while (false); | ||||||||||||||||||||
| 1794 | LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1795 | LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1796 | ++WeakZeroSIVapplications; | ||||||||||||||||||||
| 1797 | assert(0 < Level && Level <= SrcLevels && "Level out of range")((void)0); | ||||||||||||||||||||
| 1798 | Level--; | ||||||||||||||||||||
| 1799 | Result.Consistent = false; | ||||||||||||||||||||
| 1800 | const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); | ||||||||||||||||||||
| 1801 | NewConstraint.setLine(SrcCoeff, SE->getZero(Delta->getType()), Delta, | ||||||||||||||||||||
| 1802 | CurLoop); | ||||||||||||||||||||
| 1803 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1804 | if (isKnownPredicate(CmpInst::ICMP_EQ, DstConst, SrcConst)) { | ||||||||||||||||||||
| 1805 | if (Level < CommonLevels) { | ||||||||||||||||||||
| 1806 | Result.DV[Level].Direction &= Dependence::DVEntry::LE; | ||||||||||||||||||||
| 1807 | Result.DV[Level].PeelFirst = true; | ||||||||||||||||||||
| 1808 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1809 | } | ||||||||||||||||||||
| 1810 | return false; // dependences caused by first iteration | ||||||||||||||||||||
| 1811 | } | ||||||||||||||||||||
| 1812 | const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(SrcCoeff); | ||||||||||||||||||||
| 1813 | if (!ConstCoeff) | ||||||||||||||||||||
| 1814 | return false; | ||||||||||||||||||||
| 1815 | const SCEV *AbsCoeff = | ||||||||||||||||||||
| 1816 | SE->isKnownNegative(ConstCoeff) ? | ||||||||||||||||||||
| 1817 | SE->getNegativeSCEV(ConstCoeff) : ConstCoeff; | ||||||||||||||||||||
| 1818 | const SCEV *NewDelta = | ||||||||||||||||||||
| 1819 | SE->isKnownNegative(ConstCoeff) ? SE->getNegativeSCEV(Delta) : Delta; | ||||||||||||||||||||
| 1820 | |||||||||||||||||||||
| 1821 | // check that Delta/SrcCoeff < iteration count | ||||||||||||||||||||
| 1822 | // really check NewDelta < count*AbsCoeff | ||||||||||||||||||||
| 1823 | if (const SCEV *UpperBound = collectUpperBound(CurLoop, Delta->getType())) { | ||||||||||||||||||||
| 1824 | LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n")do { } while (false); | ||||||||||||||||||||
| 1825 | const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound); | ||||||||||||||||||||
| 1826 | if (isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) { | ||||||||||||||||||||
| 1827 | ++WeakZeroSIVindependence; | ||||||||||||||||||||
| 1828 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1829 | return true; | ||||||||||||||||||||
| 1830 | } | ||||||||||||||||||||
| 1831 | if (isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) { | ||||||||||||||||||||
| 1832 | // dependences caused by last iteration | ||||||||||||||||||||
| 1833 | if (Level < CommonLevels) { | ||||||||||||||||||||
| 1834 | Result.DV[Level].Direction &= Dependence::DVEntry::GE; | ||||||||||||||||||||
| 1835 | Result.DV[Level].PeelLast = true; | ||||||||||||||||||||
| 1836 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1837 | } | ||||||||||||||||||||
| 1838 | return false; | ||||||||||||||||||||
| 1839 | } | ||||||||||||||||||||
| 1840 | } | ||||||||||||||||||||
| 1841 | |||||||||||||||||||||
| 1842 | // check that Delta/SrcCoeff >= 0 | ||||||||||||||||||||
| 1843 | // really check that NewDelta >= 0 | ||||||||||||||||||||
| 1844 | if (SE->isKnownNegative(NewDelta)) { | ||||||||||||||||||||
| 1845 | // No dependence, newDelta < 0 | ||||||||||||||||||||
| 1846 | ++WeakZeroSIVindependence; | ||||||||||||||||||||
| 1847 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1848 | return true; | ||||||||||||||||||||
| 1849 | } | ||||||||||||||||||||
| 1850 | |||||||||||||||||||||
| 1851 | // if SrcCoeff doesn't divide Delta, then no dependence | ||||||||||||||||||||
| 1852 | if (isa<SCEVConstant>(Delta) && | ||||||||||||||||||||
| 1853 | !isRemainderZero(cast<SCEVConstant>(Delta), ConstCoeff)) { | ||||||||||||||||||||
| 1854 | ++WeakZeroSIVindependence; | ||||||||||||||||||||
| 1855 | ++WeakZeroSIVsuccesses; | ||||||||||||||||||||
| 1856 | return true; | ||||||||||||||||||||
| 1857 | } | ||||||||||||||||||||
| 1858 | return false; | ||||||||||||||||||||
| 1859 | } | ||||||||||||||||||||
| 1860 | |||||||||||||||||||||
| 1861 | |||||||||||||||||||||
| 1862 | // exactRDIVtest - Tests the RDIV subscript pair for dependence. | ||||||||||||||||||||
| 1863 | // Things of the form [c1 + a*i] and [c2 + b*j], | ||||||||||||||||||||
| 1864 | // where i and j are induction variable, c1 and c2 are loop invariant, | ||||||||||||||||||||
| 1865 | // and a and b are constants. | ||||||||||||||||||||
| 1866 | // Returns true if any possible dependence is disproved. | ||||||||||||||||||||
| 1867 | // Marks the result as inconsistent. | ||||||||||||||||||||
| 1868 | // Works in some cases that symbolicRDIVtest doesn't, and vice versa. | ||||||||||||||||||||
| 1869 | bool DependenceInfo::exactRDIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff, | ||||||||||||||||||||
| 1870 | const SCEV *SrcConst, const SCEV *DstConst, | ||||||||||||||||||||
| 1871 | const Loop *SrcLoop, const Loop *DstLoop, | ||||||||||||||||||||
| 1872 | FullDependence &Result) const { | ||||||||||||||||||||
| 1873 | LLVM_DEBUG(dbgs() << "\tExact RDIV test\n")do { } while (false); | ||||||||||||||||||||
| 1874 | LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n")do { } while (false); | ||||||||||||||||||||
| 1875 | LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n")do { } while (false); | ||||||||||||||||||||
| 1876 | LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1877 | LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n")do { } while (false); | ||||||||||||||||||||
| 1878 | ++ExactRDIVapplications; | ||||||||||||||||||||
| 1879 | Result.Consistent = false; | ||||||||||||||||||||
| 1880 | const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); | ||||||||||||||||||||
| 1881 | LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 1882 | const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta); | ||||||||||||||||||||
| 1883 | const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff); | ||||||||||||||||||||
| 1884 | const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff); | ||||||||||||||||||||
| 1885 | if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff) | ||||||||||||||||||||
| 1886 | return false; | ||||||||||||||||||||
| 1887 | |||||||||||||||||||||
| 1888 | // find gcd | ||||||||||||||||||||
| 1889 | APInt G, X, Y; | ||||||||||||||||||||
| 1890 | APInt AM = ConstSrcCoeff->getAPInt(); | ||||||||||||||||||||
| 1891 | APInt BM = ConstDstCoeff->getAPInt(); | ||||||||||||||||||||
| 1892 | APInt CM = ConstDelta->getAPInt(); | ||||||||||||||||||||
| 1893 | unsigned Bits = AM.getBitWidth(); | ||||||||||||||||||||
| 1894 | if (findGCD(Bits, AM, BM, CM, G, X, Y)) { | ||||||||||||||||||||
| 1895 | // gcd doesn't divide Delta, no dependence | ||||||||||||||||||||
| 1896 | ++ExactRDIVindependence; | ||||||||||||||||||||
| 1897 | return true; | ||||||||||||||||||||
| 1898 | } | ||||||||||||||||||||
| 1899 | |||||||||||||||||||||
| 1900 | LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n")do { } while (false); | ||||||||||||||||||||
| 1901 | |||||||||||||||||||||
| 1902 | // since SCEV construction seems to normalize, LM = 0 | ||||||||||||||||||||
| 1903 | APInt SrcUM(Bits, 1, true); | ||||||||||||||||||||
| 1904 | bool SrcUMvalid = false; | ||||||||||||||||||||
| 1905 | // SrcUM is perhaps unavailable, let's check | ||||||||||||||||||||
| 1906 | if (const SCEVConstant *UpperBound = | ||||||||||||||||||||
| 1907 | collectConstantUpperBound(SrcLoop, Delta->getType())) { | ||||||||||||||||||||
| 1908 | SrcUM = UpperBound->getAPInt(); | ||||||||||||||||||||
| 1909 | LLVM_DEBUG(dbgs() << "\t SrcUM = " << SrcUM << "\n")do { } while (false); | ||||||||||||||||||||
| 1910 | SrcUMvalid = true; | ||||||||||||||||||||
| 1911 | } | ||||||||||||||||||||
| 1912 | |||||||||||||||||||||
| 1913 | APInt DstUM(Bits, 1, true); | ||||||||||||||||||||
| 1914 | bool DstUMvalid = false; | ||||||||||||||||||||
| 1915 | // UM is perhaps unavailable, let's check | ||||||||||||||||||||
| 1916 | if (const SCEVConstant *UpperBound = | ||||||||||||||||||||
| 1917 | collectConstantUpperBound(DstLoop, Delta->getType())) { | ||||||||||||||||||||
| 1918 | DstUM = UpperBound->getAPInt(); | ||||||||||||||||||||
| 1919 | LLVM_DEBUG(dbgs() << "\t DstUM = " << DstUM << "\n")do { } while (false); | ||||||||||||||||||||
| 1920 | DstUMvalid = true; | ||||||||||||||||||||
| 1921 | } | ||||||||||||||||||||
| 1922 | |||||||||||||||||||||
| 1923 | APInt TU(APInt::getSignedMaxValue(Bits)); | ||||||||||||||||||||
| 1924 | APInt TL(APInt::getSignedMinValue(Bits)); | ||||||||||||||||||||
| 1925 | APInt TC = CM.sdiv(G); | ||||||||||||||||||||
| 1926 | APInt TX = X * TC; | ||||||||||||||||||||
| 1927 | APInt TY = Y * TC; | ||||||||||||||||||||
| 1928 | LLVM_DEBUG(dbgs() << "\t TC = " << TC << "\n")do { } while (false); | ||||||||||||||||||||
| 1929 | LLVM_DEBUG(dbgs() << "\t TX = " << TX << "\n")do { } while (false); | ||||||||||||||||||||
| 1930 | LLVM_DEBUG(dbgs() << "\t TY = " << TY << "\n")do { } while (false); | ||||||||||||||||||||
| 1931 | |||||||||||||||||||||
| 1932 | SmallVector<APInt, 2> TLVec, TUVec; | ||||||||||||||||||||
| 1933 | APInt TB = BM.sdiv(G); | ||||||||||||||||||||
| 1934 | if (TB.sgt(0)) { | ||||||||||||||||||||
| 1935 | TLVec.push_back(ceilingOfQuotient(-TX, TB)); | ||||||||||||||||||||
| 1936 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1937 | if (SrcUMvalid) { | ||||||||||||||||||||
| 1938 | TUVec.push_back(floorOfQuotient(SrcUM - TX, TB)); | ||||||||||||||||||||
| 1939 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1940 | } | ||||||||||||||||||||
| 1941 | } else { | ||||||||||||||||||||
| 1942 | TUVec.push_back(floorOfQuotient(-TX, TB)); | ||||||||||||||||||||
| 1943 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1944 | if (SrcUMvalid) { | ||||||||||||||||||||
| 1945 | TLVec.push_back(ceilingOfQuotient(SrcUM - TX, TB)); | ||||||||||||||||||||
| 1946 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1947 | } | ||||||||||||||||||||
| 1948 | } | ||||||||||||||||||||
| 1949 | |||||||||||||||||||||
| 1950 | APInt TA = AM.sdiv(G); | ||||||||||||||||||||
| 1951 | if (TA.sgt(0)) { | ||||||||||||||||||||
| 1952 | TLVec.push_back(ceilingOfQuotient(-TY, TA)); | ||||||||||||||||||||
| 1953 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1954 | if (DstUMvalid) { | ||||||||||||||||||||
| 1955 | TUVec.push_back(floorOfQuotient(DstUM - TY, TA)); | ||||||||||||||||||||
| 1956 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1957 | } | ||||||||||||||||||||
| 1958 | } else { | ||||||||||||||||||||
| 1959 | TUVec.push_back(floorOfQuotient(-TY, TA)); | ||||||||||||||||||||
| 1960 | LLVM_DEBUG(dbgs() << "\t Possible TU = " << TUVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1961 | if (DstUMvalid) { | ||||||||||||||||||||
| 1962 | TLVec.push_back(ceilingOfQuotient(DstUM - TY, TA)); | ||||||||||||||||||||
| 1963 | LLVM_DEBUG(dbgs() << "\t Possible TL = " << TLVec.back() << "\n")do { } while (false); | ||||||||||||||||||||
| 1964 | } | ||||||||||||||||||||
| 1965 | } | ||||||||||||||||||||
| 1966 | |||||||||||||||||||||
| 1967 | if (TLVec.empty() || TUVec.empty()) | ||||||||||||||||||||
| 1968 | return false; | ||||||||||||||||||||
| 1969 | |||||||||||||||||||||
| 1970 | LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n")do { } while (false); | ||||||||||||||||||||
| 1971 | LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n")do { } while (false); | ||||||||||||||||||||
| 1972 | |||||||||||||||||||||
| 1973 | TL = APIntOps::smax(TLVec.front(), TLVec.back()); | ||||||||||||||||||||
| 1974 | TU = APIntOps::smin(TUVec.front(), TUVec.back()); | ||||||||||||||||||||
| 1975 | LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n")do { } while (false); | ||||||||||||||||||||
| 1976 | LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n")do { } while (false); | ||||||||||||||||||||
| 1977 | |||||||||||||||||||||
| 1978 | if (TL.sgt(TU)) | ||||||||||||||||||||
| 1979 | ++ExactRDIVindependence; | ||||||||||||||||||||
| 1980 | return TL.sgt(TU); | ||||||||||||||||||||
| 1981 | } | ||||||||||||||||||||
| 1982 | |||||||||||||||||||||
| 1983 | |||||||||||||||||||||
| 1984 | // symbolicRDIVtest - | ||||||||||||||||||||
| 1985 | // In Section 4.5 of the Practical Dependence Testing paper,the authors | ||||||||||||||||||||
| 1986 | // introduce a special case of Banerjee's Inequalities (also called the | ||||||||||||||||||||
| 1987 | // Extreme-Value Test) that can handle some of the SIV and RDIV cases, | ||||||||||||||||||||
| 1988 | // particularly cases with symbolics. Since it's only able to disprove | ||||||||||||||||||||
| 1989 | // dependence (not compute distances or directions), we'll use it as a | ||||||||||||||||||||
| 1990 | // fall back for the other tests. | ||||||||||||||||||||
| 1991 | // | ||||||||||||||||||||
| 1992 | // When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*j] | ||||||||||||||||||||
| 1993 | // where i and j are induction variables and c1 and c2 are loop invariants, | ||||||||||||||||||||
| 1994 | // we can use the symbolic tests to disprove some dependences, serving as a | ||||||||||||||||||||
| 1995 | // backup for the RDIV test. Note that i and j can be the same variable, | ||||||||||||||||||||
| 1996 | // letting this test serve as a backup for the various SIV tests. | ||||||||||||||||||||
| 1997 | // | ||||||||||||||||||||
| 1998 | // For a dependence to exist, c1 + a1*i must equal c2 + a2*j for some | ||||||||||||||||||||
| 1999 | // 0 <= i <= N1 and some 0 <= j <= N2, where N1 and N2 are the (normalized) | ||||||||||||||||||||
| 2000 | // loop bounds for the i and j loops, respectively. So, ... | ||||||||||||||||||||
| 2001 | // | ||||||||||||||||||||
| 2002 | // c1 + a1*i = c2 + a2*j | ||||||||||||||||||||
| 2003 | // a1*i - a2*j = c2 - c1 | ||||||||||||||||||||
| 2004 | // | ||||||||||||||||||||
| 2005 | // To test for a dependence, we compute c2 - c1 and make sure it's in the | ||||||||||||||||||||
| 2006 | // range of the maximum and minimum possible values of a1*i - a2*j. | ||||||||||||||||||||
| 2007 | // Considering the signs of a1 and a2, we have 4 possible cases: | ||||||||||||||||||||
| 2008 | // | ||||||||||||||||||||
| 2009 | // 1) If a1 >= 0 and a2 >= 0, then | ||||||||||||||||||||
| 2010 | // a1*0 - a2*N2 <= c2 - c1 <= a1*N1 - a2*0 | ||||||||||||||||||||
| 2011 | // -a2*N2 <= c2 - c1 <= a1*N1 | ||||||||||||||||||||
| 2012 | // | ||||||||||||||||||||
| 2013 | // 2) If a1 >= 0 and a2 <= 0, then | ||||||||||||||||||||
| 2014 | // a1*0 - a2*0 <= c2 - c1 <= a1*N1 - a2*N2 | ||||||||||||||||||||
| 2015 | // 0 <= c2 - c1 <= a1*N1 - a2*N2 | ||||||||||||||||||||
| 2016 | // | ||||||||||||||||||||
| 2017 | // 3) If a1 <= 0 and a2 >= 0, then | ||||||||||||||||||||
| 2018 | // a1*N1 - a2*N2 <= c2 - c1 <= a1*0 - a2*0 | ||||||||||||||||||||
| 2019 | // a1*N1 - a2*N2 <= c2 - c1 <= 0 | ||||||||||||||||||||
| 2020 | // | ||||||||||||||||||||
| 2021 | // 4) If a1 <= 0 and a2 <= 0, then | ||||||||||||||||||||
| 2022 | // a1*N1 - a2*0 <= c2 - c1 <= a1*0 - a2*N2 | ||||||||||||||||||||
| 2023 | // a1*N1 <= c2 - c1 <= -a2*N2 | ||||||||||||||||||||
| 2024 | // | ||||||||||||||||||||
| 2025 | // return true if dependence disproved | ||||||||||||||||||||
| 2026 | bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2, | ||||||||||||||||||||
| 2027 | const SCEV *C1, const SCEV *C2, | ||||||||||||||||||||
| 2028 | const Loop *Loop1, | ||||||||||||||||||||
| 2029 | const Loop *Loop2) const { | ||||||||||||||||||||
| 2030 | ++SymbolicRDIVapplications; | ||||||||||||||||||||
| 2031 | LLVM_DEBUG(dbgs() << "\ttry symbolic RDIV test\n")do { } while (false); | ||||||||||||||||||||
| 2032 | LLVM_DEBUG(dbgs() << "\t A1 = " << *A1)do { } while (false); | ||||||||||||||||||||
| 2033 | LLVM_DEBUG(dbgs() << ", type = " << *A1->getType() << "\n")do { } while (false); | ||||||||||||||||||||
| 2034 | LLVM_DEBUG(dbgs() << "\t A2 = " << *A2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2035 | LLVM_DEBUG(dbgs() << "\t C1 = " << *C1 << "\n")do { } while (false); | ||||||||||||||||||||
| 2036 | LLVM_DEBUG(dbgs() << "\t C2 = " << *C2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2037 | const SCEV *N1 = collectUpperBound(Loop1, A1->getType()); | ||||||||||||||||||||
| 2038 | const SCEV *N2 = collectUpperBound(Loop2, A1->getType()); | ||||||||||||||||||||
| 2039 | LLVM_DEBUG(if (N1) dbgs() << "\t N1 = " << *N1 << "\n")do { } while (false); | ||||||||||||||||||||
| 2040 | LLVM_DEBUG(if (N2) dbgs() << "\t N2 = " << *N2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2041 | const SCEV *C2_C1 = SE->getMinusSCEV(C2, C1); | ||||||||||||||||||||
| 2042 | const SCEV *C1_C2 = SE->getMinusSCEV(C1, C2); | ||||||||||||||||||||
| 2043 | LLVM_DEBUG(dbgs() << "\t C2 - C1 = " << *C2_C1 << "\n")do { } while (false); | ||||||||||||||||||||
| 2044 | LLVM_DEBUG(dbgs() << "\t C1 - C2 = " << *C1_C2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2045 | if (SE->isKnownNonNegative(A1)) { | ||||||||||||||||||||
| 2046 | if (SE->isKnownNonNegative(A2)) { | ||||||||||||||||||||
| 2047 | // A1 >= 0 && A2 >= 0 | ||||||||||||||||||||
| 2048 | if (N1) { | ||||||||||||||||||||
| 2049 | // make sure that c2 - c1 <= a1*N1 | ||||||||||||||||||||
| 2050 | const SCEV *A1N1 = SE->getMulExpr(A1, N1); | ||||||||||||||||||||
| 2051 | LLVM_DEBUG(dbgs() << "\t A1*N1 = " << *A1N1 << "\n")do { } while (false); | ||||||||||||||||||||
| 2052 | if (isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1)) { | ||||||||||||||||||||
| 2053 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2054 | return true; | ||||||||||||||||||||
| 2055 | } | ||||||||||||||||||||
| 2056 | } | ||||||||||||||||||||
| 2057 | if (N2) { | ||||||||||||||||||||
| 2058 | // make sure that -a2*N2 <= c2 - c1, or a2*N2 >= c1 - c2 | ||||||||||||||||||||
| 2059 | const SCEV *A2N2 = SE->getMulExpr(A2, N2); | ||||||||||||||||||||
| 2060 | LLVM_DEBUG(dbgs() << "\t A2*N2 = " << *A2N2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2061 | if (isKnownPredicate(CmpInst::ICMP_SLT, A2N2, C1_C2)) { | ||||||||||||||||||||
| 2062 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2063 | return true; | ||||||||||||||||||||
| 2064 | } | ||||||||||||||||||||
| 2065 | } | ||||||||||||||||||||
| 2066 | } | ||||||||||||||||||||
| 2067 | else if (SE->isKnownNonPositive(A2)) { | ||||||||||||||||||||
| 2068 | // a1 >= 0 && a2 <= 0 | ||||||||||||||||||||
| 2069 | if (N1 && N2) { | ||||||||||||||||||||
| 2070 | // make sure that c2 - c1 <= a1*N1 - a2*N2 | ||||||||||||||||||||
| 2071 | const SCEV *A1N1 = SE->getMulExpr(A1, N1); | ||||||||||||||||||||
| 2072 | const SCEV *A2N2 = SE->getMulExpr(A2, N2); | ||||||||||||||||||||
| 2073 | const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2); | ||||||||||||||||||||
| 2074 | LLVM_DEBUG(dbgs() << "\t A1*N1 - A2*N2 = " << *A1N1_A2N2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2075 | if (isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1_A2N2)) { | ||||||||||||||||||||
| 2076 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2077 | return true; | ||||||||||||||||||||
| 2078 | } | ||||||||||||||||||||
| 2079 | } | ||||||||||||||||||||
| 2080 | // make sure that 0 <= c2 - c1 | ||||||||||||||||||||
| 2081 | if (SE->isKnownNegative(C2_C1)) { | ||||||||||||||||||||
| 2082 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2083 | return true; | ||||||||||||||||||||
| 2084 | } | ||||||||||||||||||||
| 2085 | } | ||||||||||||||||||||
| 2086 | } | ||||||||||||||||||||
| 2087 | else if (SE->isKnownNonPositive(A1)) { | ||||||||||||||||||||
| 2088 | if (SE->isKnownNonNegative(A2)) { | ||||||||||||||||||||
| 2089 | // a1 <= 0 && a2 >= 0 | ||||||||||||||||||||
| 2090 | if (N1 && N2) { | ||||||||||||||||||||
| 2091 | // make sure that a1*N1 - a2*N2 <= c2 - c1 | ||||||||||||||||||||
| 2092 | const SCEV *A1N1 = SE->getMulExpr(A1, N1); | ||||||||||||||||||||
| 2093 | const SCEV *A2N2 = SE->getMulExpr(A2, N2); | ||||||||||||||||||||
| 2094 | const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2); | ||||||||||||||||||||
| 2095 | LLVM_DEBUG(dbgs() << "\t A1*N1 - A2*N2 = " << *A1N1_A2N2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2096 | if (isKnownPredicate(CmpInst::ICMP_SGT, A1N1_A2N2, C2_C1)) { | ||||||||||||||||||||
| 2097 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2098 | return true; | ||||||||||||||||||||
| 2099 | } | ||||||||||||||||||||
| 2100 | } | ||||||||||||||||||||
| 2101 | // make sure that c2 - c1 <= 0 | ||||||||||||||||||||
| 2102 | if (SE->isKnownPositive(C2_C1)) { | ||||||||||||||||||||
| 2103 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2104 | return true; | ||||||||||||||||||||
| 2105 | } | ||||||||||||||||||||
| 2106 | } | ||||||||||||||||||||
| 2107 | else if (SE->isKnownNonPositive(A2)) { | ||||||||||||||||||||
| 2108 | // a1 <= 0 && a2 <= 0 | ||||||||||||||||||||
| 2109 | if (N1) { | ||||||||||||||||||||
| 2110 | // make sure that a1*N1 <= c2 - c1 | ||||||||||||||||||||
| 2111 | const SCEV *A1N1 = SE->getMulExpr(A1, N1); | ||||||||||||||||||||
| 2112 | LLVM_DEBUG(dbgs() << "\t A1*N1 = " << *A1N1 << "\n")do { } while (false); | ||||||||||||||||||||
| 2113 | if (isKnownPredicate(CmpInst::ICMP_SGT, A1N1, C2_C1)) { | ||||||||||||||||||||
| 2114 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2115 | return true; | ||||||||||||||||||||
| 2116 | } | ||||||||||||||||||||
| 2117 | } | ||||||||||||||||||||
| 2118 | if (N2) { | ||||||||||||||||||||
| 2119 | // make sure that c2 - c1 <= -a2*N2, or c1 - c2 >= a2*N2 | ||||||||||||||||||||
| 2120 | const SCEV *A2N2 = SE->getMulExpr(A2, N2); | ||||||||||||||||||||
| 2121 | LLVM_DEBUG(dbgs() << "\t A2*N2 = " << *A2N2 << "\n")do { } while (false); | ||||||||||||||||||||
| 2122 | if (isKnownPredicate(CmpInst::ICMP_SLT, C1_C2, A2N2)) { | ||||||||||||||||||||
| 2123 | ++SymbolicRDIVindependence; | ||||||||||||||||||||
| 2124 | return true; | ||||||||||||||||||||
| 2125 | } | ||||||||||||||||||||
| 2126 | } | ||||||||||||||||||||
| 2127 | } | ||||||||||||||||||||
| 2128 | } | ||||||||||||||||||||
| 2129 | return false; | ||||||||||||||||||||
| 2130 | } | ||||||||||||||||||||
| 2131 | |||||||||||||||||||||
| 2132 | |||||||||||||||||||||
| 2133 | // testSIV - | ||||||||||||||||||||
| 2134 | // When we have a pair of subscripts of the form [c1 + a1*i] and [c2 - a2*i] | ||||||||||||||||||||
| 2135 | // where i is an induction variable, c1 and c2 are loop invariant, and a1 and | ||||||||||||||||||||
| 2136 | // a2 are constant, we attack it with an SIV test. While they can all be | ||||||||||||||||||||
| 2137 | // solved with the Exact SIV test, it's worthwhile to use simpler tests when | ||||||||||||||||||||
| 2138 | // they apply; they're cheaper and sometimes more precise. | ||||||||||||||||||||
| 2139 | // | ||||||||||||||||||||
| 2140 | // Return true if dependence disproved. | ||||||||||||||||||||
| 2141 | bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level, | ||||||||||||||||||||
| 2142 | FullDependence &Result, Constraint &NewConstraint, | ||||||||||||||||||||
| 2143 | const SCEV *&SplitIter) const { | ||||||||||||||||||||
| 2144 | LLVM_DEBUG(dbgs() << " src = " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 2145 | LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 2146 | const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src); | ||||||||||||||||||||
| 2147 | const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst); | ||||||||||||||||||||
| 2148 | if (SrcAddRec && DstAddRec) { | ||||||||||||||||||||
| 2149 | const SCEV *SrcConst = SrcAddRec->getStart(); | ||||||||||||||||||||
| 2150 | const SCEV *DstConst = DstAddRec->getStart(); | ||||||||||||||||||||
| 2151 | const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2152 | const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2153 | const Loop *CurLoop = SrcAddRec->getLoop(); | ||||||||||||||||||||
| 2154 | assert(CurLoop == DstAddRec->getLoop() &&((void)0) | ||||||||||||||||||||
| 2155 | "both loops in SIV should be same")((void)0); | ||||||||||||||||||||
| 2156 | Level = mapSrcLoop(CurLoop); | ||||||||||||||||||||
| 2157 | bool disproven; | ||||||||||||||||||||
| 2158 | if (SrcCoeff == DstCoeff) | ||||||||||||||||||||
| 2159 | disproven = strongSIVtest(SrcCoeff, SrcConst, DstConst, CurLoop, | ||||||||||||||||||||
| 2160 | Level, Result, NewConstraint); | ||||||||||||||||||||
| 2161 | else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff)) | ||||||||||||||||||||
| 2162 | disproven = weakCrossingSIVtest(SrcCoeff, SrcConst, DstConst, CurLoop, | ||||||||||||||||||||
| 2163 | Level, Result, NewConstraint, SplitIter); | ||||||||||||||||||||
| 2164 | else | ||||||||||||||||||||
| 2165 | disproven = exactSIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst, CurLoop, | ||||||||||||||||||||
| 2166 | Level, Result, NewConstraint); | ||||||||||||||||||||
| 2167 | return disproven || | ||||||||||||||||||||
| 2168 | gcdMIVtest(Src, Dst, Result) || | ||||||||||||||||||||
| 2169 | symbolicRDIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst, CurLoop, CurLoop); | ||||||||||||||||||||
| 2170 | } | ||||||||||||||||||||
| 2171 | if (SrcAddRec) { | ||||||||||||||||||||
| 2172 | const SCEV *SrcConst = SrcAddRec->getStart(); | ||||||||||||||||||||
| 2173 | const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2174 | const SCEV *DstConst = Dst; | ||||||||||||||||||||
| 2175 | const Loop *CurLoop = SrcAddRec->getLoop(); | ||||||||||||||||||||
| 2176 | Level = mapSrcLoop(CurLoop); | ||||||||||||||||||||
| 2177 | return weakZeroDstSIVtest(SrcCoeff, SrcConst, DstConst, CurLoop, | ||||||||||||||||||||
| 2178 | Level, Result, NewConstraint) || | ||||||||||||||||||||
| 2179 | gcdMIVtest(Src, Dst, Result); | ||||||||||||||||||||
| 2180 | } | ||||||||||||||||||||
| 2181 | if (DstAddRec) { | ||||||||||||||||||||
| 2182 | const SCEV *DstConst = DstAddRec->getStart(); | ||||||||||||||||||||
| 2183 | const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2184 | const SCEV *SrcConst = Src; | ||||||||||||||||||||
| 2185 | const Loop *CurLoop = DstAddRec->getLoop(); | ||||||||||||||||||||
| 2186 | Level = mapDstLoop(CurLoop); | ||||||||||||||||||||
| 2187 | return weakZeroSrcSIVtest(DstCoeff, SrcConst, DstConst, | ||||||||||||||||||||
| 2188 | CurLoop, Level, Result, NewConstraint) || | ||||||||||||||||||||
| 2189 | gcdMIVtest(Src, Dst, Result); | ||||||||||||||||||||
| 2190 | } | ||||||||||||||||||||
| 2191 | llvm_unreachable("SIV test expected at least one AddRec")__builtin_unreachable(); | ||||||||||||||||||||
| 2192 | return false; | ||||||||||||||||||||
| 2193 | } | ||||||||||||||||||||
| 2194 | |||||||||||||||||||||
| 2195 | |||||||||||||||||||||
| 2196 | // testRDIV - | ||||||||||||||||||||
| 2197 | // When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*j] | ||||||||||||||||||||
| 2198 | // where i and j are induction variables, c1 and c2 are loop invariant, | ||||||||||||||||||||
| 2199 | // and a1 and a2 are constant, we can solve it exactly with an easy adaptation | ||||||||||||||||||||
| 2200 | // of the Exact SIV test, the Restricted Double Index Variable (RDIV) test. | ||||||||||||||||||||
| 2201 | // It doesn't make sense to talk about distance or direction in this case, | ||||||||||||||||||||
| 2202 | // so there's no point in making special versions of the Strong SIV test or | ||||||||||||||||||||
| 2203 | // the Weak-crossing SIV test. | ||||||||||||||||||||
| 2204 | // | ||||||||||||||||||||
| 2205 | // With minor algebra, this test can also be used for things like | ||||||||||||||||||||
| 2206 | // [c1 + a1*i + a2*j][c2]. | ||||||||||||||||||||
| 2207 | // | ||||||||||||||||||||
| 2208 | // Return true if dependence disproved. | ||||||||||||||||||||
| 2209 | bool DependenceInfo::testRDIV(const SCEV *Src, const SCEV *Dst, | ||||||||||||||||||||
| 2210 | FullDependence &Result) const { | ||||||||||||||||||||
| 2211 | // we have 3 possible situations here: | ||||||||||||||||||||
| 2212 | // 1) [a*i + b] and [c*j + d] | ||||||||||||||||||||
| 2213 | // 2) [a*i + c*j + b] and [d] | ||||||||||||||||||||
| 2214 | // 3) [b] and [a*i + c*j + d] | ||||||||||||||||||||
| 2215 | // We need to find what we've got and get organized | ||||||||||||||||||||
| 2216 | |||||||||||||||||||||
| 2217 | const SCEV *SrcConst, *DstConst; | ||||||||||||||||||||
| 2218 | const SCEV *SrcCoeff, *DstCoeff; | ||||||||||||||||||||
| 2219 | const Loop *SrcLoop, *DstLoop; | ||||||||||||||||||||
| 2220 | |||||||||||||||||||||
| 2221 | LLVM_DEBUG(dbgs() << " src = " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 2222 | LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 2223 | const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src); | ||||||||||||||||||||
| 2224 | const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst); | ||||||||||||||||||||
| 2225 | if (SrcAddRec && DstAddRec) { | ||||||||||||||||||||
| 2226 | SrcConst = SrcAddRec->getStart(); | ||||||||||||||||||||
| 2227 | SrcCoeff = SrcAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2228 | SrcLoop = SrcAddRec->getLoop(); | ||||||||||||||||||||
| 2229 | DstConst = DstAddRec->getStart(); | ||||||||||||||||||||
| 2230 | DstCoeff = DstAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2231 | DstLoop = DstAddRec->getLoop(); | ||||||||||||||||||||
| 2232 | } | ||||||||||||||||||||
| 2233 | else if (SrcAddRec) { | ||||||||||||||||||||
| 2234 | if (const SCEVAddRecExpr *tmpAddRec = | ||||||||||||||||||||
| 2235 | dyn_cast<SCEVAddRecExpr>(SrcAddRec->getStart())) { | ||||||||||||||||||||
| 2236 | SrcConst = tmpAddRec->getStart(); | ||||||||||||||||||||
| 2237 | SrcCoeff = tmpAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2238 | SrcLoop = tmpAddRec->getLoop(); | ||||||||||||||||||||
| 2239 | DstConst = Dst; | ||||||||||||||||||||
| 2240 | DstCoeff = SE->getNegativeSCEV(SrcAddRec->getStepRecurrence(*SE)); | ||||||||||||||||||||
| 2241 | DstLoop = SrcAddRec->getLoop(); | ||||||||||||||||||||
| 2242 | } | ||||||||||||||||||||
| 2243 | else | ||||||||||||||||||||
| 2244 | llvm_unreachable("RDIV reached by surprising SCEVs")__builtin_unreachable(); | ||||||||||||||||||||
| 2245 | } | ||||||||||||||||||||
| 2246 | else if (DstAddRec) { | ||||||||||||||||||||
| 2247 | if (const SCEVAddRecExpr *tmpAddRec = | ||||||||||||||||||||
| 2248 | dyn_cast<SCEVAddRecExpr>(DstAddRec->getStart())) { | ||||||||||||||||||||
| 2249 | DstConst = tmpAddRec->getStart(); | ||||||||||||||||||||
| 2250 | DstCoeff = tmpAddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2251 | DstLoop = tmpAddRec->getLoop(); | ||||||||||||||||||||
| 2252 | SrcConst = Src; | ||||||||||||||||||||
| 2253 | SrcCoeff = SE->getNegativeSCEV(DstAddRec->getStepRecurrence(*SE)); | ||||||||||||||||||||
| 2254 | SrcLoop = DstAddRec->getLoop(); | ||||||||||||||||||||
| 2255 | } | ||||||||||||||||||||
| 2256 | else | ||||||||||||||||||||
| 2257 | llvm_unreachable("RDIV reached by surprising SCEVs")__builtin_unreachable(); | ||||||||||||||||||||
| 2258 | } | ||||||||||||||||||||
| 2259 | else | ||||||||||||||||||||
| 2260 | llvm_unreachable("RDIV expected at least one AddRec")__builtin_unreachable(); | ||||||||||||||||||||
| 2261 | return exactRDIVtest(SrcCoeff, DstCoeff, | ||||||||||||||||||||
| 2262 | SrcConst, DstConst, | ||||||||||||||||||||
| 2263 | SrcLoop, DstLoop, | ||||||||||||||||||||
| 2264 | Result) || | ||||||||||||||||||||
| 2265 | gcdMIVtest(Src, Dst, Result) || | ||||||||||||||||||||
| 2266 | symbolicRDIVtest(SrcCoeff, DstCoeff, | ||||||||||||||||||||
| 2267 | SrcConst, DstConst, | ||||||||||||||||||||
| 2268 | SrcLoop, DstLoop); | ||||||||||||||||||||
| 2269 | } | ||||||||||||||||||||
| 2270 | |||||||||||||||||||||
| 2271 | |||||||||||||||||||||
| 2272 | // Tests the single-subscript MIV pair (Src and Dst) for dependence. | ||||||||||||||||||||
| 2273 | // Return true if dependence disproved. | ||||||||||||||||||||
| 2274 | // Can sometimes refine direction vectors. | ||||||||||||||||||||
| 2275 | bool DependenceInfo::testMIV(const SCEV *Src, const SCEV *Dst, | ||||||||||||||||||||
| 2276 | const SmallBitVector &Loops, | ||||||||||||||||||||
| 2277 | FullDependence &Result) const { | ||||||||||||||||||||
| 2278 | LLVM_DEBUG(dbgs() << " src = " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 2279 | LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 2280 | Result.Consistent = false; | ||||||||||||||||||||
| 2281 | return gcdMIVtest(Src, Dst, Result) || | ||||||||||||||||||||
| 2282 | banerjeeMIVtest(Src, Dst, Loops, Result); | ||||||||||||||||||||
| 2283 | } | ||||||||||||||||||||
| 2284 | |||||||||||||||||||||
| 2285 | |||||||||||||||||||||
| 2286 | // Given a product, e.g., 10*X*Y, returns the first constant operand, | ||||||||||||||||||||
| 2287 | // in this case 10. If there is no constant part, returns NULL. | ||||||||||||||||||||
| 2288 | static | ||||||||||||||||||||
| 2289 | const SCEVConstant *getConstantPart(const SCEV *Expr) { | ||||||||||||||||||||
| 2290 | if (const auto *Constant = dyn_cast<SCEVConstant>(Expr)) | ||||||||||||||||||||
| 2291 | return Constant; | ||||||||||||||||||||
| 2292 | else if (const auto *Product = dyn_cast<SCEVMulExpr>(Expr)) | ||||||||||||||||||||
| 2293 | if (const auto *Constant = dyn_cast<SCEVConstant>(Product->getOperand(0))) | ||||||||||||||||||||
| 2294 | return Constant; | ||||||||||||||||||||
| 2295 | return nullptr; | ||||||||||||||||||||
| 2296 | } | ||||||||||||||||||||
| 2297 | |||||||||||||||||||||
| 2298 | |||||||||||||||||||||
| 2299 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 2300 | // gcdMIVtest - | ||||||||||||||||||||
| 2301 | // Tests an MIV subscript pair for dependence. | ||||||||||||||||||||
| 2302 | // Returns true if any possible dependence is disproved. | ||||||||||||||||||||
| 2303 | // Marks the result as inconsistent. | ||||||||||||||||||||
| 2304 | // Can sometimes disprove the equal direction for 1 or more loops, | ||||||||||||||||||||
| 2305 | // as discussed in Michael Wolfe's book, | ||||||||||||||||||||
| 2306 | // High Performance Compilers for Parallel Computing, page 235. | ||||||||||||||||||||
| 2307 | // | ||||||||||||||||||||
| 2308 | // We spend some effort (code!) to handle cases like | ||||||||||||||||||||
| 2309 | // [10*i + 5*N*j + 15*M + 6], where i and j are induction variables, | ||||||||||||||||||||
| 2310 | // but M and N are just loop-invariant variables. | ||||||||||||||||||||
| 2311 | // This should help us handle linearized subscripts; | ||||||||||||||||||||
| 2312 | // also makes this test a useful backup to the various SIV tests. | ||||||||||||||||||||
| 2313 | // | ||||||||||||||||||||
| 2314 | // It occurs to me that the presence of loop-invariant variables | ||||||||||||||||||||
| 2315 | // changes the nature of the test from "greatest common divisor" | ||||||||||||||||||||
| 2316 | // to "a common divisor". | ||||||||||||||||||||
| 2317 | bool DependenceInfo::gcdMIVtest(const SCEV *Src, const SCEV *Dst, | ||||||||||||||||||||
| 2318 | FullDependence &Result) const { | ||||||||||||||||||||
| 2319 | LLVM_DEBUG(dbgs() << "starting gcd\n")do { } while (false); | ||||||||||||||||||||
| 2320 | ++GCDapplications; | ||||||||||||||||||||
| 2321 | unsigned BitWidth = SE->getTypeSizeInBits(Src->getType()); | ||||||||||||||||||||
| 2322 | APInt RunningGCD = APInt::getNullValue(BitWidth); | ||||||||||||||||||||
| 2323 | |||||||||||||||||||||
| 2324 | // Examine Src coefficients. | ||||||||||||||||||||
| 2325 | // Compute running GCD and record source constant. | ||||||||||||||||||||
| 2326 | // Because we're looking for the constant at the end of the chain, | ||||||||||||||||||||
| 2327 | // we can't quit the loop just because the GCD == 1. | ||||||||||||||||||||
| 2328 | const SCEV *Coefficients = Src; | ||||||||||||||||||||
| 2329 | while (const SCEVAddRecExpr *AddRec = | ||||||||||||||||||||
| 2330 | dyn_cast<SCEVAddRecExpr>(Coefficients)) { | ||||||||||||||||||||
| 2331 | const SCEV *Coeff = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2332 | // If the coefficient is the product of a constant and other stuff, | ||||||||||||||||||||
| 2333 | // we can use the constant in the GCD computation. | ||||||||||||||||||||
| 2334 | const auto *Constant = getConstantPart(Coeff); | ||||||||||||||||||||
| 2335 | if (!Constant) | ||||||||||||||||||||
| 2336 | return false; | ||||||||||||||||||||
| 2337 | APInt ConstCoeff = Constant->getAPInt(); | ||||||||||||||||||||
| 2338 | RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs()); | ||||||||||||||||||||
| 2339 | Coefficients = AddRec->getStart(); | ||||||||||||||||||||
| 2340 | } | ||||||||||||||||||||
| 2341 | const SCEV *SrcConst = Coefficients; | ||||||||||||||||||||
| 2342 | |||||||||||||||||||||
| 2343 | // Examine Dst coefficients. | ||||||||||||||||||||
| 2344 | // Compute running GCD and record destination constant. | ||||||||||||||||||||
| 2345 | // Because we're looking for the constant at the end of the chain, | ||||||||||||||||||||
| 2346 | // we can't quit the loop just because the GCD == 1. | ||||||||||||||||||||
| 2347 | Coefficients = Dst; | ||||||||||||||||||||
| 2348 | while (const SCEVAddRecExpr *AddRec = | ||||||||||||||||||||
| 2349 | dyn_cast<SCEVAddRecExpr>(Coefficients)) { | ||||||||||||||||||||
| 2350 | const SCEV *Coeff = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2351 | // If the coefficient is the product of a constant and other stuff, | ||||||||||||||||||||
| 2352 | // we can use the constant in the GCD computation. | ||||||||||||||||||||
| 2353 | const auto *Constant = getConstantPart(Coeff); | ||||||||||||||||||||
| 2354 | if (!Constant) | ||||||||||||||||||||
| 2355 | return false; | ||||||||||||||||||||
| 2356 | APInt ConstCoeff = Constant->getAPInt(); | ||||||||||||||||||||
| 2357 | RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs()); | ||||||||||||||||||||
| 2358 | Coefficients = AddRec->getStart(); | ||||||||||||||||||||
| 2359 | } | ||||||||||||||||||||
| 2360 | const SCEV *DstConst = Coefficients; | ||||||||||||||||||||
| 2361 | |||||||||||||||||||||
| 2362 | APInt ExtraGCD = APInt::getNullValue(BitWidth); | ||||||||||||||||||||
| 2363 | const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); | ||||||||||||||||||||
| 2364 | LLVM_DEBUG(dbgs() << " Delta = " << *Delta << "\n")do { } while (false); | ||||||||||||||||||||
| 2365 | const SCEVConstant *Constant = dyn_cast<SCEVConstant>(Delta); | ||||||||||||||||||||
| 2366 | if (const SCEVAddExpr *Sum = dyn_cast<SCEVAddExpr>(Delta)) { | ||||||||||||||||||||
| 2367 | // If Delta is a sum of products, we may be able to make further progress. | ||||||||||||||||||||
| 2368 | for (unsigned Op = 0, Ops = Sum->getNumOperands(); Op < Ops; Op++) { | ||||||||||||||||||||
| 2369 | const SCEV *Operand = Sum->getOperand(Op); | ||||||||||||||||||||
| 2370 | if (isa<SCEVConstant>(Operand)) { | ||||||||||||||||||||
| 2371 | assert(!Constant && "Surprised to find multiple constants")((void)0); | ||||||||||||||||||||
| 2372 | Constant = cast<SCEVConstant>(Operand); | ||||||||||||||||||||
| 2373 | } | ||||||||||||||||||||
| 2374 | else if (const SCEVMulExpr *Product = dyn_cast<SCEVMulExpr>(Operand)) { | ||||||||||||||||||||
| 2375 | // Search for constant operand to participate in GCD; | ||||||||||||||||||||
| 2376 | // If none found; return false. | ||||||||||||||||||||
| 2377 | const SCEVConstant *ConstOp = getConstantPart(Product); | ||||||||||||||||||||
| 2378 | if (!ConstOp) | ||||||||||||||||||||
| 2379 | return false; | ||||||||||||||||||||
| 2380 | APInt ConstOpValue = ConstOp->getAPInt(); | ||||||||||||||||||||
| 2381 | ExtraGCD = APIntOps::GreatestCommonDivisor(ExtraGCD, | ||||||||||||||||||||
| 2382 | ConstOpValue.abs()); | ||||||||||||||||||||
| 2383 | } | ||||||||||||||||||||
| 2384 | else | ||||||||||||||||||||
| 2385 | return false; | ||||||||||||||||||||
| 2386 | } | ||||||||||||||||||||
| 2387 | } | ||||||||||||||||||||
| 2388 | if (!Constant) | ||||||||||||||||||||
| 2389 | return false; | ||||||||||||||||||||
| 2390 | APInt ConstDelta = cast<SCEVConstant>(Constant)->getAPInt(); | ||||||||||||||||||||
| 2391 | LLVM_DEBUG(dbgs() << " ConstDelta = " << ConstDelta << "\n")do { } while (false); | ||||||||||||||||||||
| 2392 | if (ConstDelta == 0) | ||||||||||||||||||||
| 2393 | return false; | ||||||||||||||||||||
| 2394 | RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ExtraGCD); | ||||||||||||||||||||
| 2395 | LLVM_DEBUG(dbgs() << " RunningGCD = " << RunningGCD << "\n")do { } while (false); | ||||||||||||||||||||
| 2396 | APInt Remainder = ConstDelta.srem(RunningGCD); | ||||||||||||||||||||
| 2397 | if (Remainder != 0) { | ||||||||||||||||||||
| 2398 | ++GCDindependence; | ||||||||||||||||||||
| 2399 | return true; | ||||||||||||||||||||
| 2400 | } | ||||||||||||||||||||
| 2401 | |||||||||||||||||||||
| 2402 | // Try to disprove equal directions. | ||||||||||||||||||||
| 2403 | // For example, given a subscript pair [3*i + 2*j] and [i' + 2*j' - 1], | ||||||||||||||||||||
| 2404 | // the code above can't disprove the dependence because the GCD = 1. | ||||||||||||||||||||
| 2405 | // So we consider what happen if i = i' and what happens if j = j'. | ||||||||||||||||||||
| 2406 | // If i = i', we can simplify the subscript to [2*i + 2*j] and [2*j' - 1], | ||||||||||||||||||||
| 2407 | // which is infeasible, so we can disallow the = direction for the i level. | ||||||||||||||||||||
| 2408 | // Setting j = j' doesn't help matters, so we end up with a direction vector | ||||||||||||||||||||
| 2409 | // of [<>, *] | ||||||||||||||||||||
| 2410 | // | ||||||||||||||||||||
| 2411 | // Given A[5*i + 10*j*M + 9*M*N] and A[15*i + 20*j*M - 21*N*M + 5], | ||||||||||||||||||||
| 2412 | // we need to remember that the constant part is 5 and the RunningGCD should | ||||||||||||||||||||
| 2413 | // be initialized to ExtraGCD = 30. | ||||||||||||||||||||
| 2414 | LLVM_DEBUG(dbgs() << " ExtraGCD = " << ExtraGCD << '\n')do { } while (false); | ||||||||||||||||||||
| 2415 | |||||||||||||||||||||
| 2416 | bool Improved = false; | ||||||||||||||||||||
| 2417 | Coefficients = Src; | ||||||||||||||||||||
| 2418 | while (const SCEVAddRecExpr *AddRec = | ||||||||||||||||||||
| 2419 | dyn_cast<SCEVAddRecExpr>(Coefficients)) { | ||||||||||||||||||||
| 2420 | Coefficients = AddRec->getStart(); | ||||||||||||||||||||
| 2421 | const Loop *CurLoop = AddRec->getLoop(); | ||||||||||||||||||||
| 2422 | RunningGCD = ExtraGCD; | ||||||||||||||||||||
| 2423 | const SCEV *SrcCoeff = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2424 | const SCEV *DstCoeff = SE->getMinusSCEV(SrcCoeff, SrcCoeff); | ||||||||||||||||||||
| 2425 | const SCEV *Inner = Src; | ||||||||||||||||||||
| 2426 | while (RunningGCD != 1 && isa<SCEVAddRecExpr>(Inner)) { | ||||||||||||||||||||
| 2427 | AddRec = cast<SCEVAddRecExpr>(Inner); | ||||||||||||||||||||
| 2428 | const SCEV *Coeff = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2429 | if (CurLoop == AddRec->getLoop()) | ||||||||||||||||||||
| 2430 | ; // SrcCoeff == Coeff | ||||||||||||||||||||
| 2431 | else { | ||||||||||||||||||||
| 2432 | // If the coefficient is the product of a constant and other stuff, | ||||||||||||||||||||
| 2433 | // we can use the constant in the GCD computation. | ||||||||||||||||||||
| 2434 | Constant = getConstantPart(Coeff); | ||||||||||||||||||||
| 2435 | if (!Constant) | ||||||||||||||||||||
| 2436 | return false; | ||||||||||||||||||||
| 2437 | APInt ConstCoeff = Constant->getAPInt(); | ||||||||||||||||||||
| 2438 | RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs()); | ||||||||||||||||||||
| 2439 | } | ||||||||||||||||||||
| 2440 | Inner = AddRec->getStart(); | ||||||||||||||||||||
| 2441 | } | ||||||||||||||||||||
| 2442 | Inner = Dst; | ||||||||||||||||||||
| 2443 | while (RunningGCD != 1 && isa<SCEVAddRecExpr>(Inner)) { | ||||||||||||||||||||
| 2444 | AddRec = cast<SCEVAddRecExpr>(Inner); | ||||||||||||||||||||
| 2445 | const SCEV *Coeff = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2446 | if (CurLoop == AddRec->getLoop()) | ||||||||||||||||||||
| 2447 | DstCoeff = Coeff; | ||||||||||||||||||||
| 2448 | else { | ||||||||||||||||||||
| 2449 | // If the coefficient is the product of a constant and other stuff, | ||||||||||||||||||||
| 2450 | // we can use the constant in the GCD computation. | ||||||||||||||||||||
| 2451 | Constant = getConstantPart(Coeff); | ||||||||||||||||||||
| 2452 | if (!Constant) | ||||||||||||||||||||
| 2453 | return false; | ||||||||||||||||||||
| 2454 | APInt ConstCoeff = Constant->getAPInt(); | ||||||||||||||||||||
| 2455 | RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs()); | ||||||||||||||||||||
| 2456 | } | ||||||||||||||||||||
| 2457 | Inner = AddRec->getStart(); | ||||||||||||||||||||
| 2458 | } | ||||||||||||||||||||
| 2459 | Delta = SE->getMinusSCEV(SrcCoeff, DstCoeff); | ||||||||||||||||||||
| 2460 | // If the coefficient is the product of a constant and other stuff, | ||||||||||||||||||||
| 2461 | // we can use the constant in the GCD computation. | ||||||||||||||||||||
| 2462 | Constant = getConstantPart(Delta); | ||||||||||||||||||||
| 2463 | if (!Constant) | ||||||||||||||||||||
| 2464 | // The difference of the two coefficients might not be a product | ||||||||||||||||||||
| 2465 | // or constant, in which case we give up on this direction. | ||||||||||||||||||||
| 2466 | continue; | ||||||||||||||||||||
| 2467 | APInt ConstCoeff = Constant->getAPInt(); | ||||||||||||||||||||
| 2468 | RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs()); | ||||||||||||||||||||
| 2469 | LLVM_DEBUG(dbgs() << "\tRunningGCD = " << RunningGCD << "\n")do { } while (false); | ||||||||||||||||||||
| 2470 | if (RunningGCD != 0) { | ||||||||||||||||||||
| 2471 | Remainder = ConstDelta.srem(RunningGCD); | ||||||||||||||||||||
| 2472 | LLVM_DEBUG(dbgs() << "\tRemainder = " << Remainder << "\n")do { } while (false); | ||||||||||||||||||||
| 2473 | if (Remainder != 0) { | ||||||||||||||||||||
| 2474 | unsigned Level = mapSrcLoop(CurLoop); | ||||||||||||||||||||
| 2475 | Result.DV[Level - 1].Direction &= unsigned(~Dependence::DVEntry::EQ); | ||||||||||||||||||||
| 2476 | Improved = true; | ||||||||||||||||||||
| 2477 | } | ||||||||||||||||||||
| 2478 | } | ||||||||||||||||||||
| 2479 | } | ||||||||||||||||||||
| 2480 | if (Improved) | ||||||||||||||||||||
| 2481 | ++GCDsuccesses; | ||||||||||||||||||||
| 2482 | LLVM_DEBUG(dbgs() << "all done\n")do { } while (false); | ||||||||||||||||||||
| 2483 | return false; | ||||||||||||||||||||
| 2484 | } | ||||||||||||||||||||
| 2485 | |||||||||||||||||||||
| 2486 | |||||||||||||||||||||
| 2487 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 2488 | // banerjeeMIVtest - | ||||||||||||||||||||
| 2489 | // Use Banerjee's Inequalities to test an MIV subscript pair. | ||||||||||||||||||||
| 2490 | // (Wolfe, in the race-car book, calls this the Extreme Value Test.) | ||||||||||||||||||||
| 2491 | // Generally follows the discussion in Section 2.5.2 of | ||||||||||||||||||||
| 2492 | // | ||||||||||||||||||||
| 2493 | // Optimizing Supercompilers for Supercomputers | ||||||||||||||||||||
| 2494 | // Michael Wolfe | ||||||||||||||||||||
| 2495 | // | ||||||||||||||||||||
| 2496 | // The inequalities given on page 25 are simplified in that loops are | ||||||||||||||||||||
| 2497 | // normalized so that the lower bound is always 0 and the stride is always 1. | ||||||||||||||||||||
| 2498 | // For example, Wolfe gives | ||||||||||||||||||||
| 2499 | // | ||||||||||||||||||||
| 2500 | // LB^<_k = (A^-_k - B_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k | ||||||||||||||||||||
| 2501 | // | ||||||||||||||||||||
| 2502 | // where A_k is the coefficient of the kth index in the source subscript, | ||||||||||||||||||||
| 2503 | // B_k is the coefficient of the kth index in the destination subscript, | ||||||||||||||||||||
| 2504 | // U_k is the upper bound of the kth index, L_k is the lower bound of the Kth | ||||||||||||||||||||
| 2505 | // index, and N_k is the stride of the kth index. Since all loops are normalized | ||||||||||||||||||||
| 2506 | // by the SCEV package, N_k = 1 and L_k = 0, allowing us to simplify the | ||||||||||||||||||||
| 2507 | // equation to | ||||||||||||||||||||
| 2508 | // | ||||||||||||||||||||
| 2509 | // LB^<_k = (A^-_k - B_k)^- (U_k - 0 - 1) + (A_k - B_k)0 - B_k 1 | ||||||||||||||||||||
| 2510 | // = (A^-_k - B_k)^- (U_k - 1) - B_k | ||||||||||||||||||||
| 2511 | // | ||||||||||||||||||||
| 2512 | // Similar simplifications are possible for the other equations. | ||||||||||||||||||||
| 2513 | // | ||||||||||||||||||||
| 2514 | // When we can't determine the number of iterations for a loop, | ||||||||||||||||||||
| 2515 | // we use NULL as an indicator for the worst case, infinity. | ||||||||||||||||||||
| 2516 | // When computing the upper bound, NULL denotes +inf; | ||||||||||||||||||||
| 2517 | // for the lower bound, NULL denotes -inf. | ||||||||||||||||||||
| 2518 | // | ||||||||||||||||||||
| 2519 | // Return true if dependence disproved. | ||||||||||||||||||||
| 2520 | bool DependenceInfo::banerjeeMIVtest(const SCEV *Src, const SCEV *Dst, | ||||||||||||||||||||
| 2521 | const SmallBitVector &Loops, | ||||||||||||||||||||
| 2522 | FullDependence &Result) const { | ||||||||||||||||||||
| 2523 | LLVM_DEBUG(dbgs() << "starting Banerjee\n")do { } while (false); | ||||||||||||||||||||
| 2524 | ++BanerjeeApplications; | ||||||||||||||||||||
| 2525 | LLVM_DEBUG(dbgs() << " Src = " << *Src << '\n')do { } while (false); | ||||||||||||||||||||
| 2526 | const SCEV *A0; | ||||||||||||||||||||
| 2527 | CoefficientInfo *A = collectCoeffInfo(Src, true, A0); | ||||||||||||||||||||
| 2528 | LLVM_DEBUG(dbgs() << " Dst = " << *Dst << '\n')do { } while (false); | ||||||||||||||||||||
| 2529 | const SCEV *B0; | ||||||||||||||||||||
| 2530 | CoefficientInfo *B = collectCoeffInfo(Dst, false, B0); | ||||||||||||||||||||
| 2531 | BoundInfo *Bound = new BoundInfo[MaxLevels + 1]; | ||||||||||||||||||||
| 2532 | const SCEV *Delta = SE->getMinusSCEV(B0, A0); | ||||||||||||||||||||
| 2533 | LLVM_DEBUG(dbgs() << "\tDelta = " << *Delta << '\n')do { } while (false); | ||||||||||||||||||||
| 2534 | |||||||||||||||||||||
| 2535 | // Compute bounds for all the * directions. | ||||||||||||||||||||
| 2536 | LLVM_DEBUG(dbgs() << "\tBounds[*]\n")do { } while (false); | ||||||||||||||||||||
| 2537 | for (unsigned K = 1; K <= MaxLevels; ++K) { | ||||||||||||||||||||
| 2538 | Bound[K].Iterations = A[K].Iterations ? A[K].Iterations : B[K].Iterations; | ||||||||||||||||||||
| 2539 | Bound[K].Direction = Dependence::DVEntry::ALL; | ||||||||||||||||||||
| 2540 | Bound[K].DirSet = Dependence::DVEntry::NONE; | ||||||||||||||||||||
| 2541 | findBoundsALL(A, B, Bound, K); | ||||||||||||||||||||
| 2542 | #ifndef NDEBUG1 | ||||||||||||||||||||
| 2543 | LLVM_DEBUG(dbgs() << "\t " << K << '\t')do { } while (false); | ||||||||||||||||||||
| 2544 | if (Bound[K].Lower[Dependence::DVEntry::ALL]) | ||||||||||||||||||||
| 2545 | LLVM_DEBUG(dbgs() << *Bound[K].Lower[Dependence::DVEntry::ALL] << '\t')do { } while (false); | ||||||||||||||||||||
| 2546 | else | ||||||||||||||||||||
| 2547 | LLVM_DEBUG(dbgs() << "-inf\t")do { } while (false); | ||||||||||||||||||||
| 2548 | if (Bound[K].Upper[Dependence::DVEntry::ALL]) | ||||||||||||||||||||
| 2549 | LLVM_DEBUG(dbgs() << *Bound[K].Upper[Dependence::DVEntry::ALL] << '\n')do { } while (false); | ||||||||||||||||||||
| 2550 | else | ||||||||||||||||||||
| 2551 | LLVM_DEBUG(dbgs() << "+inf\n")do { } while (false); | ||||||||||||||||||||
| 2552 | #endif | ||||||||||||||||||||
| 2553 | } | ||||||||||||||||||||
| 2554 | |||||||||||||||||||||
| 2555 | // Test the *, *, *, ... case. | ||||||||||||||||||||
| 2556 | bool Disproved = false; | ||||||||||||||||||||
| 2557 | if (testBounds(Dependence::DVEntry::ALL, 0, Bound, Delta)) { | ||||||||||||||||||||
| 2558 | // Explore the direction vector hierarchy. | ||||||||||||||||||||
| 2559 | unsigned DepthExpanded = 0; | ||||||||||||||||||||
| 2560 | unsigned NewDeps = exploreDirections(1, A, B, Bound, | ||||||||||||||||||||
| 2561 | Loops, DepthExpanded, Delta); | ||||||||||||||||||||
| 2562 | if (NewDeps > 0) { | ||||||||||||||||||||
| 2563 | bool Improved = false; | ||||||||||||||||||||
| 2564 | for (unsigned K = 1; K <= CommonLevels; ++K) { | ||||||||||||||||||||
| 2565 | if (Loops[K]) { | ||||||||||||||||||||
| 2566 | unsigned Old = Result.DV[K - 1].Direction; | ||||||||||||||||||||
| 2567 | Result.DV[K - 1].Direction = Old & Bound[K].DirSet; | ||||||||||||||||||||
| 2568 | Improved |= Old != Result.DV[K - 1].Direction; | ||||||||||||||||||||
| 2569 | if (!Result.DV[K - 1].Direction) { | ||||||||||||||||||||
| 2570 | Improved = false; | ||||||||||||||||||||
| 2571 | Disproved = true; | ||||||||||||||||||||
| 2572 | break; | ||||||||||||||||||||
| 2573 | } | ||||||||||||||||||||
| 2574 | } | ||||||||||||||||||||
| 2575 | } | ||||||||||||||||||||
| 2576 | if (Improved) | ||||||||||||||||||||
| 2577 | ++BanerjeeSuccesses; | ||||||||||||||||||||
| 2578 | } | ||||||||||||||||||||
| 2579 | else { | ||||||||||||||||||||
| 2580 | ++BanerjeeIndependence; | ||||||||||||||||||||
| 2581 | Disproved = true; | ||||||||||||||||||||
| 2582 | } | ||||||||||||||||||||
| 2583 | } | ||||||||||||||||||||
| 2584 | else { | ||||||||||||||||||||
| 2585 | ++BanerjeeIndependence; | ||||||||||||||||||||
| 2586 | Disproved = true; | ||||||||||||||||||||
| 2587 | } | ||||||||||||||||||||
| 2588 | delete [] Bound; | ||||||||||||||||||||
| 2589 | delete [] A; | ||||||||||||||||||||
| 2590 | delete [] B; | ||||||||||||||||||||
| 2591 | return Disproved; | ||||||||||||||||||||
| 2592 | } | ||||||||||||||||||||
| 2593 | |||||||||||||||||||||
| 2594 | |||||||||||||||||||||
| 2595 | // Hierarchically expands the direction vector | ||||||||||||||||||||
| 2596 | // search space, combining the directions of discovered dependences | ||||||||||||||||||||
| 2597 | // in the DirSet field of Bound. Returns the number of distinct | ||||||||||||||||||||
| 2598 | // dependences discovered. If the dependence is disproved, | ||||||||||||||||||||
| 2599 | // it will return 0. | ||||||||||||||||||||
| 2600 | unsigned DependenceInfo::exploreDirections(unsigned Level, CoefficientInfo *A, | ||||||||||||||||||||
| 2601 | CoefficientInfo *B, BoundInfo *Bound, | ||||||||||||||||||||
| 2602 | const SmallBitVector &Loops, | ||||||||||||||||||||
| 2603 | unsigned &DepthExpanded, | ||||||||||||||||||||
| 2604 | const SCEV *Delta) const { | ||||||||||||||||||||
| 2605 | if (Level > CommonLevels) { | ||||||||||||||||||||
| 2606 | // record result | ||||||||||||||||||||
| 2607 | LLVM_DEBUG(dbgs() << "\t[")do { } while (false); | ||||||||||||||||||||
| 2608 | for (unsigned K = 1; K <= CommonLevels; ++K) { | ||||||||||||||||||||
| 2609 | if (Loops[K]) { | ||||||||||||||||||||
| 2610 | Bound[K].DirSet |= Bound[K].Direction; | ||||||||||||||||||||
| 2611 | #ifndef NDEBUG1 | ||||||||||||||||||||
| 2612 | switch (Bound[K].Direction) { | ||||||||||||||||||||
| 2613 | case Dependence::DVEntry::LT: | ||||||||||||||||||||
| 2614 | LLVM_DEBUG(dbgs() << " <")do { } while (false); | ||||||||||||||||||||
| 2615 | break; | ||||||||||||||||||||
| 2616 | case Dependence::DVEntry::EQ: | ||||||||||||||||||||
| 2617 | LLVM_DEBUG(dbgs() << " =")do { } while (false); | ||||||||||||||||||||
| 2618 | break; | ||||||||||||||||||||
| 2619 | case Dependence::DVEntry::GT: | ||||||||||||||||||||
| 2620 | LLVM_DEBUG(dbgs() << " >")do { } while (false); | ||||||||||||||||||||
| 2621 | break; | ||||||||||||||||||||
| 2622 | case Dependence::DVEntry::ALL: | ||||||||||||||||||||
| 2623 | LLVM_DEBUG(dbgs() << " *")do { } while (false); | ||||||||||||||||||||
| 2624 | break; | ||||||||||||||||||||
| 2625 | default: | ||||||||||||||||||||
| 2626 | llvm_unreachable("unexpected Bound[K].Direction")__builtin_unreachable(); | ||||||||||||||||||||
| 2627 | } | ||||||||||||||||||||
| 2628 | #endif | ||||||||||||||||||||
| 2629 | } | ||||||||||||||||||||
| 2630 | } | ||||||||||||||||||||
| 2631 | LLVM_DEBUG(dbgs() << " ]\n")do { } while (false); | ||||||||||||||||||||
| 2632 | return 1; | ||||||||||||||||||||
| 2633 | } | ||||||||||||||||||||
| 2634 | if (Loops[Level]) { | ||||||||||||||||||||
| 2635 | if (Level > DepthExpanded) { | ||||||||||||||||||||
| 2636 | DepthExpanded = Level; | ||||||||||||||||||||
| 2637 | // compute bounds for <, =, > at current level | ||||||||||||||||||||
| 2638 | findBoundsLT(A, B, Bound, Level); | ||||||||||||||||||||
| 2639 | findBoundsGT(A, B, Bound, Level); | ||||||||||||||||||||
| 2640 | findBoundsEQ(A, B, Bound, Level); | ||||||||||||||||||||
| 2641 | #ifndef NDEBUG1 | ||||||||||||||||||||
| 2642 | LLVM_DEBUG(dbgs() << "\tBound for level = " << Level << '\n')do { } while (false); | ||||||||||||||||||||
| 2643 | LLVM_DEBUG(dbgs() << "\t <\t")do { } while (false); | ||||||||||||||||||||
| 2644 | if (Bound[Level].Lower[Dependence::DVEntry::LT]) | ||||||||||||||||||||
| 2645 | LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::LT]do { } while (false) | ||||||||||||||||||||
| 2646 | << '\t')do { } while (false); | ||||||||||||||||||||
| 2647 | else | ||||||||||||||||||||
| 2648 | LLVM_DEBUG(dbgs() << "-inf\t")do { } while (false); | ||||||||||||||||||||
| 2649 | if (Bound[Level].Upper[Dependence::DVEntry::LT]) | ||||||||||||||||||||
| 2650 | LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::LT]do { } while (false) | ||||||||||||||||||||
| 2651 | << '\n')do { } while (false); | ||||||||||||||||||||
| 2652 | else | ||||||||||||||||||||
| 2653 | LLVM_DEBUG(dbgs() << "+inf\n")do { } while (false); | ||||||||||||||||||||
| 2654 | LLVM_DEBUG(dbgs() << "\t =\t")do { } while (false); | ||||||||||||||||||||
| 2655 | if (Bound[Level].Lower[Dependence::DVEntry::EQ]) | ||||||||||||||||||||
| 2656 | LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::EQ]do { } while (false) | ||||||||||||||||||||
| 2657 | << '\t')do { } while (false); | ||||||||||||||||||||
| 2658 | else | ||||||||||||||||||||
| 2659 | LLVM_DEBUG(dbgs() << "-inf\t")do { } while (false); | ||||||||||||||||||||
| 2660 | if (Bound[Level].Upper[Dependence::DVEntry::EQ]) | ||||||||||||||||||||
| 2661 | LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::EQ]do { } while (false) | ||||||||||||||||||||
| 2662 | << '\n')do { } while (false); | ||||||||||||||||||||
| 2663 | else | ||||||||||||||||||||
| 2664 | LLVM_DEBUG(dbgs() << "+inf\n")do { } while (false); | ||||||||||||||||||||
| 2665 | LLVM_DEBUG(dbgs() << "\t >\t")do { } while (false); | ||||||||||||||||||||
| 2666 | if (Bound[Level].Lower[Dependence::DVEntry::GT]) | ||||||||||||||||||||
| 2667 | LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::GT]do { } while (false) | ||||||||||||||||||||
| 2668 | << '\t')do { } while (false); | ||||||||||||||||||||
| 2669 | else | ||||||||||||||||||||
| 2670 | LLVM_DEBUG(dbgs() << "-inf\t")do { } while (false); | ||||||||||||||||||||
| 2671 | if (Bound[Level].Upper[Dependence::DVEntry::GT]) | ||||||||||||||||||||
| 2672 | LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::GT]do { } while (false) | ||||||||||||||||||||
| 2673 | << '\n')do { } while (false); | ||||||||||||||||||||
| 2674 | else | ||||||||||||||||||||
| 2675 | LLVM_DEBUG(dbgs() << "+inf\n")do { } while (false); | ||||||||||||||||||||
| 2676 | #endif | ||||||||||||||||||||
| 2677 | } | ||||||||||||||||||||
| 2678 | |||||||||||||||||||||
| 2679 | unsigned NewDeps = 0; | ||||||||||||||||||||
| 2680 | |||||||||||||||||||||
| 2681 | // test bounds for <, *, *, ... | ||||||||||||||||||||
| 2682 | if (testBounds(Dependence::DVEntry::LT, Level, Bound, Delta)) | ||||||||||||||||||||
| 2683 | NewDeps += exploreDirections(Level + 1, A, B, Bound, | ||||||||||||||||||||
| 2684 | Loops, DepthExpanded, Delta); | ||||||||||||||||||||
| 2685 | |||||||||||||||||||||
| 2686 | // Test bounds for =, *, *, ... | ||||||||||||||||||||
| 2687 | if (testBounds(Dependence::DVEntry::EQ, Level, Bound, Delta)) | ||||||||||||||||||||
| 2688 | NewDeps += exploreDirections(Level + 1, A, B, Bound, | ||||||||||||||||||||
| 2689 | Loops, DepthExpanded, Delta); | ||||||||||||||||||||
| 2690 | |||||||||||||||||||||
| 2691 | // test bounds for >, *, *, ... | ||||||||||||||||||||
| 2692 | if (testBounds(Dependence::DVEntry::GT, Level, Bound, Delta)) | ||||||||||||||||||||
| 2693 | NewDeps += exploreDirections(Level + 1, A, B, Bound, | ||||||||||||||||||||
| 2694 | Loops, DepthExpanded, Delta); | ||||||||||||||||||||
| 2695 | |||||||||||||||||||||
| 2696 | Bound[Level].Direction = Dependence::DVEntry::ALL; | ||||||||||||||||||||
| 2697 | return NewDeps; | ||||||||||||||||||||
| 2698 | } | ||||||||||||||||||||
| 2699 | else | ||||||||||||||||||||
| 2700 | return exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded, Delta); | ||||||||||||||||||||
| 2701 | } | ||||||||||||||||||||
| 2702 | |||||||||||||||||||||
| 2703 | |||||||||||||||||||||
| 2704 | // Returns true iff the current bounds are plausible. | ||||||||||||||||||||
| 2705 | bool DependenceInfo::testBounds(unsigned char DirKind, unsigned Level, | ||||||||||||||||||||
| 2706 | BoundInfo *Bound, const SCEV *Delta) const { | ||||||||||||||||||||
| 2707 | Bound[Level].Direction = DirKind; | ||||||||||||||||||||
| 2708 | if (const SCEV *LowerBound = getLowerBound(Bound)) | ||||||||||||||||||||
| 2709 | if (isKnownPredicate(CmpInst::ICMP_SGT, LowerBound, Delta)) | ||||||||||||||||||||
| 2710 | return false; | ||||||||||||||||||||
| 2711 | if (const SCEV *UpperBound = getUpperBound(Bound)) | ||||||||||||||||||||
| 2712 | if (isKnownPredicate(CmpInst::ICMP_SGT, Delta, UpperBound)) | ||||||||||||||||||||
| 2713 | return false; | ||||||||||||||||||||
| 2714 | return true; | ||||||||||||||||||||
| 2715 | } | ||||||||||||||||||||
| 2716 | |||||||||||||||||||||
| 2717 | |||||||||||||||||||||
| 2718 | // Computes the upper and lower bounds for level K | ||||||||||||||||||||
| 2719 | // using the * direction. Records them in Bound. | ||||||||||||||||||||
| 2720 | // Wolfe gives the equations | ||||||||||||||||||||
| 2721 | // | ||||||||||||||||||||
| 2722 | // LB^*_k = (A^-_k - B^+_k)(U_k - L_k) + (A_k - B_k)L_k | ||||||||||||||||||||
| 2723 | // UB^*_k = (A^+_k - B^-_k)(U_k - L_k) + (A_k - B_k)L_k | ||||||||||||||||||||
| 2724 | // | ||||||||||||||||||||
| 2725 | // Since we normalize loops, we can simplify these equations to | ||||||||||||||||||||
| 2726 | // | ||||||||||||||||||||
| 2727 | // LB^*_k = (A^-_k - B^+_k)U_k | ||||||||||||||||||||
| 2728 | // UB^*_k = (A^+_k - B^-_k)U_k | ||||||||||||||||||||
| 2729 | // | ||||||||||||||||||||
| 2730 | // We must be careful to handle the case where the upper bound is unknown. | ||||||||||||||||||||
| 2731 | // Note that the lower bound is always <= 0 | ||||||||||||||||||||
| 2732 | // and the upper bound is always >= 0. | ||||||||||||||||||||
| 2733 | void DependenceInfo::findBoundsALL(CoefficientInfo *A, CoefficientInfo *B, | ||||||||||||||||||||
| 2734 | BoundInfo *Bound, unsigned K) const { | ||||||||||||||||||||
| 2735 | Bound[K].Lower[Dependence::DVEntry::ALL] = nullptr; // Default value = -infinity. | ||||||||||||||||||||
| 2736 | Bound[K].Upper[Dependence::DVEntry::ALL] = nullptr; // Default value = +infinity. | ||||||||||||||||||||
| 2737 | if (Bound[K].Iterations) { | ||||||||||||||||||||
| 2738 | Bound[K].Lower[Dependence::DVEntry::ALL] = | ||||||||||||||||||||
| 2739 | SE->getMulExpr(SE->getMinusSCEV(A[K].NegPart, B[K].PosPart), | ||||||||||||||||||||
| 2740 | Bound[K].Iterations); | ||||||||||||||||||||
| 2741 | Bound[K].Upper[Dependence::DVEntry::ALL] = | ||||||||||||||||||||
| 2742 | SE->getMulExpr(SE->getMinusSCEV(A[K].PosPart, B[K].NegPart), | ||||||||||||||||||||
| 2743 | Bound[K].Iterations); | ||||||||||||||||||||
| 2744 | } | ||||||||||||||||||||
| 2745 | else { | ||||||||||||||||||||
| 2746 | // If the difference is 0, we won't need to know the number of iterations. | ||||||||||||||||||||
| 2747 | if (isKnownPredicate(CmpInst::ICMP_EQ, A[K].NegPart, B[K].PosPart)) | ||||||||||||||||||||
| 2748 | Bound[K].Lower[Dependence::DVEntry::ALL] = | ||||||||||||||||||||
| 2749 | SE->getZero(A[K].Coeff->getType()); | ||||||||||||||||||||
| 2750 | if (isKnownPredicate(CmpInst::ICMP_EQ, A[K].PosPart, B[K].NegPart)) | ||||||||||||||||||||
| 2751 | Bound[K].Upper[Dependence::DVEntry::ALL] = | ||||||||||||||||||||
| 2752 | SE->getZero(A[K].Coeff->getType()); | ||||||||||||||||||||
| 2753 | } | ||||||||||||||||||||
| 2754 | } | ||||||||||||||||||||
| 2755 | |||||||||||||||||||||
| 2756 | |||||||||||||||||||||
| 2757 | // Computes the upper and lower bounds for level K | ||||||||||||||||||||
| 2758 | // using the = direction. Records them in Bound. | ||||||||||||||||||||
| 2759 | // Wolfe gives the equations | ||||||||||||||||||||
| 2760 | // | ||||||||||||||||||||
| 2761 | // LB^=_k = (A_k - B_k)^- (U_k - L_k) + (A_k - B_k)L_k | ||||||||||||||||||||
| 2762 | // UB^=_k = (A_k - B_k)^+ (U_k - L_k) + (A_k - B_k)L_k | ||||||||||||||||||||
| 2763 | // | ||||||||||||||||||||
| 2764 | // Since we normalize loops, we can simplify these equations to | ||||||||||||||||||||
| 2765 | // | ||||||||||||||||||||
| 2766 | // LB^=_k = (A_k - B_k)^- U_k | ||||||||||||||||||||
| 2767 | // UB^=_k = (A_k - B_k)^+ U_k | ||||||||||||||||||||
| 2768 | // | ||||||||||||||||||||
| 2769 | // We must be careful to handle the case where the upper bound is unknown. | ||||||||||||||||||||
| 2770 | // Note that the lower bound is always <= 0 | ||||||||||||||||||||
| 2771 | // and the upper bound is always >= 0. | ||||||||||||||||||||
| 2772 | void DependenceInfo::findBoundsEQ(CoefficientInfo *A, CoefficientInfo *B, | ||||||||||||||||||||
| 2773 | BoundInfo *Bound, unsigned K) const { | ||||||||||||||||||||
| 2774 | Bound[K].Lower[Dependence::DVEntry::EQ] = nullptr; // Default value = -infinity. | ||||||||||||||||||||
| 2775 | Bound[K].Upper[Dependence::DVEntry::EQ] = nullptr; // Default value = +infinity. | ||||||||||||||||||||
| 2776 | if (Bound[K].Iterations) { | ||||||||||||||||||||
| 2777 | const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff); | ||||||||||||||||||||
| 2778 | const SCEV *NegativePart = getNegativePart(Delta); | ||||||||||||||||||||
| 2779 | Bound[K].Lower[Dependence::DVEntry::EQ] = | ||||||||||||||||||||
| 2780 | SE->getMulExpr(NegativePart, Bound[K].Iterations); | ||||||||||||||||||||
| 2781 | const SCEV *PositivePart = getPositivePart(Delta); | ||||||||||||||||||||
| 2782 | Bound[K].Upper[Dependence::DVEntry::EQ] = | ||||||||||||||||||||
| 2783 | SE->getMulExpr(PositivePart, Bound[K].Iterations); | ||||||||||||||||||||
| 2784 | } | ||||||||||||||||||||
| 2785 | else { | ||||||||||||||||||||
| 2786 | // If the positive/negative part of the difference is 0, | ||||||||||||||||||||
| 2787 | // we won't need to know the number of iterations. | ||||||||||||||||||||
| 2788 | const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff); | ||||||||||||||||||||
| 2789 | const SCEV *NegativePart = getNegativePart(Delta); | ||||||||||||||||||||
| 2790 | if (NegativePart->isZero()) | ||||||||||||||||||||
| 2791 | Bound[K].Lower[Dependence::DVEntry::EQ] = NegativePart; // Zero | ||||||||||||||||||||
| 2792 | const SCEV *PositivePart = getPositivePart(Delta); | ||||||||||||||||||||
| 2793 | if (PositivePart->isZero()) | ||||||||||||||||||||
| 2794 | Bound[K].Upper[Dependence::DVEntry::EQ] = PositivePart; // Zero | ||||||||||||||||||||
| 2795 | } | ||||||||||||||||||||
| 2796 | } | ||||||||||||||||||||
| 2797 | |||||||||||||||||||||
| 2798 | |||||||||||||||||||||
| 2799 | // Computes the upper and lower bounds for level K | ||||||||||||||||||||
| 2800 | // using the < direction. Records them in Bound. | ||||||||||||||||||||
| 2801 | // Wolfe gives the equations | ||||||||||||||||||||
| 2802 | // | ||||||||||||||||||||
| 2803 | // LB^<_k = (A^-_k - B_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k | ||||||||||||||||||||
| 2804 | // UB^<_k = (A^+_k - B_k)^+ (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k | ||||||||||||||||||||
| 2805 | // | ||||||||||||||||||||
| 2806 | // Since we normalize loops, we can simplify these equations to | ||||||||||||||||||||
| 2807 | // | ||||||||||||||||||||
| 2808 | // LB^<_k = (A^-_k - B_k)^- (U_k - 1) - B_k | ||||||||||||||||||||
| 2809 | // UB^<_k = (A^+_k - B_k)^+ (U_k - 1) - B_k | ||||||||||||||||||||
| 2810 | // | ||||||||||||||||||||
| 2811 | // We must be careful to handle the case where the upper bound is unknown. | ||||||||||||||||||||
| 2812 | void DependenceInfo::findBoundsLT(CoefficientInfo *A, CoefficientInfo *B, | ||||||||||||||||||||
| 2813 | BoundInfo *Bound, unsigned K) const { | ||||||||||||||||||||
| 2814 | Bound[K].Lower[Dependence::DVEntry::LT] = nullptr; // Default value = -infinity. | ||||||||||||||||||||
| 2815 | Bound[K].Upper[Dependence::DVEntry::LT] = nullptr; // Default value = +infinity. | ||||||||||||||||||||
| 2816 | if (Bound[K].Iterations) { | ||||||||||||||||||||
| 2817 | const SCEV *Iter_1 = SE->getMinusSCEV( | ||||||||||||||||||||
| 2818 | Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType())); | ||||||||||||||||||||
| 2819 | const SCEV *NegPart = | ||||||||||||||||||||
| 2820 | getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff)); | ||||||||||||||||||||
| 2821 | Bound[K].Lower[Dependence::DVEntry::LT] = | ||||||||||||||||||||
| 2822 | SE->getMinusSCEV(SE->getMulExpr(NegPart, Iter_1), B[K].Coeff); | ||||||||||||||||||||
| 2823 | const SCEV *PosPart = | ||||||||||||||||||||
| 2824 | getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff)); | ||||||||||||||||||||
| 2825 | Bound[K].Upper[Dependence::DVEntry::LT] = | ||||||||||||||||||||
| 2826 | SE->getMinusSCEV(SE->getMulExpr(PosPart, Iter_1), B[K].Coeff); | ||||||||||||||||||||
| 2827 | } | ||||||||||||||||||||
| 2828 | else { | ||||||||||||||||||||
| 2829 | // If the positive/negative part of the difference is 0, | ||||||||||||||||||||
| 2830 | // we won't need to know the number of iterations. | ||||||||||||||||||||
| 2831 | const SCEV *NegPart = | ||||||||||||||||||||
| 2832 | getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff)); | ||||||||||||||||||||
| 2833 | if (NegPart->isZero()) | ||||||||||||||||||||
| 2834 | Bound[K].Lower[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff); | ||||||||||||||||||||
| 2835 | const SCEV *PosPart = | ||||||||||||||||||||
| 2836 | getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff)); | ||||||||||||||||||||
| 2837 | if (PosPart->isZero()) | ||||||||||||||||||||
| 2838 | Bound[K].Upper[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff); | ||||||||||||||||||||
| 2839 | } | ||||||||||||||||||||
| 2840 | } | ||||||||||||||||||||
| 2841 | |||||||||||||||||||||
| 2842 | |||||||||||||||||||||
| 2843 | // Computes the upper and lower bounds for level K | ||||||||||||||||||||
| 2844 | // using the > direction. Records them in Bound. | ||||||||||||||||||||
| 2845 | // Wolfe gives the equations | ||||||||||||||||||||
| 2846 | // | ||||||||||||||||||||
| 2847 | // LB^>_k = (A_k - B^+_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k + A_k N_k | ||||||||||||||||||||
| 2848 | // UB^>_k = (A_k - B^-_k)^+ (U_k - L_k - N_k) + (A_k - B_k)L_k + A_k N_k | ||||||||||||||||||||
| 2849 | // | ||||||||||||||||||||
| 2850 | // Since we normalize loops, we can simplify these equations to | ||||||||||||||||||||
| 2851 | // | ||||||||||||||||||||
| 2852 | // LB^>_k = (A_k - B^+_k)^- (U_k - 1) + A_k | ||||||||||||||||||||
| 2853 | // UB^>_k = (A_k - B^-_k)^+ (U_k - 1) + A_k | ||||||||||||||||||||
| 2854 | // | ||||||||||||||||||||
| 2855 | // We must be careful to handle the case where the upper bound is unknown. | ||||||||||||||||||||
| 2856 | void DependenceInfo::findBoundsGT(CoefficientInfo *A, CoefficientInfo *B, | ||||||||||||||||||||
| 2857 | BoundInfo *Bound, unsigned K) const { | ||||||||||||||||||||
| 2858 | Bound[K].Lower[Dependence::DVEntry::GT] = nullptr; // Default value = -infinity. | ||||||||||||||||||||
| 2859 | Bound[K].Upper[Dependence::DVEntry::GT] = nullptr; // Default value = +infinity. | ||||||||||||||||||||
| 2860 | if (Bound[K].Iterations) { | ||||||||||||||||||||
| 2861 | const SCEV *Iter_1 = SE->getMinusSCEV( | ||||||||||||||||||||
| 2862 | Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType())); | ||||||||||||||||||||
| 2863 | const SCEV *NegPart = | ||||||||||||||||||||
| 2864 | getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart)); | ||||||||||||||||||||
| 2865 | Bound[K].Lower[Dependence::DVEntry::GT] = | ||||||||||||||||||||
| 2866 | SE->getAddExpr(SE->getMulExpr(NegPart, Iter_1), A[K].Coeff); | ||||||||||||||||||||
| 2867 | const SCEV *PosPart = | ||||||||||||||||||||
| 2868 | getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart)); | ||||||||||||||||||||
| 2869 | Bound[K].Upper[Dependence::DVEntry::GT] = | ||||||||||||||||||||
| 2870 | SE->getAddExpr(SE->getMulExpr(PosPart, Iter_1), A[K].Coeff); | ||||||||||||||||||||
| 2871 | } | ||||||||||||||||||||
| 2872 | else { | ||||||||||||||||||||
| 2873 | // If the positive/negative part of the difference is 0, | ||||||||||||||||||||
| 2874 | // we won't need to know the number of iterations. | ||||||||||||||||||||
| 2875 | const SCEV *NegPart = getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart)); | ||||||||||||||||||||
| 2876 | if (NegPart->isZero()) | ||||||||||||||||||||
| 2877 | Bound[K].Lower[Dependence::DVEntry::GT] = A[K].Coeff; | ||||||||||||||||||||
| 2878 | const SCEV *PosPart = getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart)); | ||||||||||||||||||||
| 2879 | if (PosPart->isZero()) | ||||||||||||||||||||
| 2880 | Bound[K].Upper[Dependence::DVEntry::GT] = A[K].Coeff; | ||||||||||||||||||||
| 2881 | } | ||||||||||||||||||||
| 2882 | } | ||||||||||||||||||||
| 2883 | |||||||||||||||||||||
| 2884 | |||||||||||||||||||||
| 2885 | // X^+ = max(X, 0) | ||||||||||||||||||||
| 2886 | const SCEV *DependenceInfo::getPositivePart(const SCEV *X) const { | ||||||||||||||||||||
| 2887 | return SE->getSMaxExpr(X, SE->getZero(X->getType())); | ||||||||||||||||||||
| 2888 | } | ||||||||||||||||||||
| 2889 | |||||||||||||||||||||
| 2890 | |||||||||||||||||||||
| 2891 | // X^- = min(X, 0) | ||||||||||||||||||||
| 2892 | const SCEV *DependenceInfo::getNegativePart(const SCEV *X) const { | ||||||||||||||||||||
| 2893 | return SE->getSMinExpr(X, SE->getZero(X->getType())); | ||||||||||||||||||||
| 2894 | } | ||||||||||||||||||||
| 2895 | |||||||||||||||||||||
| 2896 | |||||||||||||||||||||
| 2897 | // Walks through the subscript, | ||||||||||||||||||||
| 2898 | // collecting each coefficient, the associated loop bounds, | ||||||||||||||||||||
| 2899 | // and recording its positive and negative parts for later use. | ||||||||||||||||||||
| 2900 | DependenceInfo::CoefficientInfo * | ||||||||||||||||||||
| 2901 | DependenceInfo::collectCoeffInfo(const SCEV *Subscript, bool SrcFlag, | ||||||||||||||||||||
| 2902 | const SCEV *&Constant) const { | ||||||||||||||||||||
| 2903 | const SCEV *Zero = SE->getZero(Subscript->getType()); | ||||||||||||||||||||
| 2904 | CoefficientInfo *CI = new CoefficientInfo[MaxLevels + 1]; | ||||||||||||||||||||
| 2905 | for (unsigned K = 1; K <= MaxLevels; ++K) { | ||||||||||||||||||||
| 2906 | CI[K].Coeff = Zero; | ||||||||||||||||||||
| 2907 | CI[K].PosPart = Zero; | ||||||||||||||||||||
| 2908 | CI[K].NegPart = Zero; | ||||||||||||||||||||
| 2909 | CI[K].Iterations = nullptr; | ||||||||||||||||||||
| 2910 | } | ||||||||||||||||||||
| 2911 | while (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Subscript)) { | ||||||||||||||||||||
| 2912 | const Loop *L = AddRec->getLoop(); | ||||||||||||||||||||
| 2913 | unsigned K = SrcFlag ? mapSrcLoop(L) : mapDstLoop(L); | ||||||||||||||||||||
| 2914 | CI[K].Coeff = AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2915 | CI[K].PosPart = getPositivePart(CI[K].Coeff); | ||||||||||||||||||||
| 2916 | CI[K].NegPart = getNegativePart(CI[K].Coeff); | ||||||||||||||||||||
| 2917 | CI[K].Iterations = collectUpperBound(L, Subscript->getType()); | ||||||||||||||||||||
| 2918 | Subscript = AddRec->getStart(); | ||||||||||||||||||||
| 2919 | } | ||||||||||||||||||||
| 2920 | Constant = Subscript; | ||||||||||||||||||||
| 2921 | #ifndef NDEBUG1 | ||||||||||||||||||||
| 2922 | LLVM_DEBUG(dbgs() << "\tCoefficient Info\n")do { } while (false); | ||||||||||||||||||||
| 2923 | for (unsigned K = 1; K <= MaxLevels; ++K) { | ||||||||||||||||||||
| 2924 | LLVM_DEBUG(dbgs() << "\t " << K << "\t" << *CI[K].Coeff)do { } while (false); | ||||||||||||||||||||
| 2925 | LLVM_DEBUG(dbgs() << "\tPos Part = ")do { } while (false); | ||||||||||||||||||||
| 2926 | LLVM_DEBUG(dbgs() << *CI[K].PosPart)do { } while (false); | ||||||||||||||||||||
| 2927 | LLVM_DEBUG(dbgs() << "\tNeg Part = ")do { } while (false); | ||||||||||||||||||||
| 2928 | LLVM_DEBUG(dbgs() << *CI[K].NegPart)do { } while (false); | ||||||||||||||||||||
| 2929 | LLVM_DEBUG(dbgs() << "\tUpper Bound = ")do { } while (false); | ||||||||||||||||||||
| 2930 | if (CI[K].Iterations) | ||||||||||||||||||||
| 2931 | LLVM_DEBUG(dbgs() << *CI[K].Iterations)do { } while (false); | ||||||||||||||||||||
| 2932 | else | ||||||||||||||||||||
| 2933 | LLVM_DEBUG(dbgs() << "+inf")do { } while (false); | ||||||||||||||||||||
| 2934 | LLVM_DEBUG(dbgs() << '\n')do { } while (false); | ||||||||||||||||||||
| 2935 | } | ||||||||||||||||||||
| 2936 | LLVM_DEBUG(dbgs() << "\t Constant = " << *Subscript << '\n')do { } while (false); | ||||||||||||||||||||
| 2937 | #endif | ||||||||||||||||||||
| 2938 | return CI; | ||||||||||||||||||||
| 2939 | } | ||||||||||||||||||||
| 2940 | |||||||||||||||||||||
| 2941 | |||||||||||||||||||||
| 2942 | // Looks through all the bounds info and | ||||||||||||||||||||
| 2943 | // computes the lower bound given the current direction settings | ||||||||||||||||||||
| 2944 | // at each level. If the lower bound for any level is -inf, | ||||||||||||||||||||
| 2945 | // the result is -inf. | ||||||||||||||||||||
| 2946 | const SCEV *DependenceInfo::getLowerBound(BoundInfo *Bound) const { | ||||||||||||||||||||
| 2947 | const SCEV *Sum = Bound[1].Lower[Bound[1].Direction]; | ||||||||||||||||||||
| 2948 | for (unsigned K = 2; Sum && K <= MaxLevels; ++K) { | ||||||||||||||||||||
| 2949 | if (Bound[K].Lower[Bound[K].Direction]) | ||||||||||||||||||||
| 2950 | Sum = SE->getAddExpr(Sum, Bound[K].Lower[Bound[K].Direction]); | ||||||||||||||||||||
| 2951 | else | ||||||||||||||||||||
| 2952 | Sum = nullptr; | ||||||||||||||||||||
| 2953 | } | ||||||||||||||||||||
| 2954 | return Sum; | ||||||||||||||||||||
| 2955 | } | ||||||||||||||||||||
| 2956 | |||||||||||||||||||||
| 2957 | |||||||||||||||||||||
| 2958 | // Looks through all the bounds info and | ||||||||||||||||||||
| 2959 | // computes the upper bound given the current direction settings | ||||||||||||||||||||
| 2960 | // at each level. If the upper bound at any level is +inf, | ||||||||||||||||||||
| 2961 | // the result is +inf. | ||||||||||||||||||||
| 2962 | const SCEV *DependenceInfo::getUpperBound(BoundInfo *Bound) const { | ||||||||||||||||||||
| 2963 | const SCEV *Sum = Bound[1].Upper[Bound[1].Direction]; | ||||||||||||||||||||
| 2964 | for (unsigned K = 2; Sum && K <= MaxLevels; ++K) { | ||||||||||||||||||||
| 2965 | if (Bound[K].Upper[Bound[K].Direction]) | ||||||||||||||||||||
| 2966 | Sum = SE->getAddExpr(Sum, Bound[K].Upper[Bound[K].Direction]); | ||||||||||||||||||||
| 2967 | else | ||||||||||||||||||||
| 2968 | Sum = nullptr; | ||||||||||||||||||||
| 2969 | } | ||||||||||||||||||||
| 2970 | return Sum; | ||||||||||||||||||||
| 2971 | } | ||||||||||||||||||||
| 2972 | |||||||||||||||||||||
| 2973 | |||||||||||||||||||||
| 2974 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 2975 | // Constraint manipulation for Delta test. | ||||||||||||||||||||
| 2976 | |||||||||||||||||||||
| 2977 | // Given a linear SCEV, | ||||||||||||||||||||
| 2978 | // return the coefficient (the step) | ||||||||||||||||||||
| 2979 | // corresponding to the specified loop. | ||||||||||||||||||||
| 2980 | // If there isn't one, return 0. | ||||||||||||||||||||
| 2981 | // For example, given a*i + b*j + c*k, finding the coefficient | ||||||||||||||||||||
| 2982 | // corresponding to the j loop would yield b. | ||||||||||||||||||||
| 2983 | const SCEV *DependenceInfo::findCoefficient(const SCEV *Expr, | ||||||||||||||||||||
| 2984 | const Loop *TargetLoop) const { | ||||||||||||||||||||
| 2985 | const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr); | ||||||||||||||||||||
| 2986 | if (!AddRec) | ||||||||||||||||||||
| 2987 | return SE->getZero(Expr->getType()); | ||||||||||||||||||||
| 2988 | if (AddRec->getLoop() == TargetLoop) | ||||||||||||||||||||
| 2989 | return AddRec->getStepRecurrence(*SE); | ||||||||||||||||||||
| 2990 | return findCoefficient(AddRec->getStart(), TargetLoop); | ||||||||||||||||||||
| 2991 | } | ||||||||||||||||||||
| 2992 | |||||||||||||||||||||
| 2993 | |||||||||||||||||||||
| 2994 | // Given a linear SCEV, | ||||||||||||||||||||
| 2995 | // return the SCEV given by zeroing out the coefficient | ||||||||||||||||||||
| 2996 | // corresponding to the specified loop. | ||||||||||||||||||||
| 2997 | // For example, given a*i + b*j + c*k, zeroing the coefficient | ||||||||||||||||||||
| 2998 | // corresponding to the j loop would yield a*i + c*k. | ||||||||||||||||||||
| 2999 | const SCEV *DependenceInfo::zeroCoefficient(const SCEV *Expr, | ||||||||||||||||||||
| 3000 | const Loop *TargetLoop) const { | ||||||||||||||||||||
| 3001 | const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr); | ||||||||||||||||||||
| 3002 | if (!AddRec) | ||||||||||||||||||||
| 3003 | return Expr; // ignore | ||||||||||||||||||||
| 3004 | if (AddRec->getLoop() == TargetLoop) | ||||||||||||||||||||
| 3005 | return AddRec->getStart(); | ||||||||||||||||||||
| 3006 | return SE->getAddRecExpr(zeroCoefficient(AddRec->getStart(), TargetLoop), | ||||||||||||||||||||
| 3007 | AddRec->getStepRecurrence(*SE), | ||||||||||||||||||||
| 3008 | AddRec->getLoop(), | ||||||||||||||||||||
| 3009 | AddRec->getNoWrapFlags()); | ||||||||||||||||||||
| 3010 | } | ||||||||||||||||||||
| 3011 | |||||||||||||||||||||
| 3012 | |||||||||||||||||||||
| 3013 | // Given a linear SCEV Expr, | ||||||||||||||||||||
| 3014 | // return the SCEV given by adding some Value to the | ||||||||||||||||||||
| 3015 | // coefficient corresponding to the specified TargetLoop. | ||||||||||||||||||||
| 3016 | // For example, given a*i + b*j + c*k, adding 1 to the coefficient | ||||||||||||||||||||
| 3017 | // corresponding to the j loop would yield a*i + (b+1)*j + c*k. | ||||||||||||||||||||
| 3018 | const SCEV *DependenceInfo::addToCoefficient(const SCEV *Expr, | ||||||||||||||||||||
| 3019 | const Loop *TargetLoop, | ||||||||||||||||||||
| 3020 | const SCEV *Value) const { | ||||||||||||||||||||
| 3021 | const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr); | ||||||||||||||||||||
| 3022 | if (!AddRec) // create a new addRec | ||||||||||||||||||||
| 3023 | return SE->getAddRecExpr(Expr, | ||||||||||||||||||||
| 3024 | Value, | ||||||||||||||||||||
| 3025 | TargetLoop, | ||||||||||||||||||||
| 3026 | SCEV::FlagAnyWrap); // Worst case, with no info. | ||||||||||||||||||||
| 3027 | if (AddRec->getLoop() == TargetLoop) { | ||||||||||||||||||||
| 3028 | const SCEV *Sum = SE->getAddExpr(AddRec->getStepRecurrence(*SE), Value); | ||||||||||||||||||||
| 3029 | if (Sum->isZero()) | ||||||||||||||||||||
| 3030 | return AddRec->getStart(); | ||||||||||||||||||||
| 3031 | return SE->getAddRecExpr(AddRec->getStart(), | ||||||||||||||||||||
| 3032 | Sum, | ||||||||||||||||||||
| 3033 | AddRec->getLoop(), | ||||||||||||||||||||
| 3034 | AddRec->getNoWrapFlags()); | ||||||||||||||||||||
| 3035 | } | ||||||||||||||||||||
| 3036 | if (SE->isLoopInvariant(AddRec, TargetLoop)) | ||||||||||||||||||||
| 3037 | return SE->getAddRecExpr(AddRec, Value, TargetLoop, SCEV::FlagAnyWrap); | ||||||||||||||||||||
| 3038 | return SE->getAddRecExpr( | ||||||||||||||||||||
| 3039 | addToCoefficient(AddRec->getStart(), TargetLoop, Value), | ||||||||||||||||||||
| 3040 | AddRec->getStepRecurrence(*SE), AddRec->getLoop(), | ||||||||||||||||||||
| 3041 | AddRec->getNoWrapFlags()); | ||||||||||||||||||||
| 3042 | } | ||||||||||||||||||||
| 3043 | |||||||||||||||||||||
| 3044 | |||||||||||||||||||||
| 3045 | // Review the constraints, looking for opportunities | ||||||||||||||||||||
| 3046 | // to simplify a subscript pair (Src and Dst). | ||||||||||||||||||||
| 3047 | // Return true if some simplification occurs. | ||||||||||||||||||||
| 3048 | // If the simplification isn't exact (that is, if it is conservative | ||||||||||||||||||||
| 3049 | // in terms of dependence), set consistent to false. | ||||||||||||||||||||
| 3050 | // Corresponds to Figure 5 from the paper | ||||||||||||||||||||
| 3051 | // | ||||||||||||||||||||
| 3052 | // Practical Dependence Testing | ||||||||||||||||||||
| 3053 | // Goff, Kennedy, Tseng | ||||||||||||||||||||
| 3054 | // PLDI 1991 | ||||||||||||||||||||
| 3055 | bool DependenceInfo::propagate(const SCEV *&Src, const SCEV *&Dst, | ||||||||||||||||||||
| 3056 | SmallBitVector &Loops, | ||||||||||||||||||||
| 3057 | SmallVectorImpl<Constraint> &Constraints, | ||||||||||||||||||||
| 3058 | bool &Consistent) { | ||||||||||||||||||||
| 3059 | bool Result = false; | ||||||||||||||||||||
| 3060 | for (unsigned LI : Loops.set_bits()) { | ||||||||||||||||||||
| 3061 | LLVM_DEBUG(dbgs() << "\t Constraint[" << LI << "] is")do { } while (false); | ||||||||||||||||||||
| 3062 | LLVM_DEBUG(Constraints[LI].dump(dbgs()))do { } while (false); | ||||||||||||||||||||
| 3063 | if (Constraints[LI].isDistance()) | ||||||||||||||||||||
| 3064 | Result |= propagateDistance(Src, Dst, Constraints[LI], Consistent); | ||||||||||||||||||||
| 3065 | else if (Constraints[LI].isLine()) | ||||||||||||||||||||
| 3066 | Result |= propagateLine(Src, Dst, Constraints[LI], Consistent); | ||||||||||||||||||||
| 3067 | else if (Constraints[LI].isPoint()) | ||||||||||||||||||||
| 3068 | Result |= propagatePoint(Src, Dst, Constraints[LI]); | ||||||||||||||||||||
| 3069 | } | ||||||||||||||||||||
| 3070 | return Result; | ||||||||||||||||||||
| 3071 | } | ||||||||||||||||||||
| 3072 | |||||||||||||||||||||
| 3073 | |||||||||||||||||||||
| 3074 | // Attempt to propagate a distance | ||||||||||||||||||||
| 3075 | // constraint into a subscript pair (Src and Dst). | ||||||||||||||||||||
| 3076 | // Return true if some simplification occurs. | ||||||||||||||||||||
| 3077 | // If the simplification isn't exact (that is, if it is conservative | ||||||||||||||||||||
| 3078 | // in terms of dependence), set consistent to false. | ||||||||||||||||||||
| 3079 | bool DependenceInfo::propagateDistance(const SCEV *&Src, const SCEV *&Dst, | ||||||||||||||||||||
| 3080 | Constraint &CurConstraint, | ||||||||||||||||||||
| 3081 | bool &Consistent) { | ||||||||||||||||||||
| 3082 | const Loop *CurLoop = CurConstraint.getAssociatedLoop(); | ||||||||||||||||||||
| 3083 | LLVM_DEBUG(dbgs() << "\t\tSrc is " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3084 | const SCEV *A_K = findCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3085 | if (A_K->isZero()) | ||||||||||||||||||||
| 3086 | return false; | ||||||||||||||||||||
| 3087 | const SCEV *DA_K = SE->getMulExpr(A_K, CurConstraint.getD()); | ||||||||||||||||||||
| 3088 | Src = SE->getMinusSCEV(Src, DA_K); | ||||||||||||||||||||
| 3089 | Src = zeroCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3090 | LLVM_DEBUG(dbgs() << "\t\tnew Src is " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3091 | LLVM_DEBUG(dbgs() << "\t\tDst is " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3092 | Dst = addToCoefficient(Dst, CurLoop, SE->getNegativeSCEV(A_K)); | ||||||||||||||||||||
| 3093 | LLVM_DEBUG(dbgs() << "\t\tnew Dst is " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3094 | if (!findCoefficient(Dst, CurLoop)->isZero()) | ||||||||||||||||||||
| 3095 | Consistent = false; | ||||||||||||||||||||
| 3096 | return true; | ||||||||||||||||||||
| 3097 | } | ||||||||||||||||||||
| 3098 | |||||||||||||||||||||
| 3099 | |||||||||||||||||||||
| 3100 | // Attempt to propagate a line | ||||||||||||||||||||
| 3101 | // constraint into a subscript pair (Src and Dst). | ||||||||||||||||||||
| 3102 | // Return true if some simplification occurs. | ||||||||||||||||||||
| 3103 | // If the simplification isn't exact (that is, if it is conservative | ||||||||||||||||||||
| 3104 | // in terms of dependence), set consistent to false. | ||||||||||||||||||||
| 3105 | bool DependenceInfo::propagateLine(const SCEV *&Src, const SCEV *&Dst, | ||||||||||||||||||||
| 3106 | Constraint &CurConstraint, | ||||||||||||||||||||
| 3107 | bool &Consistent) { | ||||||||||||||||||||
| 3108 | const Loop *CurLoop = CurConstraint.getAssociatedLoop(); | ||||||||||||||||||||
| 3109 | const SCEV *A = CurConstraint.getA(); | ||||||||||||||||||||
| 3110 | const SCEV *B = CurConstraint.getB(); | ||||||||||||||||||||
| 3111 | const SCEV *C = CurConstraint.getC(); | ||||||||||||||||||||
| 3112 | LLVM_DEBUG(dbgs() << "\t\tA = " << *A << ", B = " << *B << ", C = " << *Cdo { } while (false) | ||||||||||||||||||||
| 3113 | << "\n")do { } while (false); | ||||||||||||||||||||
| 3114 | LLVM_DEBUG(dbgs() << "\t\tSrc = " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3115 | LLVM_DEBUG(dbgs() << "\t\tDst = " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3116 | if (A->isZero()) { | ||||||||||||||||||||
| 3117 | const SCEVConstant *Bconst = dyn_cast<SCEVConstant>(B); | ||||||||||||||||||||
| 3118 | const SCEVConstant *Cconst = dyn_cast<SCEVConstant>(C); | ||||||||||||||||||||
| 3119 | if (!Bconst || !Cconst) return false; | ||||||||||||||||||||
| 3120 | APInt Beta = Bconst->getAPInt(); | ||||||||||||||||||||
| 3121 | APInt Charlie = Cconst->getAPInt(); | ||||||||||||||||||||
| 3122 | APInt CdivB = Charlie.sdiv(Beta); | ||||||||||||||||||||
| 3123 | assert(Charlie.srem(Beta) == 0 && "C should be evenly divisible by B")((void)0); | ||||||||||||||||||||
| 3124 | const SCEV *AP_K = findCoefficient(Dst, CurLoop); | ||||||||||||||||||||
| 3125 | // Src = SE->getAddExpr(Src, SE->getMulExpr(AP_K, SE->getConstant(CdivB))); | ||||||||||||||||||||
| 3126 | Src = SE->getMinusSCEV(Src, SE->getMulExpr(AP_K, SE->getConstant(CdivB))); | ||||||||||||||||||||
| 3127 | Dst = zeroCoefficient(Dst, CurLoop); | ||||||||||||||||||||
| 3128 | if (!findCoefficient(Src, CurLoop)->isZero()) | ||||||||||||||||||||
| 3129 | Consistent = false; | ||||||||||||||||||||
| 3130 | } | ||||||||||||||||||||
| 3131 | else if (B->isZero()) { | ||||||||||||||||||||
| 3132 | const SCEVConstant *Aconst = dyn_cast<SCEVConstant>(A); | ||||||||||||||||||||
| 3133 | const SCEVConstant *Cconst = dyn_cast<SCEVConstant>(C); | ||||||||||||||||||||
| 3134 | if (!Aconst || !Cconst) return false; | ||||||||||||||||||||
| 3135 | APInt Alpha = Aconst->getAPInt(); | ||||||||||||||||||||
| 3136 | APInt Charlie = Cconst->getAPInt(); | ||||||||||||||||||||
| 3137 | APInt CdivA = Charlie.sdiv(Alpha); | ||||||||||||||||||||
| 3138 | assert(Charlie.srem(Alpha) == 0 && "C should be evenly divisible by A")((void)0); | ||||||||||||||||||||
| 3139 | const SCEV *A_K = findCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3140 | Src = SE->getAddExpr(Src, SE->getMulExpr(A_K, SE->getConstant(CdivA))); | ||||||||||||||||||||
| 3141 | Src = zeroCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3142 | if (!findCoefficient(Dst, CurLoop)->isZero()) | ||||||||||||||||||||
| 3143 | Consistent = false; | ||||||||||||||||||||
| 3144 | } | ||||||||||||||||||||
| 3145 | else if (isKnownPredicate(CmpInst::ICMP_EQ, A, B)) { | ||||||||||||||||||||
| 3146 | const SCEVConstant *Aconst = dyn_cast<SCEVConstant>(A); | ||||||||||||||||||||
| 3147 | const SCEVConstant *Cconst = dyn_cast<SCEVConstant>(C); | ||||||||||||||||||||
| 3148 | if (!Aconst || !Cconst) return false; | ||||||||||||||||||||
| 3149 | APInt Alpha = Aconst->getAPInt(); | ||||||||||||||||||||
| 3150 | APInt Charlie = Cconst->getAPInt(); | ||||||||||||||||||||
| 3151 | APInt CdivA = Charlie.sdiv(Alpha); | ||||||||||||||||||||
| 3152 | assert(Charlie.srem(Alpha) == 0 && "C should be evenly divisible by A")((void)0); | ||||||||||||||||||||
| 3153 | const SCEV *A_K = findCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3154 | Src = SE->getAddExpr(Src, SE->getMulExpr(A_K, SE->getConstant(CdivA))); | ||||||||||||||||||||
| 3155 | Src = zeroCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3156 | Dst = addToCoefficient(Dst, CurLoop, A_K); | ||||||||||||||||||||
| 3157 | if (!findCoefficient(Dst, CurLoop)->isZero()) | ||||||||||||||||||||
| 3158 | Consistent = false; | ||||||||||||||||||||
| 3159 | } | ||||||||||||||||||||
| 3160 | else { | ||||||||||||||||||||
| 3161 | // paper is incorrect here, or perhaps just misleading | ||||||||||||||||||||
| 3162 | const SCEV *A_K = findCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3163 | Src = SE->getMulExpr(Src, A); | ||||||||||||||||||||
| 3164 | Dst = SE->getMulExpr(Dst, A); | ||||||||||||||||||||
| 3165 | Src = SE->getAddExpr(Src, SE->getMulExpr(A_K, C)); | ||||||||||||||||||||
| 3166 | Src = zeroCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3167 | Dst = addToCoefficient(Dst, CurLoop, SE->getMulExpr(A_K, B)); | ||||||||||||||||||||
| 3168 | if (!findCoefficient(Dst, CurLoop)->isZero()) | ||||||||||||||||||||
| 3169 | Consistent = false; | ||||||||||||||||||||
| 3170 | } | ||||||||||||||||||||
| 3171 | LLVM_DEBUG(dbgs() << "\t\tnew Src = " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3172 | LLVM_DEBUG(dbgs() << "\t\tnew Dst = " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3173 | return true; | ||||||||||||||||||||
| 3174 | } | ||||||||||||||||||||
| 3175 | |||||||||||||||||||||
| 3176 | |||||||||||||||||||||
| 3177 | // Attempt to propagate a point | ||||||||||||||||||||
| 3178 | // constraint into a subscript pair (Src and Dst). | ||||||||||||||||||||
| 3179 | // Return true if some simplification occurs. | ||||||||||||||||||||
| 3180 | bool DependenceInfo::propagatePoint(const SCEV *&Src, const SCEV *&Dst, | ||||||||||||||||||||
| 3181 | Constraint &CurConstraint) { | ||||||||||||||||||||
| 3182 | const Loop *CurLoop = CurConstraint.getAssociatedLoop(); | ||||||||||||||||||||
| 3183 | const SCEV *A_K = findCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3184 | const SCEV *AP_K = findCoefficient(Dst, CurLoop); | ||||||||||||||||||||
| 3185 | const SCEV *XA_K = SE->getMulExpr(A_K, CurConstraint.getX()); | ||||||||||||||||||||
| 3186 | const SCEV *YAP_K = SE->getMulExpr(AP_K, CurConstraint.getY()); | ||||||||||||||||||||
| 3187 | LLVM_DEBUG(dbgs() << "\t\tSrc is " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3188 | Src = SE->getAddExpr(Src, SE->getMinusSCEV(XA_K, YAP_K)); | ||||||||||||||||||||
| 3189 | Src = zeroCoefficient(Src, CurLoop); | ||||||||||||||||||||
| 3190 | LLVM_DEBUG(dbgs() << "\t\tnew Src is " << *Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3191 | LLVM_DEBUG(dbgs() << "\t\tDst is " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3192 | Dst = zeroCoefficient(Dst, CurLoop); | ||||||||||||||||||||
| 3193 | LLVM_DEBUG(dbgs() << "\t\tnew Dst is " << *Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3194 | return true; | ||||||||||||||||||||
| 3195 | } | ||||||||||||||||||||
| 3196 | |||||||||||||||||||||
| 3197 | |||||||||||||||||||||
| 3198 | // Update direction vector entry based on the current constraint. | ||||||||||||||||||||
| 3199 | void DependenceInfo::updateDirection(Dependence::DVEntry &Level, | ||||||||||||||||||||
| 3200 | const Constraint &CurConstraint) const { | ||||||||||||||||||||
| 3201 | LLVM_DEBUG(dbgs() << "\tUpdate direction, constraint =")do { } while (false); | ||||||||||||||||||||
| 3202 | LLVM_DEBUG(CurConstraint.dump(dbgs()))do { } while (false); | ||||||||||||||||||||
| 3203 | if (CurConstraint.isAny()) | ||||||||||||||||||||
| 3204 | ; // use defaults | ||||||||||||||||||||
| 3205 | else if (CurConstraint.isDistance()) { | ||||||||||||||||||||
| 3206 | // this one is consistent, the others aren't | ||||||||||||||||||||
| 3207 | Level.Scalar = false; | ||||||||||||||||||||
| 3208 | Level.Distance = CurConstraint.getD(); | ||||||||||||||||||||
| 3209 | unsigned NewDirection = Dependence::DVEntry::NONE; | ||||||||||||||||||||
| 3210 | if (!SE->isKnownNonZero(Level.Distance)) // if may be zero | ||||||||||||||||||||
| 3211 | NewDirection = Dependence::DVEntry::EQ; | ||||||||||||||||||||
| 3212 | if (!SE->isKnownNonPositive(Level.Distance)) // if may be positive | ||||||||||||||||||||
| 3213 | NewDirection |= Dependence::DVEntry::LT; | ||||||||||||||||||||
| 3214 | if (!SE->isKnownNonNegative(Level.Distance)) // if may be negative | ||||||||||||||||||||
| 3215 | NewDirection |= Dependence::DVEntry::GT; | ||||||||||||||||||||
| 3216 | Level.Direction &= NewDirection; | ||||||||||||||||||||
| 3217 | } | ||||||||||||||||||||
| 3218 | else if (CurConstraint.isLine()) { | ||||||||||||||||||||
| 3219 | Level.Scalar = false; | ||||||||||||||||||||
| 3220 | Level.Distance = nullptr; | ||||||||||||||||||||
| 3221 | // direction should be accurate | ||||||||||||||||||||
| 3222 | } | ||||||||||||||||||||
| 3223 | else if (CurConstraint.isPoint()) { | ||||||||||||||||||||
| 3224 | Level.Scalar = false; | ||||||||||||||||||||
| 3225 | Level.Distance = nullptr; | ||||||||||||||||||||
| 3226 | unsigned NewDirection = Dependence::DVEntry::NONE; | ||||||||||||||||||||
| 3227 | if (!isKnownPredicate(CmpInst::ICMP_NE, | ||||||||||||||||||||
| 3228 | CurConstraint.getY(), | ||||||||||||||||||||
| 3229 | CurConstraint.getX())) | ||||||||||||||||||||
| 3230 | // if X may be = Y | ||||||||||||||||||||
| 3231 | NewDirection |= Dependence::DVEntry::EQ; | ||||||||||||||||||||
| 3232 | if (!isKnownPredicate(CmpInst::ICMP_SLE, | ||||||||||||||||||||
| 3233 | CurConstraint.getY(), | ||||||||||||||||||||
| 3234 | CurConstraint.getX())) | ||||||||||||||||||||
| 3235 | // if Y may be > X | ||||||||||||||||||||
| 3236 | NewDirection |= Dependence::DVEntry::LT; | ||||||||||||||||||||
| 3237 | if (!isKnownPredicate(CmpInst::ICMP_SGE, | ||||||||||||||||||||
| 3238 | CurConstraint.getY(), | ||||||||||||||||||||
| 3239 | CurConstraint.getX())) | ||||||||||||||||||||
| 3240 | // if Y may be < X | ||||||||||||||||||||
| 3241 | NewDirection |= Dependence::DVEntry::GT; | ||||||||||||||||||||
| 3242 | Level.Direction &= NewDirection; | ||||||||||||||||||||
| 3243 | } | ||||||||||||||||||||
| 3244 | else | ||||||||||||||||||||
| 3245 | llvm_unreachable("constraint has unexpected kind")__builtin_unreachable(); | ||||||||||||||||||||
| 3246 | } | ||||||||||||||||||||
| 3247 | |||||||||||||||||||||
| 3248 | /// Check if we can delinearize the subscripts. If the SCEVs representing the | ||||||||||||||||||||
| 3249 | /// source and destination array references are recurrences on a nested loop, | ||||||||||||||||||||
| 3250 | /// this function flattens the nested recurrences into separate recurrences | ||||||||||||||||||||
| 3251 | /// for each loop level. | ||||||||||||||||||||
| 3252 | bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst, | ||||||||||||||||||||
| 3253 | SmallVectorImpl<Subscript> &Pair) { | ||||||||||||||||||||
| 3254 | assert(isLoadOrStore(Src) && "instruction is not load or store")((void)0); | ||||||||||||||||||||
| 3255 | assert(isLoadOrStore(Dst) && "instruction is not load or store")((void)0); | ||||||||||||||||||||
| 3256 | Value *SrcPtr = getLoadStorePointerOperand(Src); | ||||||||||||||||||||
| 3257 | Value *DstPtr = getLoadStorePointerOperand(Dst); | ||||||||||||||||||||
| 3258 | Loop *SrcLoop = LI->getLoopFor(Src->getParent()); | ||||||||||||||||||||
| 3259 | Loop *DstLoop = LI->getLoopFor(Dst->getParent()); | ||||||||||||||||||||
| 3260 | const SCEV *SrcAccessFn = SE->getSCEVAtScope(SrcPtr, SrcLoop); | ||||||||||||||||||||
| 3261 | const SCEV *DstAccessFn = SE->getSCEVAtScope(DstPtr, DstLoop); | ||||||||||||||||||||
| 3262 | const SCEVUnknown *SrcBase = | ||||||||||||||||||||
| 3263 | dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn)); | ||||||||||||||||||||
| 3264 | const SCEVUnknown *DstBase = | ||||||||||||||||||||
| 3265 | dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn)); | ||||||||||||||||||||
| 3266 | |||||||||||||||||||||
| 3267 | if (!SrcBase || !DstBase || SrcBase != DstBase) | ||||||||||||||||||||
| 3268 | return false; | ||||||||||||||||||||
| 3269 | |||||||||||||||||||||
| 3270 | SmallVector<const SCEV *, 4> SrcSubscripts, DstSubscripts; | ||||||||||||||||||||
| 3271 | |||||||||||||||||||||
| 3272 | if (!tryDelinearizeFixedSize(Src, Dst, SrcAccessFn, DstAccessFn, | ||||||||||||||||||||
| 3273 | SrcSubscripts, DstSubscripts) && | ||||||||||||||||||||
| 3274 | !tryDelinearizeParametricSize(Src, Dst, SrcAccessFn, DstAccessFn, | ||||||||||||||||||||
| 3275 | SrcSubscripts, DstSubscripts)) | ||||||||||||||||||||
| 3276 | return false; | ||||||||||||||||||||
| 3277 | |||||||||||||||||||||
| 3278 | int Size = SrcSubscripts.size(); | ||||||||||||||||||||
| 3279 | LLVM_DEBUG({do { } while (false) | ||||||||||||||||||||
| 3280 | dbgs() << "\nSrcSubscripts: ";do { } while (false) | ||||||||||||||||||||
| 3281 | for (int I = 0; I < Size; I++)do { } while (false) | ||||||||||||||||||||
| 3282 | dbgs() << *SrcSubscripts[I];do { } while (false) | ||||||||||||||||||||
| 3283 | dbgs() << "\nDstSubscripts: ";do { } while (false) | ||||||||||||||||||||
| 3284 | for (int I = 0; I < Size; I++)do { } while (false) | ||||||||||||||||||||
| 3285 | dbgs() << *DstSubscripts[I];do { } while (false) | ||||||||||||||||||||
| 3286 | })do { } while (false); | ||||||||||||||||||||
| 3287 | |||||||||||||||||||||
| 3288 | // The delinearization transforms a single-subscript MIV dependence test into | ||||||||||||||||||||
| 3289 | // a multi-subscript SIV dependence test that is easier to compute. So we | ||||||||||||||||||||
| 3290 | // resize Pair to contain as many pairs of subscripts as the delinearization | ||||||||||||||||||||
| 3291 | // has found, and then initialize the pairs following the delinearization. | ||||||||||||||||||||
| 3292 | Pair.resize(Size); | ||||||||||||||||||||
| 3293 | for (int I = 0; I < Size; ++I) { | ||||||||||||||||||||
| 3294 | Pair[I].Src = SrcSubscripts[I]; | ||||||||||||||||||||
| 3295 | Pair[I].Dst = DstSubscripts[I]; | ||||||||||||||||||||
| 3296 | unifySubscriptType(&Pair[I]); | ||||||||||||||||||||
| 3297 | } | ||||||||||||||||||||
| 3298 | |||||||||||||||||||||
| 3299 | return true; | ||||||||||||||||||||
| 3300 | } | ||||||||||||||||||||
| 3301 | |||||||||||||||||||||
| 3302 | bool DependenceInfo::tryDelinearizeFixedSize( | ||||||||||||||||||||
| 3303 | Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn, | ||||||||||||||||||||
| 3304 | const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts, | ||||||||||||||||||||
| 3305 | SmallVectorImpl<const SCEV *> &DstSubscripts) { | ||||||||||||||||||||
| 3306 | |||||||||||||||||||||
| 3307 | Value *SrcPtr = getLoadStorePointerOperand(Src); | ||||||||||||||||||||
| 3308 | Value *DstPtr = getLoadStorePointerOperand(Dst); | ||||||||||||||||||||
| 3309 | const SCEVUnknown *SrcBase = | ||||||||||||||||||||
| 3310 | dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn)); | ||||||||||||||||||||
| 3311 | const SCEVUnknown *DstBase = | ||||||||||||||||||||
| 3312 | dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn)); | ||||||||||||||||||||
| 3313 | assert(SrcBase && DstBase && SrcBase == DstBase &&((void)0) | ||||||||||||||||||||
| 3314 | "expected src and dst scev unknowns to be equal")((void)0); | ||||||||||||||||||||
| 3315 | |||||||||||||||||||||
| 3316 | // Check the simple case where the array dimensions are fixed size. | ||||||||||||||||||||
| 3317 | auto *SrcGEP = dyn_cast<GetElementPtrInst>(SrcPtr); | ||||||||||||||||||||
| 3318 | auto *DstGEP = dyn_cast<GetElementPtrInst>(DstPtr); | ||||||||||||||||||||
| 3319 | if (!SrcGEP || !DstGEP) | ||||||||||||||||||||
| 3320 | return false; | ||||||||||||||||||||
| 3321 | |||||||||||||||||||||
| 3322 | SmallVector<int, 4> SrcSizes, DstSizes; | ||||||||||||||||||||
| 3323 | SE->getIndexExpressionsFromGEP(SrcGEP, SrcSubscripts, SrcSizes); | ||||||||||||||||||||
| 3324 | SE->getIndexExpressionsFromGEP(DstGEP, DstSubscripts, DstSizes); | ||||||||||||||||||||
| 3325 | |||||||||||||||||||||
| 3326 | // Check that the two size arrays are non-empty and equal in length and | ||||||||||||||||||||
| 3327 | // value. | ||||||||||||||||||||
| 3328 | if (SrcSizes.empty() || SrcSubscripts.size() <= 1 || | ||||||||||||||||||||
| 3329 | SrcSizes.size() != DstSizes.size() || | ||||||||||||||||||||
| 3330 | !std::equal(SrcSizes.begin(), SrcSizes.end(), DstSizes.begin())) { | ||||||||||||||||||||
| 3331 | SrcSubscripts.clear(); | ||||||||||||||||||||
| 3332 | DstSubscripts.clear(); | ||||||||||||||||||||
| 3333 | return false; | ||||||||||||||||||||
| 3334 | } | ||||||||||||||||||||
| 3335 | |||||||||||||||||||||
| 3336 | Value *SrcBasePtr = SrcGEP->getOperand(0); | ||||||||||||||||||||
| 3337 | Value *DstBasePtr = DstGEP->getOperand(0); | ||||||||||||||||||||
| 3338 | while (auto *PCast = dyn_cast<BitCastInst>(SrcBasePtr)) | ||||||||||||||||||||
| 3339 | SrcBasePtr = PCast->getOperand(0); | ||||||||||||||||||||
| 3340 | while (auto *PCast = dyn_cast<BitCastInst>(DstBasePtr)) | ||||||||||||||||||||
| 3341 | DstBasePtr = PCast->getOperand(0); | ||||||||||||||||||||
| 3342 | |||||||||||||||||||||
| 3343 | // Check that for identical base pointers we do not miss index offsets | ||||||||||||||||||||
| 3344 | // that have been added before this GEP is applied. | ||||||||||||||||||||
| 3345 | if (SrcBasePtr != SrcBase->getValue() || DstBasePtr != DstBase->getValue()) { | ||||||||||||||||||||
| 3346 | SrcSubscripts.clear(); | ||||||||||||||||||||
| 3347 | DstSubscripts.clear(); | ||||||||||||||||||||
| 3348 | return false; | ||||||||||||||||||||
| 3349 | } | ||||||||||||||||||||
| 3350 | |||||||||||||||||||||
| 3351 | assert(SrcSubscripts.size() == DstSubscripts.size() &&((void)0) | ||||||||||||||||||||
| 3352 | SrcSubscripts.size() == SrcSizes.size() + 1 &&((void)0) | ||||||||||||||||||||
| 3353 | "Expected equal number of entries in the list of sizes and "((void)0) | ||||||||||||||||||||
| 3354 | "subscripts.")((void)0); | ||||||||||||||||||||
| 3355 | |||||||||||||||||||||
| 3356 | // In general we cannot safely assume that the subscripts recovered from GEPs | ||||||||||||||||||||
| 3357 | // are in the range of values defined for their corresponding array | ||||||||||||||||||||
| 3358 | // dimensions. For example some C language usage/interpretation make it | ||||||||||||||||||||
| 3359 | // impossible to verify this at compile-time. As such we can only delinearize | ||||||||||||||||||||
| 3360 | // iff the subscripts are positive and are less than the range of the | ||||||||||||||||||||
| 3361 | // dimension. | ||||||||||||||||||||
| 3362 | if (!DisableDelinearizationChecks) { | ||||||||||||||||||||
| 3363 | auto AllIndiciesInRange = [&](SmallVector<int, 4> &DimensionSizes, | ||||||||||||||||||||
| 3364 | SmallVectorImpl<const SCEV *> &Subscripts, | ||||||||||||||||||||
| 3365 | Value *Ptr) { | ||||||||||||||||||||
| 3366 | size_t SSize = Subscripts.size(); | ||||||||||||||||||||
| 3367 | for (size_t I = 1; I < SSize; ++I) { | ||||||||||||||||||||
| 3368 | const SCEV *S = Subscripts[I]; | ||||||||||||||||||||
| 3369 | if (!isKnownNonNegative(S, Ptr)) | ||||||||||||||||||||
| 3370 | return false; | ||||||||||||||||||||
| 3371 | if (auto *SType = dyn_cast<IntegerType>(S->getType())) { | ||||||||||||||||||||
| 3372 | const SCEV *Range = SE->getConstant( | ||||||||||||||||||||
| 3373 | ConstantInt::get(SType, DimensionSizes[I - 1], false)); | ||||||||||||||||||||
| 3374 | if (!isKnownLessThan(S, Range)) | ||||||||||||||||||||
| 3375 | return false; | ||||||||||||||||||||
| 3376 | } | ||||||||||||||||||||
| 3377 | } | ||||||||||||||||||||
| 3378 | return true; | ||||||||||||||||||||
| 3379 | }; | ||||||||||||||||||||
| 3380 | |||||||||||||||||||||
| 3381 | if (!AllIndiciesInRange(SrcSizes, SrcSubscripts, SrcPtr) || | ||||||||||||||||||||
| 3382 | !AllIndiciesInRange(DstSizes, DstSubscripts, DstPtr)) { | ||||||||||||||||||||
| 3383 | SrcSubscripts.clear(); | ||||||||||||||||||||
| 3384 | DstSubscripts.clear(); | ||||||||||||||||||||
| 3385 | return false; | ||||||||||||||||||||
| 3386 | } | ||||||||||||||||||||
| 3387 | } | ||||||||||||||||||||
| 3388 | LLVM_DEBUG({do { } while (false) | ||||||||||||||||||||
| 3389 | dbgs() << "Delinearized subscripts of fixed-size array\n"do { } while (false) | ||||||||||||||||||||
| 3390 | << "SrcGEP:" << *SrcGEP << "\n"do { } while (false) | ||||||||||||||||||||
| 3391 | << "DstGEP:" << *DstGEP << "\n";do { } while (false) | ||||||||||||||||||||
| 3392 | })do { } while (false); | ||||||||||||||||||||
| 3393 | return true; | ||||||||||||||||||||
| 3394 | } | ||||||||||||||||||||
| 3395 | |||||||||||||||||||||
| 3396 | bool DependenceInfo::tryDelinearizeParametricSize( | ||||||||||||||||||||
| 3397 | Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn, | ||||||||||||||||||||
| 3398 | const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts, | ||||||||||||||||||||
| 3399 | SmallVectorImpl<const SCEV *> &DstSubscripts) { | ||||||||||||||||||||
| 3400 | |||||||||||||||||||||
| 3401 | Value *SrcPtr = getLoadStorePointerOperand(Src); | ||||||||||||||||||||
| 3402 | Value *DstPtr = getLoadStorePointerOperand(Dst); | ||||||||||||||||||||
| 3403 | const SCEVUnknown *SrcBase = | ||||||||||||||||||||
| 3404 | dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn)); | ||||||||||||||||||||
| 3405 | const SCEVUnknown *DstBase = | ||||||||||||||||||||
| 3406 | dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn)); | ||||||||||||||||||||
| 3407 | assert(SrcBase && DstBase && SrcBase == DstBase &&((void)0) | ||||||||||||||||||||
| 3408 | "expected src and dst scev unknowns to be equal")((void)0); | ||||||||||||||||||||
| 3409 | |||||||||||||||||||||
| 3410 | const SCEV *ElementSize = SE->getElementSize(Src); | ||||||||||||||||||||
| 3411 | if (ElementSize != SE->getElementSize(Dst)) | ||||||||||||||||||||
| 3412 | return false; | ||||||||||||||||||||
| 3413 | |||||||||||||||||||||
| 3414 | const SCEV *SrcSCEV = SE->getMinusSCEV(SrcAccessFn, SrcBase); | ||||||||||||||||||||
| 3415 | const SCEV *DstSCEV = SE->getMinusSCEV(DstAccessFn, DstBase); | ||||||||||||||||||||
| 3416 | |||||||||||||||||||||
| 3417 | const SCEVAddRecExpr *SrcAR = dyn_cast<SCEVAddRecExpr>(SrcSCEV); | ||||||||||||||||||||
| 3418 | const SCEVAddRecExpr *DstAR = dyn_cast<SCEVAddRecExpr>(DstSCEV); | ||||||||||||||||||||
| 3419 | if (!SrcAR || !DstAR || !SrcAR->isAffine() || !DstAR->isAffine()) | ||||||||||||||||||||
| 3420 | return false; | ||||||||||||||||||||
| 3421 | |||||||||||||||||||||
| 3422 | // First step: collect parametric terms in both array references. | ||||||||||||||||||||
| 3423 | SmallVector<const SCEV *, 4> Terms; | ||||||||||||||||||||
| 3424 | SE->collectParametricTerms(SrcAR, Terms); | ||||||||||||||||||||
| 3425 | SE->collectParametricTerms(DstAR, Terms); | ||||||||||||||||||||
| 3426 | |||||||||||||||||||||
| 3427 | // Second step: find subscript sizes. | ||||||||||||||||||||
| 3428 | SmallVector<const SCEV *, 4> Sizes; | ||||||||||||||||||||
| 3429 | SE->findArrayDimensions(Terms, Sizes, ElementSize); | ||||||||||||||||||||
| 3430 | |||||||||||||||||||||
| 3431 | // Third step: compute the access functions for each subscript. | ||||||||||||||||||||
| 3432 | SE->computeAccessFunctions(SrcAR, SrcSubscripts, Sizes); | ||||||||||||||||||||
| 3433 | SE->computeAccessFunctions(DstAR, DstSubscripts, Sizes); | ||||||||||||||||||||
| 3434 | |||||||||||||||||||||
| 3435 | // Fail when there is only a subscript: that's a linearized access function. | ||||||||||||||||||||
| 3436 | if (SrcSubscripts.size() < 2 || DstSubscripts.size() < 2 || | ||||||||||||||||||||
| 3437 | SrcSubscripts.size() != DstSubscripts.size()) | ||||||||||||||||||||
| 3438 | return false; | ||||||||||||||||||||
| 3439 | |||||||||||||||||||||
| 3440 | size_t Size = SrcSubscripts.size(); | ||||||||||||||||||||
| 3441 | |||||||||||||||||||||
| 3442 | // Statically check that the array bounds are in-range. The first subscript we | ||||||||||||||||||||
| 3443 | // don't have a size for and it cannot overflow into another subscript, so is | ||||||||||||||||||||
| 3444 | // always safe. The others need to be 0 <= subscript[i] < bound, for both src | ||||||||||||||||||||
| 3445 | // and dst. | ||||||||||||||||||||
| 3446 | // FIXME: It may be better to record these sizes and add them as constraints | ||||||||||||||||||||
| 3447 | // to the dependency checks. | ||||||||||||||||||||
| 3448 | if (!DisableDelinearizationChecks) | ||||||||||||||||||||
| 3449 | for (size_t I = 1; I < Size; ++I) { | ||||||||||||||||||||
| 3450 | if (!isKnownNonNegative(SrcSubscripts[I], SrcPtr)) | ||||||||||||||||||||
| 3451 | return false; | ||||||||||||||||||||
| 3452 | |||||||||||||||||||||
| 3453 | if (!isKnownLessThan(SrcSubscripts[I], Sizes[I - 1])) | ||||||||||||||||||||
| 3454 | return false; | ||||||||||||||||||||
| 3455 | |||||||||||||||||||||
| 3456 | if (!isKnownNonNegative(DstSubscripts[I], DstPtr)) | ||||||||||||||||||||
| 3457 | return false; | ||||||||||||||||||||
| 3458 | |||||||||||||||||||||
| 3459 | if (!isKnownLessThan(DstSubscripts[I], Sizes[I - 1])) | ||||||||||||||||||||
| 3460 | return false; | ||||||||||||||||||||
| 3461 | } | ||||||||||||||||||||
| 3462 | |||||||||||||||||||||
| 3463 | return true; | ||||||||||||||||||||
| 3464 | } | ||||||||||||||||||||
| 3465 | |||||||||||||||||||||
| 3466 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 3467 | |||||||||||||||||||||
| 3468 | #ifndef NDEBUG1 | ||||||||||||||||||||
| 3469 | // For debugging purposes, dump a small bit vector to dbgs(). | ||||||||||||||||||||
| 3470 | static void dumpSmallBitVector(SmallBitVector &BV) { | ||||||||||||||||||||
| 3471 | dbgs() << "{"; | ||||||||||||||||||||
| 3472 | for (unsigned VI : BV.set_bits()) { | ||||||||||||||||||||
| 3473 | dbgs() << VI; | ||||||||||||||||||||
| 3474 | if (BV.find_next(VI) >= 0) | ||||||||||||||||||||
| 3475 | dbgs() << ' '; | ||||||||||||||||||||
| 3476 | } | ||||||||||||||||||||
| 3477 | dbgs() << "}\n"; | ||||||||||||||||||||
| 3478 | } | ||||||||||||||||||||
| 3479 | #endif | ||||||||||||||||||||
| 3480 | |||||||||||||||||||||
| 3481 | bool DependenceInfo::invalidate(Function &F, const PreservedAnalyses &PA, | ||||||||||||||||||||
| 3482 | FunctionAnalysisManager::Invalidator &Inv) { | ||||||||||||||||||||
| 3483 | // Check if the analysis itself has been invalidated. | ||||||||||||||||||||
| 3484 | auto PAC = PA.getChecker<DependenceAnalysis>(); | ||||||||||||||||||||
| 3485 | if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>()) | ||||||||||||||||||||
| 3486 | return true; | ||||||||||||||||||||
| 3487 | |||||||||||||||||||||
| 3488 | // Check transitive dependencies. | ||||||||||||||||||||
| 3489 | return Inv.invalidate<AAManager>(F, PA) || | ||||||||||||||||||||
| 3490 | Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) || | ||||||||||||||||||||
| 3491 | Inv.invalidate<LoopAnalysis>(F, PA); | ||||||||||||||||||||
| 3492 | } | ||||||||||||||||||||
| 3493 | |||||||||||||||||||||
| 3494 | // depends - | ||||||||||||||||||||
| 3495 | // Returns NULL if there is no dependence. | ||||||||||||||||||||
| 3496 | // Otherwise, return a Dependence with as many details as possible. | ||||||||||||||||||||
| 3497 | // Corresponds to Section 3.1 in the paper | ||||||||||||||||||||
| 3498 | // | ||||||||||||||||||||
| 3499 | // Practical Dependence Testing | ||||||||||||||||||||
| 3500 | // Goff, Kennedy, Tseng | ||||||||||||||||||||
| 3501 | // PLDI 1991 | ||||||||||||||||||||
| 3502 | // | ||||||||||||||||||||
| 3503 | // Care is required to keep the routine below, getSplitIteration(), | ||||||||||||||||||||
| 3504 | // up to date with respect to this routine. | ||||||||||||||||||||
| 3505 | std::unique_ptr<Dependence> | ||||||||||||||||||||
| 3506 | DependenceInfo::depends(Instruction *Src, Instruction *Dst, | ||||||||||||||||||||
| 3507 | bool PossiblyLoopIndependent) { | ||||||||||||||||||||
| 3508 | if (Src == Dst) | ||||||||||||||||||||
| |||||||||||||||||||||
| 3509 | PossiblyLoopIndependent = false; | ||||||||||||||||||||
| 3510 | |||||||||||||||||||||
| 3511 | if (!(Src->mayReadOrWriteMemory() && Dst->mayReadOrWriteMemory())) | ||||||||||||||||||||
| 3512 | // if both instructions don't reference memory, there's no dependence | ||||||||||||||||||||
| 3513 | return nullptr; | ||||||||||||||||||||
| 3514 | |||||||||||||||||||||
| 3515 | if (!isLoadOrStore(Src) || !isLoadOrStore(Dst)) { | ||||||||||||||||||||
| 3516 | // can only analyze simple loads and stores, i.e., no calls, invokes, etc. | ||||||||||||||||||||
| 3517 | LLVM_DEBUG(dbgs() << "can only handle simple loads and stores\n")do { } while (false); | ||||||||||||||||||||
| 3518 | return std::make_unique<Dependence>(Src, Dst); | ||||||||||||||||||||
| 3519 | } | ||||||||||||||||||||
| 3520 | |||||||||||||||||||||
| 3521 | assert(isLoadOrStore(Src) && "instruction is not load or store")((void)0); | ||||||||||||||||||||
| 3522 | assert(isLoadOrStore(Dst) && "instruction is not load or store")((void)0); | ||||||||||||||||||||
| 3523 | Value *SrcPtr = getLoadStorePointerOperand(Src); | ||||||||||||||||||||
| 3524 | Value *DstPtr = getLoadStorePointerOperand(Dst); | ||||||||||||||||||||
| 3525 | |||||||||||||||||||||
| 3526 | switch (underlyingObjectsAlias(AA, F->getParent()->getDataLayout(), | ||||||||||||||||||||
| 3527 | MemoryLocation::get(Dst), | ||||||||||||||||||||
| 3528 | MemoryLocation::get(Src))) { | ||||||||||||||||||||
| 3529 | case AliasResult::MayAlias: | ||||||||||||||||||||
| 3530 | case AliasResult::PartialAlias: | ||||||||||||||||||||
| 3531 | // cannot analyse objects if we don't understand their aliasing. | ||||||||||||||||||||
| 3532 | LLVM_DEBUG(dbgs() << "can't analyze may or partial alias\n")do { } while (false); | ||||||||||||||||||||
| 3533 | return std::make_unique<Dependence>(Src, Dst); | ||||||||||||||||||||
| 3534 | case AliasResult::NoAlias: | ||||||||||||||||||||
| 3535 | // If the objects noalias, they are distinct, accesses are independent. | ||||||||||||||||||||
| 3536 | LLVM_DEBUG(dbgs() << "no alias\n")do { } while (false); | ||||||||||||||||||||
| 3537 | return nullptr; | ||||||||||||||||||||
| 3538 | case AliasResult::MustAlias: | ||||||||||||||||||||
| 3539 | break; // The underlying objects alias; test accesses for dependence. | ||||||||||||||||||||
| 3540 | } | ||||||||||||||||||||
| 3541 | |||||||||||||||||||||
| 3542 | // establish loop nesting levels | ||||||||||||||||||||
| 3543 | establishNestingLevels(Src, Dst); | ||||||||||||||||||||
| 3544 | LLVM_DEBUG(dbgs() << " common nesting levels = " << CommonLevels << "\n")do { } while (false); | ||||||||||||||||||||
| 3545 | LLVM_DEBUG(dbgs() << " maximum nesting levels = " << MaxLevels << "\n")do { } while (false); | ||||||||||||||||||||
| 3546 | |||||||||||||||||||||
| 3547 | FullDependence Result(Src, Dst, PossiblyLoopIndependent, CommonLevels); | ||||||||||||||||||||
| 3548 | ++TotalArrayPairs; | ||||||||||||||||||||
| 3549 | |||||||||||||||||||||
| 3550 | unsigned Pairs = 1; | ||||||||||||||||||||
| 3551 | SmallVector<Subscript, 2> Pair(Pairs); | ||||||||||||||||||||
| 3552 | const SCEV *SrcSCEV = SE->getSCEV(SrcPtr); | ||||||||||||||||||||
| 3553 | const SCEV *DstSCEV = SE->getSCEV(DstPtr); | ||||||||||||||||||||
| 3554 | LLVM_DEBUG(dbgs() << " SrcSCEV = " << *SrcSCEV << "\n")do { } while (false); | ||||||||||||||||||||
| 3555 | LLVM_DEBUG(dbgs() << " DstSCEV = " << *DstSCEV << "\n")do { } while (false); | ||||||||||||||||||||
| 3556 | if (SE->getPointerBase(SrcSCEV) != SE->getPointerBase(DstSCEV)) { | ||||||||||||||||||||
| 3557 | // If two pointers have different bases, trying to analyze indexes won't | ||||||||||||||||||||
| 3558 | // work; we can't compare them to each other. This can happen, for example, | ||||||||||||||||||||
| 3559 | // if one is produced by an LCSSA PHI node. | ||||||||||||||||||||
| 3560 | // | ||||||||||||||||||||
| 3561 | // We check this upfront so we don't crash in cases where getMinusSCEV() | ||||||||||||||||||||
| 3562 | // returns a SCEVCouldNotCompute. | ||||||||||||||||||||
| 3563 | LLVM_DEBUG(dbgs() << "can't analyze SCEV with different pointer base\n")do { } while (false); | ||||||||||||||||||||
| 3564 | return std::make_unique<Dependence>(Src, Dst); | ||||||||||||||||||||
| 3565 | } | ||||||||||||||||||||
| 3566 | Pair[0].Src = SrcSCEV; | ||||||||||||||||||||
| 3567 | Pair[0].Dst = DstSCEV; | ||||||||||||||||||||
| 3568 | |||||||||||||||||||||
| 3569 | if (Delinearize) { | ||||||||||||||||||||
| 3570 | if (tryDelinearize(Src, Dst, Pair)) { | ||||||||||||||||||||
| 3571 | LLVM_DEBUG(dbgs() << " delinearized\n")do { } while (false); | ||||||||||||||||||||
| 3572 | Pairs = Pair.size(); | ||||||||||||||||||||
| 3573 | } | ||||||||||||||||||||
| 3574 | } | ||||||||||||||||||||
| 3575 | |||||||||||||||||||||
| 3576 | for (unsigned P = 0; P < Pairs; ++P) { | ||||||||||||||||||||
| 3577 | Pair[P].Loops.resize(MaxLevels + 1); | ||||||||||||||||||||
| 3578 | Pair[P].GroupLoops.resize(MaxLevels + 1); | ||||||||||||||||||||
| 3579 | Pair[P].Group.resize(Pairs); | ||||||||||||||||||||
| 3580 | removeMatchingExtensions(&Pair[P]); | ||||||||||||||||||||
| 3581 | Pair[P].Classification = | ||||||||||||||||||||
| 3582 | classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()), | ||||||||||||||||||||
| 3583 | Pair[P].Dst, LI->getLoopFor(Dst->getParent()), | ||||||||||||||||||||
| 3584 | Pair[P].Loops); | ||||||||||||||||||||
| 3585 | Pair[P].GroupLoops = Pair[P].Loops; | ||||||||||||||||||||
| 3586 | Pair[P].Group.set(P); | ||||||||||||||||||||
| 3587 | LLVM_DEBUG(dbgs() << " subscript " << P << "\n")do { } while (false); | ||||||||||||||||||||
| 3588 | LLVM_DEBUG(dbgs() << "\tsrc = " << *Pair[P].Src << "\n")do { } while (false); | ||||||||||||||||||||
| 3589 | LLVM_DEBUG(dbgs() << "\tdst = " << *Pair[P].Dst << "\n")do { } while (false); | ||||||||||||||||||||
| 3590 | LLVM_DEBUG(dbgs() << "\tclass = " << Pair[P].Classification << "\n")do { } while (false); | ||||||||||||||||||||
| 3591 | LLVM_DEBUG(dbgs() << "\tloops = ")do { } while (false); | ||||||||||||||||||||
| 3592 | LLVM_DEBUG(dumpSmallBitVector(Pair[P].Loops))do { } while (false); | ||||||||||||||||||||
| 3593 | } | ||||||||||||||||||||
| 3594 | |||||||||||||||||||||
| 3595 | SmallBitVector Separable(Pairs); | ||||||||||||||||||||
| 3596 | SmallBitVector Coupled(Pairs); | ||||||||||||||||||||
| 3597 | |||||||||||||||||||||
| 3598 | // Partition subscripts into separable and minimally-coupled groups | ||||||||||||||||||||
| 3599 | // Algorithm in paper is algorithmically better; | ||||||||||||||||||||
| 3600 | // this may be faster in practice. Check someday. | ||||||||||||||||||||
| 3601 | // | ||||||||||||||||||||
| 3602 | // Here's an example of how it works. Consider this code: | ||||||||||||||||||||
| 3603 | // | ||||||||||||||||||||
| 3604 | // for (i = ...) { | ||||||||||||||||||||
| 3605 | // for (j = ...) { | ||||||||||||||||||||
| 3606 | // for (k = ...) { | ||||||||||||||||||||
| 3607 | // for (l = ...) { | ||||||||||||||||||||
| 3608 | // for (m = ...) { | ||||||||||||||||||||
| 3609 | // A[i][j][k][m] = ...; | ||||||||||||||||||||
| 3610 | // ... = A[0][j][l][i + j]; | ||||||||||||||||||||
| 3611 | // } | ||||||||||||||||||||
| 3612 | // } | ||||||||||||||||||||
| 3613 | // } | ||||||||||||||||||||
| 3614 | // } | ||||||||||||||||||||
| 3615 | // } | ||||||||||||||||||||
| 3616 | // | ||||||||||||||||||||
| 3617 | // There are 4 subscripts here: | ||||||||||||||||||||
| 3618 | // 0 [i] and [0] | ||||||||||||||||||||
| 3619 | // 1 [j] and [j] | ||||||||||||||||||||
| 3620 | // 2 [k] and [l] | ||||||||||||||||||||
| 3621 | // 3 [m] and [i + j] | ||||||||||||||||||||
| 3622 | // | ||||||||||||||||||||
| 3623 | // We've already classified each subscript pair as ZIV, SIV, etc., | ||||||||||||||||||||
| 3624 | // and collected all the loops mentioned by pair P in Pair[P].Loops. | ||||||||||||||||||||
| 3625 | // In addition, we've initialized Pair[P].GroupLoops to Pair[P].Loops | ||||||||||||||||||||
| 3626 | // and set Pair[P].Group = {P}. | ||||||||||||||||||||
| 3627 | // | ||||||||||||||||||||
| 3628 | // Src Dst Classification Loops GroupLoops Group | ||||||||||||||||||||
| 3629 | // 0 [i] [0] SIV {1} {1} {0} | ||||||||||||||||||||
| 3630 | // 1 [j] [j] SIV {2} {2} {1} | ||||||||||||||||||||
| 3631 | // 2 [k] [l] RDIV {3,4} {3,4} {2} | ||||||||||||||||||||
| 3632 | // 3 [m] [i + j] MIV {1,2,5} {1,2,5} {3} | ||||||||||||||||||||
| 3633 | // | ||||||||||||||||||||
| 3634 | // For each subscript SI 0 .. 3, we consider each remaining subscript, SJ. | ||||||||||||||||||||
| 3635 | // So, 0 is compared against 1, 2, and 3; 1 is compared against 2 and 3, etc. | ||||||||||||||||||||
| 3636 | // | ||||||||||||||||||||
| 3637 | // We begin by comparing 0 and 1. The intersection of the GroupLoops is empty. | ||||||||||||||||||||
| 3638 | // Next, 0 and 2. Again, the intersection of their GroupLoops is empty. | ||||||||||||||||||||
| 3639 | // Next 0 and 3. The intersection of their GroupLoop = {1}, not empty, | ||||||||||||||||||||
| 3640 | // so Pair[3].Group = {0,3} and Done = false (that is, 0 will not be added | ||||||||||||||||||||
| 3641 | // to either Separable or Coupled). | ||||||||||||||||||||
| 3642 | // | ||||||||||||||||||||
| 3643 | // Next, we consider 1 and 2. The intersection of the GroupLoops is empty. | ||||||||||||||||||||
| 3644 | // Next, 1 and 3. The intersection of their GroupLoops = {2}, not empty, | ||||||||||||||||||||
| 3645 | // so Pair[3].Group = {0, 1, 3} and Done = false. | ||||||||||||||||||||
| 3646 | // | ||||||||||||||||||||
| 3647 | // Next, we compare 2 against 3. The intersection of the GroupLoops is empty. | ||||||||||||||||||||
| 3648 | // Since Done remains true, we add 2 to the set of Separable pairs. | ||||||||||||||||||||
| 3649 | // | ||||||||||||||||||||
| 3650 | // Finally, we consider 3. There's nothing to compare it with, | ||||||||||||||||||||
| 3651 | // so Done remains true and we add it to the Coupled set. | ||||||||||||||||||||
| 3652 | // Pair[3].Group = {0, 1, 3} and GroupLoops = {1, 2, 5}. | ||||||||||||||||||||
| 3653 | // | ||||||||||||||||||||
| 3654 | // In the end, we've got 1 separable subscript and 1 coupled group. | ||||||||||||||||||||
| 3655 | for (unsigned SI = 0; SI < Pairs; ++SI) { | ||||||||||||||||||||
| 3656 | if (Pair[SI].Classification == Subscript::NonLinear) { | ||||||||||||||||||||
| 3657 | // ignore these, but collect loops for later | ||||||||||||||||||||
| 3658 | ++NonlinearSubscriptPairs; | ||||||||||||||||||||
| 3659 | collectCommonLoops(Pair[SI].Src, | ||||||||||||||||||||
| 3660 | LI->getLoopFor(Src->getParent()), | ||||||||||||||||||||
| 3661 | Pair[SI].Loops); | ||||||||||||||||||||
| 3662 | collectCommonLoops(Pair[SI].Dst, | ||||||||||||||||||||
| 3663 | LI->getLoopFor(Dst->getParent()), | ||||||||||||||||||||
| 3664 | Pair[SI].Loops); | ||||||||||||||||||||
| 3665 | Result.Consistent = false; | ||||||||||||||||||||
| 3666 | } else if (Pair[SI].Classification == Subscript::ZIV) { | ||||||||||||||||||||
| 3667 | // always separable | ||||||||||||||||||||
| 3668 | Separable.set(SI); | ||||||||||||||||||||
| 3669 | } | ||||||||||||||||||||
| 3670 | else { | ||||||||||||||||||||
| 3671 | // SIV, RDIV, or MIV, so check for coupled group | ||||||||||||||||||||
| 3672 | bool Done = true; | ||||||||||||||||||||
| 3673 | for (unsigned SJ = SI + 1; SJ < Pairs; ++SJ) { | ||||||||||||||||||||
| 3674 | SmallBitVector Intersection = Pair[SI].GroupLoops; | ||||||||||||||||||||
| 3675 | Intersection &= Pair[SJ].GroupLoops; | ||||||||||||||||||||
| 3676 | if (Intersection.any()) { | ||||||||||||||||||||
| 3677 | // accumulate set of all the loops in group | ||||||||||||||||||||
| 3678 | Pair[SJ].GroupLoops |= Pair[SI].GroupLoops; | ||||||||||||||||||||
| 3679 | // accumulate set of all subscripts in group | ||||||||||||||||||||
| 3680 | Pair[SJ].Group |= Pair[SI].Group; | ||||||||||||||||||||
| 3681 | Done = false; | ||||||||||||||||||||
| 3682 | } | ||||||||||||||||||||
| 3683 | } | ||||||||||||||||||||
| 3684 | if (Done
| ||||||||||||||||||||
| 3685 | if (Pair[SI].Group.count() == 1) { | ||||||||||||||||||||
| 3686 | Separable.set(SI); | ||||||||||||||||||||
| 3687 | ++SeparableSubscriptPairs; | ||||||||||||||||||||
| 3688 | } | ||||||||||||||||||||
| 3689 | else { | ||||||||||||||||||||
| 3690 | Coupled.set(SI); | ||||||||||||||||||||
| 3691 | ++CoupledSubscriptPairs; | ||||||||||||||||||||
| 3692 | } | ||||||||||||||||||||
| 3693 | } | ||||||||||||||||||||
| 3694 | } | ||||||||||||||||||||
| 3695 | } | ||||||||||||||||||||
| 3696 | |||||||||||||||||||||
| 3697 | LLVM_DEBUG(dbgs() << " Separable = ")do { } while (false); | ||||||||||||||||||||
| 3698 | LLVM_DEBUG(dumpSmallBitVector(Separable))do { } while (false); | ||||||||||||||||||||
| 3699 | LLVM_DEBUG(dbgs() << " Coupled = ")do { } while (false); | ||||||||||||||||||||
| 3700 | LLVM_DEBUG(dumpSmallBitVector(Coupled))do { } while (false); | ||||||||||||||||||||
| 3701 | |||||||||||||||||||||
| 3702 | Constraint NewConstraint; | ||||||||||||||||||||
| 3703 | NewConstraint.setAny(SE); | ||||||||||||||||||||
| 3704 | |||||||||||||||||||||
| 3705 | // test separable subscripts | ||||||||||||||||||||
| 3706 | for (unsigned SI : Separable.set_bits()) { | ||||||||||||||||||||
| 3707 | LLVM_DEBUG(dbgs() << "testing subscript " << SI)do { } while (false); | ||||||||||||||||||||
| 3708 | switch (Pair[SI].Classification) { | ||||||||||||||||||||
| 3709 | case Subscript::ZIV: | ||||||||||||||||||||
| 3710 | LLVM_DEBUG(dbgs() << ", ZIV\n")do { } while (false); | ||||||||||||||||||||
| 3711 | if (testZIV(Pair[SI].Src, Pair[SI].Dst, Result)) | ||||||||||||||||||||
| 3712 | return nullptr; | ||||||||||||||||||||
| 3713 | break; | ||||||||||||||||||||
| 3714 | case Subscript::SIV: { | ||||||||||||||||||||
| 3715 | LLVM_DEBUG(dbgs() << ", SIV\n")do { } while (false); | ||||||||||||||||||||
| 3716 | unsigned Level; | ||||||||||||||||||||
| 3717 | const SCEV *SplitIter = nullptr; | ||||||||||||||||||||
| 3718 | if (testSIV(Pair[SI].Src, Pair[SI].Dst, Level, Result, NewConstraint, | ||||||||||||||||||||
| 3719 | SplitIter)) | ||||||||||||||||||||
| 3720 | return nullptr; | ||||||||||||||||||||
| 3721 | break; | ||||||||||||||||||||
| 3722 | } | ||||||||||||||||||||
| 3723 | case Subscript::RDIV: | ||||||||||||||||||||
| 3724 | LLVM_DEBUG(dbgs() << ", RDIV\n")do { } while (false); | ||||||||||||||||||||
| 3725 | if (testRDIV(Pair[SI].Src, Pair[SI].Dst, Result)) | ||||||||||||||||||||
| 3726 | return nullptr; | ||||||||||||||||||||
| 3727 | break; | ||||||||||||||||||||
| 3728 | case Subscript::MIV: | ||||||||||||||||||||
| 3729 | LLVM_DEBUG(dbgs() << ", MIV\n")do { } while (false); | ||||||||||||||||||||
| 3730 | if (testMIV(Pair[SI].Src, Pair[SI].Dst, Pair[SI].Loops, Result)) | ||||||||||||||||||||
| 3731 | return nullptr; | ||||||||||||||||||||
| 3732 | break; | ||||||||||||||||||||
| 3733 | default: | ||||||||||||||||||||
| 3734 | llvm_unreachable("subscript has unexpected classification")__builtin_unreachable(); | ||||||||||||||||||||
| 3735 | } | ||||||||||||||||||||
| 3736 | } | ||||||||||||||||||||
| 3737 | |||||||||||||||||||||
| 3738 | if (Coupled.count()) { | ||||||||||||||||||||
| 3739 | // test coupled subscript groups | ||||||||||||||||||||
| 3740 | LLVM_DEBUG(dbgs() << "starting on coupled subscripts\n")do { } while (false); | ||||||||||||||||||||
| 3741 | LLVM_DEBUG(dbgs() << "MaxLevels + 1 = " << MaxLevels + 1 << "\n")do { } while (false); | ||||||||||||||||||||
| 3742 | SmallVector<Constraint, 4> Constraints(MaxLevels + 1); | ||||||||||||||||||||
| 3743 | for (unsigned II = 0; II
| ||||||||||||||||||||
| 3744 | Constraints[II].setAny(SE); | ||||||||||||||||||||
| 3745 | for (unsigned SI : Coupled.set_bits()) { | ||||||||||||||||||||
| 3746 | LLVM_DEBUG(dbgs() << "testing subscript group " << SI << " { ")do { } while (false); | ||||||||||||||||||||
| 3747 | SmallBitVector Group(Pair[SI].Group); | ||||||||||||||||||||
| 3748 | SmallBitVector Sivs(Pairs); | ||||||||||||||||||||
| 3749 | SmallBitVector Mivs(Pairs); | ||||||||||||||||||||
| 3750 | SmallBitVector ConstrainedLevels(MaxLevels + 1); | ||||||||||||||||||||
| 3751 | SmallVector<Subscript *, 4> PairsInGroup; | ||||||||||||||||||||
| 3752 | for (unsigned SJ : Group.set_bits()) { | ||||||||||||||||||||
| 3753 | LLVM_DEBUG(dbgs() << SJ << " ")do { } while (false); | ||||||||||||||||||||
| 3754 | if (Pair[SJ].Classification == Subscript::SIV) | ||||||||||||||||||||
| 3755 | Sivs.set(SJ); | ||||||||||||||||||||
| 3756 | else | ||||||||||||||||||||
| 3757 | Mivs.set(SJ); | ||||||||||||||||||||
| 3758 | PairsInGroup.push_back(&Pair[SJ]); | ||||||||||||||||||||
| 3759 | } | ||||||||||||||||||||
| 3760 | unifySubscriptType(PairsInGroup); | ||||||||||||||||||||
| 3761 | LLVM_DEBUG(dbgs() << "}\n")do { } while (false); | ||||||||||||||||||||
| 3762 | while (Sivs.any()) { | ||||||||||||||||||||
| 3763 | bool Changed = false; | ||||||||||||||||||||
| 3764 | for (unsigned SJ : Sivs.set_bits()) { | ||||||||||||||||||||
| 3765 | LLVM_DEBUG(dbgs() << "testing subscript " << SJ << ", SIV\n")do { } while (false); | ||||||||||||||||||||
| 3766 | // SJ is an SIV subscript that's part of the current coupled group | ||||||||||||||||||||
| 3767 | unsigned Level; | ||||||||||||||||||||
| 3768 | const SCEV *SplitIter = nullptr; | ||||||||||||||||||||
| 3769 | LLVM_DEBUG(dbgs() << "SIV\n")do { } while (false); | ||||||||||||||||||||
| 3770 | if (testSIV(Pair[SJ].Src, Pair[SJ].Dst, Level, Result, NewConstraint, | ||||||||||||||||||||
| 3771 | SplitIter)) | ||||||||||||||||||||
| 3772 | return nullptr; | ||||||||||||||||||||
| 3773 | ConstrainedLevels.set(Level); | ||||||||||||||||||||
| 3774 | if (intersectConstraints(&Constraints[Level], &NewConstraint)) { | ||||||||||||||||||||
| 3775 | if (Constraints[Level].isEmpty()) { | ||||||||||||||||||||
| 3776 | ++DeltaIndependence; | ||||||||||||||||||||
| 3777 | return nullptr; | ||||||||||||||||||||
| 3778 | } | ||||||||||||||||||||
| 3779 | Changed = true; | ||||||||||||||||||||
| 3780 | } | ||||||||||||||||||||
| 3781 | Sivs.reset(SJ); | ||||||||||||||||||||
| 3782 | } | ||||||||||||||||||||
| 3783 | if (Changed) { | ||||||||||||||||||||
| 3784 | // propagate, possibly creating new SIVs and ZIVs | ||||||||||||||||||||
| 3785 | LLVM_DEBUG(dbgs() << " propagating\n")do { } while (false); | ||||||||||||||||||||
| 3786 | LLVM_DEBUG(dbgs() << "\tMivs = ")do { } while (false); | ||||||||||||||||||||
| 3787 | LLVM_DEBUG(dumpSmallBitVector(Mivs))do { } while (false); | ||||||||||||||||||||
| 3788 | for (unsigned SJ : Mivs.set_bits()) { | ||||||||||||||||||||
| 3789 | // SJ is an MIV subscript that's part of the current coupled group | ||||||||||||||||||||
| 3790 | LLVM_DEBUG(dbgs() << "\tSJ = " << SJ << "\n")do { } while (false); | ||||||||||||||||||||
| 3791 | if (propagate(Pair[SJ].Src, Pair[SJ].Dst, Pair[SJ].Loops, | ||||||||||||||||||||
| 3792 | Constraints, Result.Consistent)) { | ||||||||||||||||||||
| 3793 | LLVM_DEBUG(dbgs() << "\t Changed\n")do { } while (false); | ||||||||||||||||||||
| 3794 | ++DeltaPropagations; | ||||||||||||||||||||
| 3795 | Pair[SJ].Classification = | ||||||||||||||||||||
| 3796 | classifyPair(Pair[SJ].Src, LI->getLoopFor(Src->getParent()), | ||||||||||||||||||||
| 3797 | Pair[SJ].Dst, LI->getLoopFor(Dst->getParent()), | ||||||||||||||||||||
| 3798 | Pair[SJ].Loops); | ||||||||||||||||||||
| 3799 | switch (Pair[SJ].Classification) { | ||||||||||||||||||||
| 3800 | case Subscript::ZIV: | ||||||||||||||||||||
| 3801 | LLVM_DEBUG(dbgs() << "ZIV\n")do { } while (false); | ||||||||||||||||||||
| 3802 | if (testZIV(Pair[SJ].Src, Pair[SJ].Dst, Result)) | ||||||||||||||||||||
| 3803 | return nullptr; | ||||||||||||||||||||
| 3804 | Mivs.reset(SJ); | ||||||||||||||||||||
| 3805 | break; | ||||||||||||||||||||
| 3806 | case Subscript::SIV: | ||||||||||||||||||||
| 3807 | Sivs.set(SJ); | ||||||||||||||||||||
| 3808 | Mivs.reset(SJ); | ||||||||||||||||||||
| 3809 | break; | ||||||||||||||||||||
| 3810 | case Subscript::RDIV: | ||||||||||||||||||||
| 3811 | case Subscript::MIV: | ||||||||||||||||||||
| 3812 | break; | ||||||||||||||||||||
| 3813 | default: | ||||||||||||||||||||
| 3814 | llvm_unreachable("bad subscript classification")__builtin_unreachable(); | ||||||||||||||||||||
| 3815 | } | ||||||||||||||||||||
| 3816 | } | ||||||||||||||||||||
| 3817 | } | ||||||||||||||||||||
| 3818 | } | ||||||||||||||||||||
| 3819 | } | ||||||||||||||||||||
| 3820 | |||||||||||||||||||||
| 3821 | // test & propagate remaining RDIVs | ||||||||||||||||||||
| 3822 | for (unsigned SJ : Mivs.set_bits()) { | ||||||||||||||||||||
| 3823 | if (Pair[SJ].Classification == Subscript::RDIV) { | ||||||||||||||||||||
| 3824 | LLVM_DEBUG(dbgs() << "RDIV test\n")do { } while (false); | ||||||||||||||||||||
| 3825 | if (testRDIV(Pair[SJ].Src, Pair[SJ].Dst, Result)) | ||||||||||||||||||||
| 3826 | return nullptr; | ||||||||||||||||||||
| 3827 | // I don't yet understand how to propagate RDIV results | ||||||||||||||||||||
| 3828 | Mivs.reset(SJ); | ||||||||||||||||||||
| 3829 | } | ||||||||||||||||||||
| 3830 | } | ||||||||||||||||||||
| 3831 | |||||||||||||||||||||
| 3832 | // test remaining MIVs | ||||||||||||||||||||
| 3833 | // This code is temporary. | ||||||||||||||||||||
| 3834 | // Better to somehow test all remaining subscripts simultaneously. | ||||||||||||||||||||
| 3835 | for (unsigned SJ : Mivs.set_bits()) { | ||||||||||||||||||||
| 3836 | if (Pair[SJ].Classification == Subscript::MIV) { | ||||||||||||||||||||
| 3837 | LLVM_DEBUG(dbgs() << "MIV test\n")do { } while (false); | ||||||||||||||||||||
| 3838 | if (testMIV(Pair[SJ].Src, Pair[SJ].Dst, Pair[SJ].Loops, Result)) | ||||||||||||||||||||
| 3839 | return nullptr; | ||||||||||||||||||||
| 3840 | } | ||||||||||||||||||||
| 3841 | else | ||||||||||||||||||||
| 3842 | llvm_unreachable("expected only MIV subscripts at this point")__builtin_unreachable(); | ||||||||||||||||||||
| 3843 | } | ||||||||||||||||||||
| 3844 | |||||||||||||||||||||
| 3845 | // update Result.DV from constraint vector | ||||||||||||||||||||
| 3846 | LLVM_DEBUG(dbgs() << " updating\n")do { } while (false); | ||||||||||||||||||||
| 3847 | for (unsigned SJ : ConstrainedLevels.set_bits()) { | ||||||||||||||||||||
| 3848 | if (SJ > CommonLevels) | ||||||||||||||||||||
| 3849 | break; | ||||||||||||||||||||
| 3850 | updateDirection(Result.DV[SJ - 1], Constraints[SJ]); | ||||||||||||||||||||
| 3851 | if (Result.DV[SJ - 1].Direction == Dependence::DVEntry::NONE) | ||||||||||||||||||||
| 3852 | return nullptr; | ||||||||||||||||||||
| 3853 | } | ||||||||||||||||||||
| 3854 | } | ||||||||||||||||||||
| 3855 | } | ||||||||||||||||||||
| 3856 | |||||||||||||||||||||
| 3857 | // Make sure the Scalar flags are set correctly. | ||||||||||||||||||||
| 3858 | SmallBitVector CompleteLoops(MaxLevels + 1); | ||||||||||||||||||||
| 3859 | for (unsigned SI = 0; SI < Pairs; ++SI) | ||||||||||||||||||||
| 3860 | CompleteLoops |= Pair[SI].Loops; | ||||||||||||||||||||
| 3861 | for (unsigned II = 1; II <= CommonLevels; ++II) | ||||||||||||||||||||
| 3862 | if (CompleteLoops[II]) | ||||||||||||||||||||
| 3863 | Result.DV[II - 1].Scalar = false; | ||||||||||||||||||||
| 3864 | |||||||||||||||||||||
| 3865 | if (PossiblyLoopIndependent) { | ||||||||||||||||||||
| 3866 | // Make sure the LoopIndependent flag is set correctly. | ||||||||||||||||||||
| 3867 | // All directions must include equal, otherwise no | ||||||||||||||||||||
| 3868 | // loop-independent dependence is possible. | ||||||||||||||||||||
| 3869 | for (unsigned II = 1; II <= CommonLevels; ++II) { | ||||||||||||||||||||
| 3870 | if (!(Result.getDirection(II) & Dependence::DVEntry::EQ)) { | ||||||||||||||||||||
| 3871 | Result.LoopIndependent = false; | ||||||||||||||||||||
| 3872 | break; | ||||||||||||||||||||
| 3873 | } | ||||||||||||||||||||
| 3874 | } | ||||||||||||||||||||
| 3875 | } | ||||||||||||||||||||
| 3876 | else { | ||||||||||||||||||||
| 3877 | // On the other hand, if all directions are equal and there's no | ||||||||||||||||||||
| 3878 | // loop-independent dependence possible, then no dependence exists. | ||||||||||||||||||||
| 3879 | bool AllEqual = true; | ||||||||||||||||||||
| 3880 | for (unsigned II = 1; II <= CommonLevels; ++II) { | ||||||||||||||||||||
| 3881 | if (Result.getDirection(II) != Dependence::DVEntry::EQ) { | ||||||||||||||||||||
| 3882 | AllEqual = false; | ||||||||||||||||||||
| 3883 | break; | ||||||||||||||||||||
| 3884 | } | ||||||||||||||||||||
| 3885 | } | ||||||||||||||||||||
| 3886 | if (AllEqual) | ||||||||||||||||||||
| 3887 | return nullptr; | ||||||||||||||||||||
| 3888 | } | ||||||||||||||||||||
| 3889 | |||||||||||||||||||||
| 3890 | return std::make_unique<FullDependence>(std::move(Result)); | ||||||||||||||||||||
| 3891 | } | ||||||||||||||||||||
| 3892 | |||||||||||||||||||||
| 3893 | //===----------------------------------------------------------------------===// | ||||||||||||||||||||
| 3894 | // getSplitIteration - | ||||||||||||||||||||
| 3895 | // Rather than spend rarely-used space recording the splitting iteration | ||||||||||||||||||||
| 3896 | // during the Weak-Crossing SIV test, we re-compute it on demand. | ||||||||||||||||||||
| 3897 | // The re-computation is basically a repeat of the entire dependence test, | ||||||||||||||||||||
| 3898 | // though simplified since we know that the dependence exists. | ||||||||||||||||||||
| 3899 | // It's tedious, since we must go through all propagations, etc. | ||||||||||||||||||||
| 3900 | // | ||||||||||||||||||||
| 3901 | // Care is required to keep this code up to date with respect to the routine | ||||||||||||||||||||
| 3902 | // above, depends(). | ||||||||||||||||||||
| 3903 | // | ||||||||||||||||||||
| 3904 | // Generally, the dependence analyzer will be used to build | ||||||||||||||||||||
| 3905 | // a dependence graph for a function (basically a map from instructions | ||||||||||||||||||||
| 3906 | // to dependences). Looking for cycles in the graph shows us loops | ||||||||||||||||||||
| 3907 | // that cannot be trivially vectorized/parallelized. | ||||||||||||||||||||
| 3908 | // | ||||||||||||||||||||
| 3909 | // We can try to improve the situation by examining all the dependences | ||||||||||||||||||||
| 3910 | // that make up the cycle, looking for ones we can break. | ||||||||||||||||||||
| 3911 | // Sometimes, peeling the first or last iteration of a loop will break | ||||||||||||||||||||
| 3912 | // dependences, and we've got flags for those possibilities. | ||||||||||||||||||||
| 3913 | // Sometimes, splitting a loop at some other iteration will do the trick, | ||||||||||||||||||||
| 3914 | // and we've got a flag for that case. Rather than waste the space to | ||||||||||||||||||||
| 3915 | // record the exact iteration (since we rarely know), we provide | ||||||||||||||||||||
| 3916 | // a method that calculates the iteration. It's a drag that it must work | ||||||||||||||||||||
| 3917 | // from scratch, but wonderful in that it's possible. | ||||||||||||||||||||
| 3918 | // | ||||||||||||||||||||
| 3919 | // Here's an example: | ||||||||||||||||||||
| 3920 | // | ||||||||||||||||||||
| 3921 | // for (i = 0; i < 10; i++) | ||||||||||||||||||||
| 3922 | // A[i] = ... | ||||||||||||||||||||
| 3923 | // ... = A[11 - i] | ||||||||||||||||||||
| 3924 | // | ||||||||||||||||||||
| 3925 | // There's a loop-carried flow dependence from the store to the load, | ||||||||||||||||||||
| 3926 | // found by the weak-crossing SIV test. The dependence will have a flag, | ||||||||||||||||||||
| 3927 | // indicating that the dependence can be broken by splitting the loop. | ||||||||||||||||||||
| 3928 | // Calling getSplitIteration will return 5. | ||||||||||||||||||||
| 3929 | // Splitting the loop breaks the dependence, like so: | ||||||||||||||||||||
| 3930 | // | ||||||||||||||||||||
| 3931 | // for (i = 0; i <= 5; i++) | ||||||||||||||||||||
| 3932 | // A[i] = ... | ||||||||||||||||||||
| 3933 | // ... = A[11 - i] | ||||||||||||||||||||
| 3934 | // for (i = 6; i < 10; i++) | ||||||||||||||||||||
| 3935 | // A[i] = ... | ||||||||||||||||||||
| 3936 | // ... = A[11 - i] | ||||||||||||||||||||
| 3937 | // | ||||||||||||||||||||
| 3938 | // breaks the dependence and allows us to vectorize/parallelize | ||||||||||||||||||||
| 3939 | // both loops. | ||||||||||||||||||||
| 3940 | const SCEV *DependenceInfo::getSplitIteration(const Dependence &Dep, | ||||||||||||||||||||
| 3941 | unsigned SplitLevel) { | ||||||||||||||||||||
| 3942 | assert(Dep.isSplitable(SplitLevel) &&((void)0) | ||||||||||||||||||||
| 3943 | "Dep should be splitable at SplitLevel")((void)0); | ||||||||||||||||||||
| 3944 | Instruction *Src = Dep.getSrc(); | ||||||||||||||||||||
| 3945 | Instruction *Dst = Dep.getDst(); | ||||||||||||||||||||
| 3946 | assert(Src->mayReadFromMemory() || Src->mayWriteToMemory())((void)0); | ||||||||||||||||||||
| 3947 | assert(Dst->mayReadFromMemory() || Dst->mayWriteToMemory())((void)0); | ||||||||||||||||||||
| 3948 | assert(isLoadOrStore(Src))((void)0); | ||||||||||||||||||||
| 3949 | assert(isLoadOrStore(Dst))((void)0); | ||||||||||||||||||||
| 3950 | Value *SrcPtr = getLoadStorePointerOperand(Src); | ||||||||||||||||||||
| 3951 | Value *DstPtr = getLoadStorePointerOperand(Dst); | ||||||||||||||||||||
| 3952 | assert(underlyingObjectsAlias(((void)0) | ||||||||||||||||||||
| 3953 | AA, F->getParent()->getDataLayout(), MemoryLocation::get(Dst),((void)0) | ||||||||||||||||||||
| 3954 | MemoryLocation::get(Src)) == AliasResult::MustAlias)((void)0); | ||||||||||||||||||||
| 3955 | |||||||||||||||||||||
| 3956 | // establish loop nesting levels | ||||||||||||||||||||
| 3957 | establishNestingLevels(Src, Dst); | ||||||||||||||||||||
| 3958 | |||||||||||||||||||||
| 3959 | FullDependence Result(Src, Dst, false, CommonLevels); | ||||||||||||||||||||
| 3960 | |||||||||||||||||||||
| 3961 | unsigned Pairs = 1; | ||||||||||||||||||||
| 3962 | SmallVector<Subscript, 2> Pair(Pairs); | ||||||||||||||||||||
| 3963 | const SCEV *SrcSCEV = SE->getSCEV(SrcPtr); | ||||||||||||||||||||
| 3964 | const SCEV *DstSCEV = SE->getSCEV(DstPtr); | ||||||||||||||||||||
| 3965 | Pair[0].Src = SrcSCEV; | ||||||||||||||||||||
| 3966 | Pair[0].Dst = DstSCEV; | ||||||||||||||||||||
| 3967 | |||||||||||||||||||||
| 3968 | if (Delinearize) { | ||||||||||||||||||||
| 3969 | if (tryDelinearize(Src, Dst, Pair)) { | ||||||||||||||||||||
| 3970 | LLVM_DEBUG(dbgs() << " delinearized\n")do { } while (false); | ||||||||||||||||||||
| 3971 | Pairs = Pair.size(); | ||||||||||||||||||||
| 3972 | } | ||||||||||||||||||||
| 3973 | } | ||||||||||||||||||||
| 3974 | |||||||||||||||||||||
| 3975 | for (unsigned P = 0; P < Pairs; ++P) { | ||||||||||||||||||||
| 3976 | Pair[P].Loops.resize(MaxLevels + 1); | ||||||||||||||||||||
| 3977 | Pair[P].GroupLoops.resize(MaxLevels + 1); | ||||||||||||||||||||
| 3978 | Pair[P].Group.resize(Pairs); | ||||||||||||||||||||
| 3979 | removeMatchingExtensions(&Pair[P]); | ||||||||||||||||||||
| 3980 | Pair[P].Classification = | ||||||||||||||||||||
| 3981 | classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()), | ||||||||||||||||||||
| 3982 | Pair[P].Dst, LI->getLoopFor(Dst->getParent()), | ||||||||||||||||||||
| 3983 | Pair[P].Loops); | ||||||||||||||||||||
| 3984 | Pair[P].GroupLoops = Pair[P].Loops; | ||||||||||||||||||||
| 3985 | Pair[P].Group.set(P); | ||||||||||||||||||||
| 3986 | } | ||||||||||||||||||||
| 3987 | |||||||||||||||||||||
| 3988 | SmallBitVector Separable(Pairs); | ||||||||||||||||||||
| 3989 | SmallBitVector Coupled(Pairs); | ||||||||||||||||||||
| 3990 | |||||||||||||||||||||
| 3991 | // partition subscripts into separable and minimally-coupled groups | ||||||||||||||||||||
| 3992 | for (unsigned SI = 0; SI < Pairs; ++SI) { | ||||||||||||||||||||
| 3993 | if (Pair[SI].Classification == Subscript::NonLinear) { | ||||||||||||||||||||
| 3994 | // ignore these, but collect loops for later | ||||||||||||||||||||
| 3995 | collectCommonLoops(Pair[SI].Src, | ||||||||||||||||||||
| 3996 | LI->getLoopFor(Src->getParent()), | ||||||||||||||||||||
| 3997 | Pair[SI].Loops); | ||||||||||||||||||||
| 3998 | collectCommonLoops(Pair[SI].Dst, | ||||||||||||||||||||
| 3999 | LI->getLoopFor(Dst->getParent()), | ||||||||||||||||||||
| 4000 | Pair[SI].Loops); | ||||||||||||||||||||
| 4001 | Result.Consistent = false; | ||||||||||||||||||||
| 4002 | } | ||||||||||||||||||||
| 4003 | else if (Pair[SI].Classification == Subscript::ZIV) | ||||||||||||||||||||
| 4004 | Separable.set(SI); | ||||||||||||||||||||
| 4005 | else { | ||||||||||||||||||||
| 4006 | // SIV, RDIV, or MIV, so check for coupled group | ||||||||||||||||||||
| 4007 | bool Done = true; | ||||||||||||||||||||
| 4008 | for (unsigned SJ = SI + 1; SJ < Pairs; ++SJ) { | ||||||||||||||||||||
| 4009 | SmallBitVector Intersection = Pair[SI].GroupLoops; | ||||||||||||||||||||
| 4010 | Intersection &= Pair[SJ].GroupLoops; | ||||||||||||||||||||
| 4011 | if (Intersection.any()) { | ||||||||||||||||||||
| 4012 | // accumulate set of all the loops in group | ||||||||||||||||||||
| 4013 | Pair[SJ].GroupLoops |= Pair[SI].GroupLoops; | ||||||||||||||||||||
| 4014 | // accumulate set of all subscripts in group | ||||||||||||||||||||
| 4015 | Pair[SJ].Group |= Pair[SI].Group; | ||||||||||||||||||||
| 4016 | Done = false; | ||||||||||||||||||||
| 4017 | } | ||||||||||||||||||||
| 4018 | } | ||||||||||||||||||||
| 4019 | if (Done) { | ||||||||||||||||||||
| 4020 | if (Pair[SI].Group.count() == 1) | ||||||||||||||||||||
| 4021 | Separable.set(SI); | ||||||||||||||||||||
| 4022 | else | ||||||||||||||||||||
| 4023 | Coupled.set(SI); | ||||||||||||||||||||
| 4024 | } | ||||||||||||||||||||
| 4025 | } | ||||||||||||||||||||
| 4026 | } | ||||||||||||||||||||
| 4027 | |||||||||||||||||||||
| 4028 | Constraint NewConstraint; | ||||||||||||||||||||
| 4029 | NewConstraint.setAny(SE); | ||||||||||||||||||||
| 4030 | |||||||||||||||||||||
| 4031 | // test separable subscripts | ||||||||||||||||||||
| 4032 | for (unsigned SI : Separable.set_bits()) { | ||||||||||||||||||||
| 4033 | switch (Pair[SI].Classification) { | ||||||||||||||||||||
| 4034 | case Subscript::SIV: { | ||||||||||||||||||||
| 4035 | unsigned Level; | ||||||||||||||||||||
| 4036 | const SCEV *SplitIter = nullptr; | ||||||||||||||||||||
| 4037 | (void) testSIV(Pair[SI].Src, Pair[SI].Dst, Level, | ||||||||||||||||||||
| 4038 | Result, NewConstraint, SplitIter); | ||||||||||||||||||||
| 4039 | if (Level == SplitLevel) { | ||||||||||||||||||||
| 4040 | assert(SplitIter != nullptr)((void)0); | ||||||||||||||||||||
| 4041 | return SplitIter; | ||||||||||||||||||||
| 4042 | } | ||||||||||||||||||||
| 4043 | break; | ||||||||||||||||||||
| 4044 | } | ||||||||||||||||||||
| 4045 | case Subscript::ZIV: | ||||||||||||||||||||
| 4046 | case Subscript::RDIV: | ||||||||||||||||||||
| 4047 | case Subscript::MIV: | ||||||||||||||||||||
| 4048 | break; | ||||||||||||||||||||
| 4049 | default: | ||||||||||||||||||||
| 4050 | llvm_unreachable("subscript has unexpected classification")__builtin_unreachable(); | ||||||||||||||||||||
| 4051 | } | ||||||||||||||||||||
| 4052 | } | ||||||||||||||||||||
| 4053 | |||||||||||||||||||||
| 4054 | if (Coupled.count()) { | ||||||||||||||||||||
| 4055 | // test coupled subscript groups | ||||||||||||||||||||
| 4056 | SmallVector<Constraint, 4> Constraints(MaxLevels + 1); | ||||||||||||||||||||
| 4057 | for (unsigned II = 0; II <= MaxLevels; ++II) | ||||||||||||||||||||
| 4058 | Constraints[II].setAny(SE); | ||||||||||||||||||||
| 4059 | for (unsigned SI : Coupled.set_bits()) { | ||||||||||||||||||||
| 4060 | SmallBitVector Group(Pair[SI].Group); | ||||||||||||||||||||
| 4061 | SmallBitVector Sivs(Pairs); | ||||||||||||||||||||
| 4062 | SmallBitVector Mivs(Pairs); | ||||||||||||||||||||
| 4063 | SmallBitVector ConstrainedLevels(MaxLevels + 1); | ||||||||||||||||||||
| 4064 | for (unsigned SJ : Group.set_bits()) { | ||||||||||||||||||||
| 4065 | if (Pair[SJ].Classification == Subscript::SIV) | ||||||||||||||||||||
| 4066 | Sivs.set(SJ); | ||||||||||||||||||||
| 4067 | else | ||||||||||||||||||||
| 4068 | Mivs.set(SJ); | ||||||||||||||||||||
| 4069 | } | ||||||||||||||||||||
| 4070 | while (Sivs.any()) { | ||||||||||||||||||||
| 4071 | bool Changed = false; | ||||||||||||||||||||
| 4072 | for (unsigned SJ : Sivs.set_bits()) { | ||||||||||||||||||||
| 4073 | // SJ is an SIV subscript that's part of the current coupled group | ||||||||||||||||||||
| 4074 | unsigned Level; | ||||||||||||||||||||
| 4075 | const SCEV *SplitIter = nullptr; | ||||||||||||||||||||
| 4076 | (void) testSIV(Pair[SJ].Src, Pair[SJ].Dst, Level, | ||||||||||||||||||||
| 4077 | Result, NewConstraint, SplitIter); | ||||||||||||||||||||
| 4078 | if (Level == SplitLevel && SplitIter) | ||||||||||||||||||||
| 4079 | return SplitIter; | ||||||||||||||||||||
| 4080 | ConstrainedLevels.set(Level); | ||||||||||||||||||||
| 4081 | if (intersectConstraints(&Constraints[Level], &NewConstraint)) | ||||||||||||||||||||
| 4082 | Changed = true; | ||||||||||||||||||||
| 4083 | Sivs.reset(SJ); | ||||||||||||||||||||
| 4084 | } | ||||||||||||||||||||
| 4085 | if (Changed) { | ||||||||||||||||||||
| 4086 | // propagate, possibly creating new SIVs and ZIVs | ||||||||||||||||||||
| 4087 | for (unsigned SJ : Mivs.set_bits()) { | ||||||||||||||||||||
| 4088 | // SJ is an MIV subscript that's part of the current coupled group | ||||||||||||||||||||
| 4089 | if (propagate(Pair[SJ].Src, Pair[SJ].Dst, | ||||||||||||||||||||
| 4090 | Pair[SJ].Loops, Constraints, Result.Consistent)) { | ||||||||||||||||||||
| 4091 | Pair[SJ].Classification = | ||||||||||||||||||||
| 4092 | classifyPair(Pair[SJ].Src, LI->getLoopFor(Src->getParent()), | ||||||||||||||||||||
| 4093 | Pair[SJ].Dst, LI->getLoopFor(Dst->getParent()), | ||||||||||||||||||||
| 4094 | Pair[SJ].Loops); | ||||||||||||||||||||
| 4095 | switch (Pair[SJ].Classification) { | ||||||||||||||||||||
| 4096 | case Subscript::ZIV: | ||||||||||||||||||||
| 4097 | Mivs.reset(SJ); | ||||||||||||||||||||
| 4098 | break; | ||||||||||||||||||||
| 4099 | case Subscript::SIV: | ||||||||||||||||||||
| 4100 | Sivs.set(SJ); | ||||||||||||||||||||
| 4101 | Mivs.reset(SJ); | ||||||||||||||||||||
| 4102 | break; | ||||||||||||||||||||
| 4103 | case Subscript::RDIV: | ||||||||||||||||||||
| 4104 | case Subscript::MIV: | ||||||||||||||||||||
| 4105 | break; | ||||||||||||||||||||
| 4106 | default: | ||||||||||||||||||||
| 4107 | llvm_unreachable("bad subscript classification")__builtin_unreachable(); | ||||||||||||||||||||
| 4108 | } | ||||||||||||||||||||
| 4109 | } | ||||||||||||||||||||
| 4110 | } | ||||||||||||||||||||
| 4111 | } | ||||||||||||||||||||
| 4112 | } | ||||||||||||||||||||
| 4113 | } | ||||||||||||||||||||
| 4114 | } | ||||||||||||||||||||
| 4115 | llvm_unreachable("somehow reached end of routine")__builtin_unreachable(); | ||||||||||||||||||||
| 4116 | return nullptr; | ||||||||||||||||||||
| 4117 | } |
| 1 | //===- llvm/Instructions.h - Instruction subclass definitions ---*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file exposes the class definitions of all of the subclasses of the |
| 10 | // Instruction class. This is meant to be an easy way to get access to all |
| 11 | // instruction subclasses. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| 14 | |
| 15 | #ifndef LLVM_IR_INSTRUCTIONS_H |
| 16 | #define LLVM_IR_INSTRUCTIONS_H |
| 17 | |
| 18 | #include "llvm/ADT/ArrayRef.h" |
| 19 | #include "llvm/ADT/Bitfields.h" |
| 20 | #include "llvm/ADT/MapVector.h" |
| 21 | #include "llvm/ADT/None.h" |
| 22 | #include "llvm/ADT/STLExtras.h" |
| 23 | #include "llvm/ADT/SmallVector.h" |
| 24 | #include "llvm/ADT/StringRef.h" |
| 25 | #include "llvm/ADT/Twine.h" |
| 26 | #include "llvm/ADT/iterator.h" |
| 27 | #include "llvm/ADT/iterator_range.h" |
| 28 | #include "llvm/IR/Attributes.h" |
| 29 | #include "llvm/IR/BasicBlock.h" |
| 30 | #include "llvm/IR/CallingConv.h" |
| 31 | #include "llvm/IR/CFG.h" |
| 32 | #include "llvm/IR/Constant.h" |
| 33 | #include "llvm/IR/DerivedTypes.h" |
| 34 | #include "llvm/IR/Function.h" |
| 35 | #include "llvm/IR/InstrTypes.h" |
| 36 | #include "llvm/IR/Instruction.h" |
| 37 | #include "llvm/IR/OperandTraits.h" |
| 38 | #include "llvm/IR/Type.h" |
| 39 | #include "llvm/IR/Use.h" |
| 40 | #include "llvm/IR/User.h" |
| 41 | #include "llvm/IR/Value.h" |
| 42 | #include "llvm/Support/AtomicOrdering.h" |
| 43 | #include "llvm/Support/Casting.h" |
| 44 | #include "llvm/Support/ErrorHandling.h" |
| 45 | #include <cassert> |
| 46 | #include <cstddef> |
| 47 | #include <cstdint> |
| 48 | #include <iterator> |
| 49 | |
| 50 | namespace llvm { |
| 51 | |
| 52 | class APInt; |
| 53 | class ConstantInt; |
| 54 | class DataLayout; |
| 55 | class LLVMContext; |
| 56 | |
| 57 | //===----------------------------------------------------------------------===// |
| 58 | // AllocaInst Class |
| 59 | //===----------------------------------------------------------------------===// |
| 60 | |
| 61 | /// an instruction to allocate memory on the stack |
| 62 | class AllocaInst : public UnaryInstruction { |
| 63 | Type *AllocatedType; |
| 64 | |
| 65 | using AlignmentField = AlignmentBitfieldElementT<0>; |
| 66 | using UsedWithInAllocaField = BoolBitfieldElementT<AlignmentField::NextBit>; |
| 67 | using SwiftErrorField = BoolBitfieldElementT<UsedWithInAllocaField::NextBit>; |
| 68 | static_assert(Bitfield::areContiguous<AlignmentField, UsedWithInAllocaField, |
| 69 | SwiftErrorField>(), |
| 70 | "Bitfields must be contiguous"); |
| 71 | |
| 72 | protected: |
| 73 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 74 | friend class Instruction; |
| 75 | |
| 76 | AllocaInst *cloneImpl() const; |
| 77 | |
| 78 | public: |
| 79 | explicit AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize, |
| 80 | const Twine &Name, Instruction *InsertBefore); |
| 81 | AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize, |
| 82 | const Twine &Name, BasicBlock *InsertAtEnd); |
| 83 | |
| 84 | AllocaInst(Type *Ty, unsigned AddrSpace, const Twine &Name, |
| 85 | Instruction *InsertBefore); |
| 86 | AllocaInst(Type *Ty, unsigned AddrSpace, |
| 87 | const Twine &Name, BasicBlock *InsertAtEnd); |
| 88 | |
| 89 | AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize, Align Align, |
| 90 | const Twine &Name = "", Instruction *InsertBefore = nullptr); |
| 91 | AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize, Align Align, |
| 92 | const Twine &Name, BasicBlock *InsertAtEnd); |
| 93 | |
| 94 | /// Return true if there is an allocation size parameter to the allocation |
| 95 | /// instruction that is not 1. |
| 96 | bool isArrayAllocation() const; |
| 97 | |
| 98 | /// Get the number of elements allocated. For a simple allocation of a single |
| 99 | /// element, this will return a constant 1 value. |
| 100 | const Value *getArraySize() const { return getOperand(0); } |
| 101 | Value *getArraySize() { return getOperand(0); } |
| 102 | |
| 103 | /// Overload to return most specific pointer type. |
| 104 | PointerType *getType() const { |
| 105 | return cast<PointerType>(Instruction::getType()); |
| 106 | } |
| 107 | |
| 108 | /// Get allocation size in bits. Returns None if size can't be determined, |
| 109 | /// e.g. in case of a VLA. |
| 110 | Optional<TypeSize> getAllocationSizeInBits(const DataLayout &DL) const; |
| 111 | |
| 112 | /// Return the type that is being allocated by the instruction. |
| 113 | Type *getAllocatedType() const { return AllocatedType; } |
| 114 | /// for use only in special circumstances that need to generically |
| 115 | /// transform a whole instruction (eg: IR linking and vectorization). |
| 116 | void setAllocatedType(Type *Ty) { AllocatedType = Ty; } |
| 117 | |
| 118 | /// Return the alignment of the memory that is being allocated by the |
| 119 | /// instruction. |
| 120 | Align getAlign() const { |
| 121 | return Align(1ULL << getSubclassData<AlignmentField>()); |
| 122 | } |
| 123 | |
| 124 | void setAlignment(Align Align) { |
| 125 | setSubclassData<AlignmentField>(Log2(Align)); |
| 126 | } |
| 127 | |
| 128 | // FIXME: Remove this one transition to Align is over. |
| 129 | unsigned getAlignment() const { return getAlign().value(); } |
| 130 | |
| 131 | /// Return true if this alloca is in the entry block of the function and is a |
| 132 | /// constant size. If so, the code generator will fold it into the |
| 133 | /// prolog/epilog code, so it is basically free. |
| 134 | bool isStaticAlloca() const; |
| 135 | |
| 136 | /// Return true if this alloca is used as an inalloca argument to a call. Such |
| 137 | /// allocas are never considered static even if they are in the entry block. |
| 138 | bool isUsedWithInAlloca() const { |
| 139 | return getSubclassData<UsedWithInAllocaField>(); |
| 140 | } |
| 141 | |
| 142 | /// Specify whether this alloca is used to represent the arguments to a call. |
| 143 | void setUsedWithInAlloca(bool V) { |
| 144 | setSubclassData<UsedWithInAllocaField>(V); |
| 145 | } |
| 146 | |
| 147 | /// Return true if this alloca is used as a swifterror argument to a call. |
| 148 | bool isSwiftError() const { return getSubclassData<SwiftErrorField>(); } |
| 149 | /// Specify whether this alloca is used to represent a swifterror. |
| 150 | void setSwiftError(bool V) { setSubclassData<SwiftErrorField>(V); } |
| 151 | |
| 152 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 153 | static bool classof(const Instruction *I) { |
| 154 | return (I->getOpcode() == Instruction::Alloca); |
| 155 | } |
| 156 | static bool classof(const Value *V) { |
| 157 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 158 | } |
| 159 | |
| 160 | private: |
| 161 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 162 | // method so that subclasses cannot accidentally use it. |
| 163 | template <typename Bitfield> |
| 164 | void setSubclassData(typename Bitfield::Type Value) { |
| 165 | Instruction::setSubclassData<Bitfield>(Value); |
| 166 | } |
| 167 | }; |
| 168 | |
| 169 | //===----------------------------------------------------------------------===// |
| 170 | // LoadInst Class |
| 171 | //===----------------------------------------------------------------------===// |
| 172 | |
| 173 | /// An instruction for reading from memory. This uses the SubclassData field in |
| 174 | /// Value to store whether or not the load is volatile. |
| 175 | class LoadInst : public UnaryInstruction { |
| 176 | using VolatileField = BoolBitfieldElementT<0>; |
| 177 | using AlignmentField = AlignmentBitfieldElementT<VolatileField::NextBit>; |
| 178 | using OrderingField = AtomicOrderingBitfieldElementT<AlignmentField::NextBit>; |
| 179 | static_assert( |
| 180 | Bitfield::areContiguous<VolatileField, AlignmentField, OrderingField>(), |
| 181 | "Bitfields must be contiguous"); |
| 182 | |
| 183 | void AssertOK(); |
| 184 | |
| 185 | protected: |
| 186 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 187 | friend class Instruction; |
| 188 | |
| 189 | LoadInst *cloneImpl() const; |
| 190 | |
| 191 | public: |
| 192 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, |
| 193 | Instruction *InsertBefore); |
| 194 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 195 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile, |
| 196 | Instruction *InsertBefore); |
| 197 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile, |
| 198 | BasicBlock *InsertAtEnd); |
| 199 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile, |
| 200 | Align Align, Instruction *InsertBefore = nullptr); |
| 201 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile, |
| 202 | Align Align, BasicBlock *InsertAtEnd); |
| 203 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile, |
| 204 | Align Align, AtomicOrdering Order, |
| 205 | SyncScope::ID SSID = SyncScope::System, |
| 206 | Instruction *InsertBefore = nullptr); |
| 207 | LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile, |
| 208 | Align Align, AtomicOrdering Order, SyncScope::ID SSID, |
| 209 | BasicBlock *InsertAtEnd); |
| 210 | |
| 211 | /// Return true if this is a load from a volatile memory location. |
| 212 | bool isVolatile() const { return getSubclassData<VolatileField>(); } |
| 213 | |
| 214 | /// Specify whether this is a volatile load or not. |
| 215 | void setVolatile(bool V) { setSubclassData<VolatileField>(V); } |
| 216 | |
| 217 | /// Return the alignment of the access that is being performed. |
| 218 | /// FIXME: Remove this function once transition to Align is over. |
| 219 | /// Use getAlign() instead. |
| 220 | unsigned getAlignment() const { return getAlign().value(); } |
| 221 | |
| 222 | /// Return the alignment of the access that is being performed. |
| 223 | Align getAlign() const { |
| 224 | return Align(1ULL << (getSubclassData<AlignmentField>())); |
| 225 | } |
| 226 | |
| 227 | void setAlignment(Align Align) { |
| 228 | setSubclassData<AlignmentField>(Log2(Align)); |
| 229 | } |
| 230 | |
| 231 | /// Returns the ordering constraint of this load instruction. |
| 232 | AtomicOrdering getOrdering() const { |
| 233 | return getSubclassData<OrderingField>(); |
| 234 | } |
| 235 | /// Sets the ordering constraint of this load instruction. May not be Release |
| 236 | /// or AcquireRelease. |
| 237 | void setOrdering(AtomicOrdering Ordering) { |
| 238 | setSubclassData<OrderingField>(Ordering); |
| 239 | } |
| 240 | |
| 241 | /// Returns the synchronization scope ID of this load instruction. |
| 242 | SyncScope::ID getSyncScopeID() const { |
| 243 | return SSID; |
| 244 | } |
| 245 | |
| 246 | /// Sets the synchronization scope ID of this load instruction. |
| 247 | void setSyncScopeID(SyncScope::ID SSID) { |
| 248 | this->SSID = SSID; |
| 249 | } |
| 250 | |
| 251 | /// Sets the ordering constraint and the synchronization scope ID of this load |
| 252 | /// instruction. |
| 253 | void setAtomic(AtomicOrdering Ordering, |
| 254 | SyncScope::ID SSID = SyncScope::System) { |
| 255 | setOrdering(Ordering); |
| 256 | setSyncScopeID(SSID); |
| 257 | } |
| 258 | |
| 259 | bool isSimple() const { return !isAtomic() && !isVolatile(); } |
| 260 | |
| 261 | bool isUnordered() const { |
| 262 | return (getOrdering() == AtomicOrdering::NotAtomic || |
| 263 | getOrdering() == AtomicOrdering::Unordered) && |
| 264 | !isVolatile(); |
| 265 | } |
| 266 | |
| 267 | Value *getPointerOperand() { return getOperand(0); } |
| 268 | const Value *getPointerOperand() const { return getOperand(0); } |
| 269 | static unsigned getPointerOperandIndex() { return 0U; } |
| 270 | Type *getPointerOperandType() const { return getPointerOperand()->getType(); } |
| 271 | |
| 272 | /// Returns the address space of the pointer operand. |
| 273 | unsigned getPointerAddressSpace() const { |
| 274 | return getPointerOperandType()->getPointerAddressSpace(); |
| 275 | } |
| 276 | |
| 277 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 278 | static bool classof(const Instruction *I) { |
| 279 | return I->getOpcode() == Instruction::Load; |
| 280 | } |
| 281 | static bool classof(const Value *V) { |
| 282 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 283 | } |
| 284 | |
| 285 | private: |
| 286 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 287 | // method so that subclasses cannot accidentally use it. |
| 288 | template <typename Bitfield> |
| 289 | void setSubclassData(typename Bitfield::Type Value) { |
| 290 | Instruction::setSubclassData<Bitfield>(Value); |
| 291 | } |
| 292 | |
| 293 | /// The synchronization scope ID of this load instruction. Not quite enough |
| 294 | /// room in SubClassData for everything, so synchronization scope ID gets its |
| 295 | /// own field. |
| 296 | SyncScope::ID SSID; |
| 297 | }; |
| 298 | |
| 299 | //===----------------------------------------------------------------------===// |
| 300 | // StoreInst Class |
| 301 | //===----------------------------------------------------------------------===// |
| 302 | |
| 303 | /// An instruction for storing to memory. |
| 304 | class StoreInst : public Instruction { |
| 305 | using VolatileField = BoolBitfieldElementT<0>; |
| 306 | using AlignmentField = AlignmentBitfieldElementT<VolatileField::NextBit>; |
| 307 | using OrderingField = AtomicOrderingBitfieldElementT<AlignmentField::NextBit>; |
| 308 | static_assert( |
| 309 | Bitfield::areContiguous<VolatileField, AlignmentField, OrderingField>(), |
| 310 | "Bitfields must be contiguous"); |
| 311 | |
| 312 | void AssertOK(); |
| 313 | |
| 314 | protected: |
| 315 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 316 | friend class Instruction; |
| 317 | |
| 318 | StoreInst *cloneImpl() const; |
| 319 | |
| 320 | public: |
| 321 | StoreInst(Value *Val, Value *Ptr, Instruction *InsertBefore); |
| 322 | StoreInst(Value *Val, Value *Ptr, BasicBlock *InsertAtEnd); |
| 323 | StoreInst(Value *Val, Value *Ptr, bool isVolatile, Instruction *InsertBefore); |
| 324 | StoreInst(Value *Val, Value *Ptr, bool isVolatile, BasicBlock *InsertAtEnd); |
| 325 | StoreInst(Value *Val, Value *Ptr, bool isVolatile, Align Align, |
| 326 | Instruction *InsertBefore = nullptr); |
| 327 | StoreInst(Value *Val, Value *Ptr, bool isVolatile, Align Align, |
| 328 | BasicBlock *InsertAtEnd); |
| 329 | StoreInst(Value *Val, Value *Ptr, bool isVolatile, Align Align, |
| 330 | AtomicOrdering Order, SyncScope::ID SSID = SyncScope::System, |
| 331 | Instruction *InsertBefore = nullptr); |
| 332 | StoreInst(Value *Val, Value *Ptr, bool isVolatile, Align Align, |
| 333 | AtomicOrdering Order, SyncScope::ID SSID, BasicBlock *InsertAtEnd); |
| 334 | |
| 335 | // allocate space for exactly two operands |
| 336 | void *operator new(size_t S) { return User::operator new(S, 2); } |
| 337 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 338 | |
| 339 | /// Return true if this is a store to a volatile memory location. |
| 340 | bool isVolatile() const { return getSubclassData<VolatileField>(); } |
| 341 | |
| 342 | /// Specify whether this is a volatile store or not. |
| 343 | void setVolatile(bool V) { setSubclassData<VolatileField>(V); } |
| 344 | |
| 345 | /// Transparently provide more efficient getOperand methods. |
| 346 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 347 | |
| 348 | /// Return the alignment of the access that is being performed |
| 349 | /// FIXME: Remove this function once transition to Align is over. |
| 350 | /// Use getAlign() instead. |
| 351 | unsigned getAlignment() const { return getAlign().value(); } |
| 352 | |
| 353 | Align getAlign() const { |
| 354 | return Align(1ULL << (getSubclassData<AlignmentField>())); |
| 355 | } |
| 356 | |
| 357 | void setAlignment(Align Align) { |
| 358 | setSubclassData<AlignmentField>(Log2(Align)); |
| 359 | } |
| 360 | |
| 361 | /// Returns the ordering constraint of this store instruction. |
| 362 | AtomicOrdering getOrdering() const { |
| 363 | return getSubclassData<OrderingField>(); |
| 364 | } |
| 365 | |
| 366 | /// Sets the ordering constraint of this store instruction. May not be |
| 367 | /// Acquire or AcquireRelease. |
| 368 | void setOrdering(AtomicOrdering Ordering) { |
| 369 | setSubclassData<OrderingField>(Ordering); |
| 370 | } |
| 371 | |
| 372 | /// Returns the synchronization scope ID of this store instruction. |
| 373 | SyncScope::ID getSyncScopeID() const { |
| 374 | return SSID; |
| 375 | } |
| 376 | |
| 377 | /// Sets the synchronization scope ID of this store instruction. |
| 378 | void setSyncScopeID(SyncScope::ID SSID) { |
| 379 | this->SSID = SSID; |
| 380 | } |
| 381 | |
| 382 | /// Sets the ordering constraint and the synchronization scope ID of this |
| 383 | /// store instruction. |
| 384 | void setAtomic(AtomicOrdering Ordering, |
| 385 | SyncScope::ID SSID = SyncScope::System) { |
| 386 | setOrdering(Ordering); |
| 387 | setSyncScopeID(SSID); |
| 388 | } |
| 389 | |
| 390 | bool isSimple() const { return !isAtomic() && !isVolatile(); } |
| 391 | |
| 392 | bool isUnordered() const { |
| 393 | return (getOrdering() == AtomicOrdering::NotAtomic || |
| 394 | getOrdering() == AtomicOrdering::Unordered) && |
| 395 | !isVolatile(); |
| 396 | } |
| 397 | |
| 398 | Value *getValueOperand() { return getOperand(0); } |
| 399 | const Value *getValueOperand() const { return getOperand(0); } |
| 400 | |
| 401 | Value *getPointerOperand() { return getOperand(1); } |
| 402 | const Value *getPointerOperand() const { return getOperand(1); } |
| 403 | static unsigned getPointerOperandIndex() { return 1U; } |
| 404 | Type *getPointerOperandType() const { return getPointerOperand()->getType(); } |
| 405 | |
| 406 | /// Returns the address space of the pointer operand. |
| 407 | unsigned getPointerAddressSpace() const { |
| 408 | return getPointerOperandType()->getPointerAddressSpace(); |
| 409 | } |
| 410 | |
| 411 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 412 | static bool classof(const Instruction *I) { |
| 413 | return I->getOpcode() == Instruction::Store; |
| 414 | } |
| 415 | static bool classof(const Value *V) { |
| 416 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 417 | } |
| 418 | |
| 419 | private: |
| 420 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 421 | // method so that subclasses cannot accidentally use it. |
| 422 | template <typename Bitfield> |
| 423 | void setSubclassData(typename Bitfield::Type Value) { |
| 424 | Instruction::setSubclassData<Bitfield>(Value); |
| 425 | } |
| 426 | |
| 427 | /// The synchronization scope ID of this store instruction. Not quite enough |
| 428 | /// room in SubClassData for everything, so synchronization scope ID gets its |
| 429 | /// own field. |
| 430 | SyncScope::ID SSID; |
| 431 | }; |
| 432 | |
| 433 | template <> |
| 434 | struct OperandTraits<StoreInst> : public FixedNumOperandTraits<StoreInst, 2> { |
| 435 | }; |
| 436 | |
| 437 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(StoreInst, Value)StoreInst::op_iterator StoreInst::op_begin() { return OperandTraits <StoreInst>::op_begin(this); } StoreInst::const_op_iterator StoreInst::op_begin() const { return OperandTraits<StoreInst >::op_begin(const_cast<StoreInst*>(this)); } StoreInst ::op_iterator StoreInst::op_end() { return OperandTraits<StoreInst >::op_end(this); } StoreInst::const_op_iterator StoreInst:: op_end() const { return OperandTraits<StoreInst>::op_end (const_cast<StoreInst*>(this)); } Value *StoreInst::getOperand (unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<StoreInst>::op_begin(const_cast <StoreInst*>(this))[i_nocapture].get()); } void StoreInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<StoreInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned StoreInst::getNumOperands() const { return OperandTraits<StoreInst>::operands(this); } template <int Idx_nocapture> Use &StoreInst::Op() { return this ->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture > const Use &StoreInst::Op() const { return this->OpFrom <Idx_nocapture>(this); } |
| 438 | |
| 439 | //===----------------------------------------------------------------------===// |
| 440 | // FenceInst Class |
| 441 | //===----------------------------------------------------------------------===// |
| 442 | |
| 443 | /// An instruction for ordering other memory operations. |
| 444 | class FenceInst : public Instruction { |
| 445 | using OrderingField = AtomicOrderingBitfieldElementT<0>; |
| 446 | |
| 447 | void Init(AtomicOrdering Ordering, SyncScope::ID SSID); |
| 448 | |
| 449 | protected: |
| 450 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 451 | friend class Instruction; |
| 452 | |
| 453 | FenceInst *cloneImpl() const; |
| 454 | |
| 455 | public: |
| 456 | // Ordering may only be Acquire, Release, AcquireRelease, or |
| 457 | // SequentiallyConsistent. |
| 458 | FenceInst(LLVMContext &C, AtomicOrdering Ordering, |
| 459 | SyncScope::ID SSID = SyncScope::System, |
| 460 | Instruction *InsertBefore = nullptr); |
| 461 | FenceInst(LLVMContext &C, AtomicOrdering Ordering, SyncScope::ID SSID, |
| 462 | BasicBlock *InsertAtEnd); |
| 463 | |
| 464 | // allocate space for exactly zero operands |
| 465 | void *operator new(size_t S) { return User::operator new(S, 0); } |
| 466 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 467 | |
| 468 | /// Returns the ordering constraint of this fence instruction. |
| 469 | AtomicOrdering getOrdering() const { |
| 470 | return getSubclassData<OrderingField>(); |
| 471 | } |
| 472 | |
| 473 | /// Sets the ordering constraint of this fence instruction. May only be |
| 474 | /// Acquire, Release, AcquireRelease, or SequentiallyConsistent. |
| 475 | void setOrdering(AtomicOrdering Ordering) { |
| 476 | setSubclassData<OrderingField>(Ordering); |
| 477 | } |
| 478 | |
| 479 | /// Returns the synchronization scope ID of this fence instruction. |
| 480 | SyncScope::ID getSyncScopeID() const { |
| 481 | return SSID; |
| 482 | } |
| 483 | |
| 484 | /// Sets the synchronization scope ID of this fence instruction. |
| 485 | void setSyncScopeID(SyncScope::ID SSID) { |
| 486 | this->SSID = SSID; |
| 487 | } |
| 488 | |
| 489 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 490 | static bool classof(const Instruction *I) { |
| 491 | return I->getOpcode() == Instruction::Fence; |
| 492 | } |
| 493 | static bool classof(const Value *V) { |
| 494 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 495 | } |
| 496 | |
| 497 | private: |
| 498 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 499 | // method so that subclasses cannot accidentally use it. |
| 500 | template <typename Bitfield> |
| 501 | void setSubclassData(typename Bitfield::Type Value) { |
| 502 | Instruction::setSubclassData<Bitfield>(Value); |
| 503 | } |
| 504 | |
| 505 | /// The synchronization scope ID of this fence instruction. Not quite enough |
| 506 | /// room in SubClassData for everything, so synchronization scope ID gets its |
| 507 | /// own field. |
| 508 | SyncScope::ID SSID; |
| 509 | }; |
| 510 | |
| 511 | //===----------------------------------------------------------------------===// |
| 512 | // AtomicCmpXchgInst Class |
| 513 | //===----------------------------------------------------------------------===// |
| 514 | |
| 515 | /// An instruction that atomically checks whether a |
| 516 | /// specified value is in a memory location, and, if it is, stores a new value |
| 517 | /// there. The value returned by this instruction is a pair containing the |
| 518 | /// original value as first element, and an i1 indicating success (true) or |
| 519 | /// failure (false) as second element. |
| 520 | /// |
| 521 | class AtomicCmpXchgInst : public Instruction { |
| 522 | void Init(Value *Ptr, Value *Cmp, Value *NewVal, Align Align, |
| 523 | AtomicOrdering SuccessOrdering, AtomicOrdering FailureOrdering, |
| 524 | SyncScope::ID SSID); |
| 525 | |
| 526 | template <unsigned Offset> |
| 527 | using AtomicOrderingBitfieldElement = |
| 528 | typename Bitfield::Element<AtomicOrdering, Offset, 3, |
| 529 | AtomicOrdering::LAST>; |
| 530 | |
| 531 | protected: |
| 532 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 533 | friend class Instruction; |
| 534 | |
| 535 | AtomicCmpXchgInst *cloneImpl() const; |
| 536 | |
| 537 | public: |
| 538 | AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal, Align Alignment, |
| 539 | AtomicOrdering SuccessOrdering, |
| 540 | AtomicOrdering FailureOrdering, SyncScope::ID SSID, |
| 541 | Instruction *InsertBefore = nullptr); |
| 542 | AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal, Align Alignment, |
| 543 | AtomicOrdering SuccessOrdering, |
| 544 | AtomicOrdering FailureOrdering, SyncScope::ID SSID, |
| 545 | BasicBlock *InsertAtEnd); |
| 546 | |
| 547 | // allocate space for exactly three operands |
| 548 | void *operator new(size_t S) { return User::operator new(S, 3); } |
| 549 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 550 | |
| 551 | using VolatileField = BoolBitfieldElementT<0>; |
| 552 | using WeakField = BoolBitfieldElementT<VolatileField::NextBit>; |
| 553 | using SuccessOrderingField = |
| 554 | AtomicOrderingBitfieldElementT<WeakField::NextBit>; |
| 555 | using FailureOrderingField = |
| 556 | AtomicOrderingBitfieldElementT<SuccessOrderingField::NextBit>; |
| 557 | using AlignmentField = |
| 558 | AlignmentBitfieldElementT<FailureOrderingField::NextBit>; |
| 559 | static_assert( |
| 560 | Bitfield::areContiguous<VolatileField, WeakField, SuccessOrderingField, |
| 561 | FailureOrderingField, AlignmentField>(), |
| 562 | "Bitfields must be contiguous"); |
| 563 | |
| 564 | /// Return the alignment of the memory that is being allocated by the |
| 565 | /// instruction. |
| 566 | Align getAlign() const { |
| 567 | return Align(1ULL << getSubclassData<AlignmentField>()); |
| 568 | } |
| 569 | |
| 570 | void setAlignment(Align Align) { |
| 571 | setSubclassData<AlignmentField>(Log2(Align)); |
| 572 | } |
| 573 | |
| 574 | /// Return true if this is a cmpxchg from a volatile memory |
| 575 | /// location. |
| 576 | /// |
| 577 | bool isVolatile() const { return getSubclassData<VolatileField>(); } |
| 578 | |
| 579 | /// Specify whether this is a volatile cmpxchg. |
| 580 | /// |
| 581 | void setVolatile(bool V) { setSubclassData<VolatileField>(V); } |
| 582 | |
| 583 | /// Return true if this cmpxchg may spuriously fail. |
| 584 | bool isWeak() const { return getSubclassData<WeakField>(); } |
| 585 | |
| 586 | void setWeak(bool IsWeak) { setSubclassData<WeakField>(IsWeak); } |
| 587 | |
| 588 | /// Transparently provide more efficient getOperand methods. |
| 589 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 590 | |
| 591 | static bool isValidSuccessOrdering(AtomicOrdering Ordering) { |
| 592 | return Ordering != AtomicOrdering::NotAtomic && |
| 593 | Ordering != AtomicOrdering::Unordered; |
| 594 | } |
| 595 | |
| 596 | static bool isValidFailureOrdering(AtomicOrdering Ordering) { |
| 597 | return Ordering != AtomicOrdering::NotAtomic && |
| 598 | Ordering != AtomicOrdering::Unordered && |
| 599 | Ordering != AtomicOrdering::AcquireRelease && |
| 600 | Ordering != AtomicOrdering::Release; |
| 601 | } |
| 602 | |
| 603 | /// Returns the success ordering constraint of this cmpxchg instruction. |
| 604 | AtomicOrdering getSuccessOrdering() const { |
| 605 | return getSubclassData<SuccessOrderingField>(); |
| 606 | } |
| 607 | |
| 608 | /// Sets the success ordering constraint of this cmpxchg instruction. |
| 609 | void setSuccessOrdering(AtomicOrdering Ordering) { |
| 610 | assert(isValidSuccessOrdering(Ordering) &&((void)0) |
| 611 | "invalid CmpXchg success ordering")((void)0); |
| 612 | setSubclassData<SuccessOrderingField>(Ordering); |
| 613 | } |
| 614 | |
| 615 | /// Returns the failure ordering constraint of this cmpxchg instruction. |
| 616 | AtomicOrdering getFailureOrdering() const { |
| 617 | return getSubclassData<FailureOrderingField>(); |
| 618 | } |
| 619 | |
| 620 | /// Sets the failure ordering constraint of this cmpxchg instruction. |
| 621 | void setFailureOrdering(AtomicOrdering Ordering) { |
| 622 | assert(isValidFailureOrdering(Ordering) &&((void)0) |
| 623 | "invalid CmpXchg failure ordering")((void)0); |
| 624 | setSubclassData<FailureOrderingField>(Ordering); |
| 625 | } |
| 626 | |
| 627 | /// Returns a single ordering which is at least as strong as both the |
| 628 | /// success and failure orderings for this cmpxchg. |
| 629 | AtomicOrdering getMergedOrdering() const { |
| 630 | if (getFailureOrdering() == AtomicOrdering::SequentiallyConsistent) |
| 631 | return AtomicOrdering::SequentiallyConsistent; |
| 632 | if (getFailureOrdering() == AtomicOrdering::Acquire) { |
| 633 | if (getSuccessOrdering() == AtomicOrdering::Monotonic) |
| 634 | return AtomicOrdering::Acquire; |
| 635 | if (getSuccessOrdering() == AtomicOrdering::Release) |
| 636 | return AtomicOrdering::AcquireRelease; |
| 637 | } |
| 638 | return getSuccessOrdering(); |
| 639 | } |
| 640 | |
| 641 | /// Returns the synchronization scope ID of this cmpxchg instruction. |
| 642 | SyncScope::ID getSyncScopeID() const { |
| 643 | return SSID; |
| 644 | } |
| 645 | |
| 646 | /// Sets the synchronization scope ID of this cmpxchg instruction. |
| 647 | void setSyncScopeID(SyncScope::ID SSID) { |
| 648 | this->SSID = SSID; |
| 649 | } |
| 650 | |
| 651 | Value *getPointerOperand() { return getOperand(0); } |
| 652 | const Value *getPointerOperand() const { return getOperand(0); } |
| 653 | static unsigned getPointerOperandIndex() { return 0U; } |
| 654 | |
| 655 | Value *getCompareOperand() { return getOperand(1); } |
| 656 | const Value *getCompareOperand() const { return getOperand(1); } |
| 657 | |
| 658 | Value *getNewValOperand() { return getOperand(2); } |
| 659 | const Value *getNewValOperand() const { return getOperand(2); } |
| 660 | |
| 661 | /// Returns the address space of the pointer operand. |
| 662 | unsigned getPointerAddressSpace() const { |
| 663 | return getPointerOperand()->getType()->getPointerAddressSpace(); |
| 664 | } |
| 665 | |
| 666 | /// Returns the strongest permitted ordering on failure, given the |
| 667 | /// desired ordering on success. |
| 668 | /// |
| 669 | /// If the comparison in a cmpxchg operation fails, there is no atomic store |
| 670 | /// so release semantics cannot be provided. So this function drops explicit |
| 671 | /// Release requests from the AtomicOrdering. A SequentiallyConsistent |
| 672 | /// operation would remain SequentiallyConsistent. |
| 673 | static AtomicOrdering |
| 674 | getStrongestFailureOrdering(AtomicOrdering SuccessOrdering) { |
| 675 | switch (SuccessOrdering) { |
| 676 | default: |
| 677 | llvm_unreachable("invalid cmpxchg success ordering")__builtin_unreachable(); |
| 678 | case AtomicOrdering::Release: |
| 679 | case AtomicOrdering::Monotonic: |
| 680 | return AtomicOrdering::Monotonic; |
| 681 | case AtomicOrdering::AcquireRelease: |
| 682 | case AtomicOrdering::Acquire: |
| 683 | return AtomicOrdering::Acquire; |
| 684 | case AtomicOrdering::SequentiallyConsistent: |
| 685 | return AtomicOrdering::SequentiallyConsistent; |
| 686 | } |
| 687 | } |
| 688 | |
| 689 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 690 | static bool classof(const Instruction *I) { |
| 691 | return I->getOpcode() == Instruction::AtomicCmpXchg; |
| 692 | } |
| 693 | static bool classof(const Value *V) { |
| 694 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 695 | } |
| 696 | |
| 697 | private: |
| 698 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 699 | // method so that subclasses cannot accidentally use it. |
| 700 | template <typename Bitfield> |
| 701 | void setSubclassData(typename Bitfield::Type Value) { |
| 702 | Instruction::setSubclassData<Bitfield>(Value); |
| 703 | } |
| 704 | |
| 705 | /// The synchronization scope ID of this cmpxchg instruction. Not quite |
| 706 | /// enough room in SubClassData for everything, so synchronization scope ID |
| 707 | /// gets its own field. |
| 708 | SyncScope::ID SSID; |
| 709 | }; |
| 710 | |
| 711 | template <> |
| 712 | struct OperandTraits<AtomicCmpXchgInst> : |
| 713 | public FixedNumOperandTraits<AtomicCmpXchgInst, 3> { |
| 714 | }; |
| 715 | |
| 716 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(AtomicCmpXchgInst, Value)AtomicCmpXchgInst::op_iterator AtomicCmpXchgInst::op_begin() { return OperandTraits<AtomicCmpXchgInst>::op_begin(this ); } AtomicCmpXchgInst::const_op_iterator AtomicCmpXchgInst:: op_begin() const { return OperandTraits<AtomicCmpXchgInst> ::op_begin(const_cast<AtomicCmpXchgInst*>(this)); } AtomicCmpXchgInst ::op_iterator AtomicCmpXchgInst::op_end() { return OperandTraits <AtomicCmpXchgInst>::op_end(this); } AtomicCmpXchgInst:: const_op_iterator AtomicCmpXchgInst::op_end() const { return OperandTraits <AtomicCmpXchgInst>::op_end(const_cast<AtomicCmpXchgInst *>(this)); } Value *AtomicCmpXchgInst::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null<Value >( OperandTraits<AtomicCmpXchgInst>::op_begin(const_cast <AtomicCmpXchgInst*>(this))[i_nocapture].get()); } void AtomicCmpXchgInst::setOperand(unsigned i_nocapture, Value *Val_nocapture ) { ((void)0); OperandTraits<AtomicCmpXchgInst>::op_begin (this)[i_nocapture] = Val_nocapture; } unsigned AtomicCmpXchgInst ::getNumOperands() const { return OperandTraits<AtomicCmpXchgInst >::operands(this); } template <int Idx_nocapture> Use &AtomicCmpXchgInst::Op() { return this->OpFrom<Idx_nocapture >(this); } template <int Idx_nocapture> const Use & AtomicCmpXchgInst::Op() const { return this->OpFrom<Idx_nocapture >(this); } |
| 717 | |
| 718 | //===----------------------------------------------------------------------===// |
| 719 | // AtomicRMWInst Class |
| 720 | //===----------------------------------------------------------------------===// |
| 721 | |
| 722 | /// an instruction that atomically reads a memory location, |
| 723 | /// combines it with another value, and then stores the result back. Returns |
| 724 | /// the old value. |
| 725 | /// |
| 726 | class AtomicRMWInst : public Instruction { |
| 727 | protected: |
| 728 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 729 | friend class Instruction; |
| 730 | |
| 731 | AtomicRMWInst *cloneImpl() const; |
| 732 | |
| 733 | public: |
| 734 | /// This enumeration lists the possible modifications atomicrmw can make. In |
| 735 | /// the descriptions, 'p' is the pointer to the instruction's memory location, |
| 736 | /// 'old' is the initial value of *p, and 'v' is the other value passed to the |
| 737 | /// instruction. These instructions always return 'old'. |
| 738 | enum BinOp : unsigned { |
| 739 | /// *p = v |
| 740 | Xchg, |
| 741 | /// *p = old + v |
| 742 | Add, |
| 743 | /// *p = old - v |
| 744 | Sub, |
| 745 | /// *p = old & v |
| 746 | And, |
| 747 | /// *p = ~(old & v) |
| 748 | Nand, |
| 749 | /// *p = old | v |
| 750 | Or, |
| 751 | /// *p = old ^ v |
| 752 | Xor, |
| 753 | /// *p = old >signed v ? old : v |
| 754 | Max, |
| 755 | /// *p = old <signed v ? old : v |
| 756 | Min, |
| 757 | /// *p = old >unsigned v ? old : v |
| 758 | UMax, |
| 759 | /// *p = old <unsigned v ? old : v |
| 760 | UMin, |
| 761 | |
| 762 | /// *p = old + v |
| 763 | FAdd, |
| 764 | |
| 765 | /// *p = old - v |
| 766 | FSub, |
| 767 | |
| 768 | FIRST_BINOP = Xchg, |
| 769 | LAST_BINOP = FSub, |
| 770 | BAD_BINOP |
| 771 | }; |
| 772 | |
| 773 | private: |
| 774 | template <unsigned Offset> |
| 775 | using AtomicOrderingBitfieldElement = |
| 776 | typename Bitfield::Element<AtomicOrdering, Offset, 3, |
| 777 | AtomicOrdering::LAST>; |
| 778 | |
| 779 | template <unsigned Offset> |
| 780 | using BinOpBitfieldElement = |
| 781 | typename Bitfield::Element<BinOp, Offset, 4, BinOp::LAST_BINOP>; |
| 782 | |
| 783 | public: |
| 784 | AtomicRMWInst(BinOp Operation, Value *Ptr, Value *Val, Align Alignment, |
| 785 | AtomicOrdering Ordering, SyncScope::ID SSID, |
| 786 | Instruction *InsertBefore = nullptr); |
| 787 | AtomicRMWInst(BinOp Operation, Value *Ptr, Value *Val, Align Alignment, |
| 788 | AtomicOrdering Ordering, SyncScope::ID SSID, |
| 789 | BasicBlock *InsertAtEnd); |
| 790 | |
| 791 | // allocate space for exactly two operands |
| 792 | void *operator new(size_t S) { return User::operator new(S, 2); } |
| 793 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 794 | |
| 795 | using VolatileField = BoolBitfieldElementT<0>; |
| 796 | using AtomicOrderingField = |
| 797 | AtomicOrderingBitfieldElementT<VolatileField::NextBit>; |
| 798 | using OperationField = BinOpBitfieldElement<AtomicOrderingField::NextBit>; |
| 799 | using AlignmentField = AlignmentBitfieldElementT<OperationField::NextBit>; |
| 800 | static_assert(Bitfield::areContiguous<VolatileField, AtomicOrderingField, |
| 801 | OperationField, AlignmentField>(), |
| 802 | "Bitfields must be contiguous"); |
| 803 | |
| 804 | BinOp getOperation() const { return getSubclassData<OperationField>(); } |
| 805 | |
| 806 | static StringRef getOperationName(BinOp Op); |
| 807 | |
| 808 | static bool isFPOperation(BinOp Op) { |
| 809 | switch (Op) { |
| 810 | case AtomicRMWInst::FAdd: |
| 811 | case AtomicRMWInst::FSub: |
| 812 | return true; |
| 813 | default: |
| 814 | return false; |
| 815 | } |
| 816 | } |
| 817 | |
| 818 | void setOperation(BinOp Operation) { |
| 819 | setSubclassData<OperationField>(Operation); |
| 820 | } |
| 821 | |
| 822 | /// Return the alignment of the memory that is being allocated by the |
| 823 | /// instruction. |
| 824 | Align getAlign() const { |
| 825 | return Align(1ULL << getSubclassData<AlignmentField>()); |
| 826 | } |
| 827 | |
| 828 | void setAlignment(Align Align) { |
| 829 | setSubclassData<AlignmentField>(Log2(Align)); |
| 830 | } |
| 831 | |
| 832 | /// Return true if this is a RMW on a volatile memory location. |
| 833 | /// |
| 834 | bool isVolatile() const { return getSubclassData<VolatileField>(); } |
| 835 | |
| 836 | /// Specify whether this is a volatile RMW or not. |
| 837 | /// |
| 838 | void setVolatile(bool V) { setSubclassData<VolatileField>(V); } |
| 839 | |
| 840 | /// Transparently provide more efficient getOperand methods. |
| 841 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 842 | |
| 843 | /// Returns the ordering constraint of this rmw instruction. |
| 844 | AtomicOrdering getOrdering() const { |
| 845 | return getSubclassData<AtomicOrderingField>(); |
| 846 | } |
| 847 | |
| 848 | /// Sets the ordering constraint of this rmw instruction. |
| 849 | void setOrdering(AtomicOrdering Ordering) { |
| 850 | assert(Ordering != AtomicOrdering::NotAtomic &&((void)0) |
| 851 | "atomicrmw instructions can only be atomic.")((void)0); |
| 852 | setSubclassData<AtomicOrderingField>(Ordering); |
| 853 | } |
| 854 | |
| 855 | /// Returns the synchronization scope ID of this rmw instruction. |
| 856 | SyncScope::ID getSyncScopeID() const { |
| 857 | return SSID; |
| 858 | } |
| 859 | |
| 860 | /// Sets the synchronization scope ID of this rmw instruction. |
| 861 | void setSyncScopeID(SyncScope::ID SSID) { |
| 862 | this->SSID = SSID; |
| 863 | } |
| 864 | |
| 865 | Value *getPointerOperand() { return getOperand(0); } |
| 866 | const Value *getPointerOperand() const { return getOperand(0); } |
| 867 | static unsigned getPointerOperandIndex() { return 0U; } |
| 868 | |
| 869 | Value *getValOperand() { return getOperand(1); } |
| 870 | const Value *getValOperand() const { return getOperand(1); } |
| 871 | |
| 872 | /// Returns the address space of the pointer operand. |
| 873 | unsigned getPointerAddressSpace() const { |
| 874 | return getPointerOperand()->getType()->getPointerAddressSpace(); |
| 875 | } |
| 876 | |
| 877 | bool isFloatingPointOperation() const { |
| 878 | return isFPOperation(getOperation()); |
| 879 | } |
| 880 | |
| 881 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 882 | static bool classof(const Instruction *I) { |
| 883 | return I->getOpcode() == Instruction::AtomicRMW; |
| 884 | } |
| 885 | static bool classof(const Value *V) { |
| 886 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 887 | } |
| 888 | |
| 889 | private: |
| 890 | void Init(BinOp Operation, Value *Ptr, Value *Val, Align Align, |
| 891 | AtomicOrdering Ordering, SyncScope::ID SSID); |
| 892 | |
| 893 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 894 | // method so that subclasses cannot accidentally use it. |
| 895 | template <typename Bitfield> |
| 896 | void setSubclassData(typename Bitfield::Type Value) { |
| 897 | Instruction::setSubclassData<Bitfield>(Value); |
| 898 | } |
| 899 | |
| 900 | /// The synchronization scope ID of this rmw instruction. Not quite enough |
| 901 | /// room in SubClassData for everything, so synchronization scope ID gets its |
| 902 | /// own field. |
| 903 | SyncScope::ID SSID; |
| 904 | }; |
| 905 | |
| 906 | template <> |
| 907 | struct OperandTraits<AtomicRMWInst> |
| 908 | : public FixedNumOperandTraits<AtomicRMWInst,2> { |
| 909 | }; |
| 910 | |
| 911 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(AtomicRMWInst, Value)AtomicRMWInst::op_iterator AtomicRMWInst::op_begin() { return OperandTraits<AtomicRMWInst>::op_begin(this); } AtomicRMWInst ::const_op_iterator AtomicRMWInst::op_begin() const { return OperandTraits <AtomicRMWInst>::op_begin(const_cast<AtomicRMWInst*> (this)); } AtomicRMWInst::op_iterator AtomicRMWInst::op_end() { return OperandTraits<AtomicRMWInst>::op_end(this); } AtomicRMWInst::const_op_iterator AtomicRMWInst::op_end() const { return OperandTraits<AtomicRMWInst>::op_end(const_cast <AtomicRMWInst*>(this)); } Value *AtomicRMWInst::getOperand (unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<AtomicRMWInst>::op_begin(const_cast <AtomicRMWInst*>(this))[i_nocapture].get()); } void AtomicRMWInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<AtomicRMWInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned AtomicRMWInst::getNumOperands() const { return OperandTraits<AtomicRMWInst>::operands( this); } template <int Idx_nocapture> Use &AtomicRMWInst ::Op() { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &AtomicRMWInst ::Op() const { return this->OpFrom<Idx_nocapture>(this ); } |
| 912 | |
| 913 | //===----------------------------------------------------------------------===// |
| 914 | // GetElementPtrInst Class |
| 915 | //===----------------------------------------------------------------------===// |
| 916 | |
| 917 | // checkGEPType - Simple wrapper function to give a better assertion failure |
| 918 | // message on bad indexes for a gep instruction. |
| 919 | // |
| 920 | inline Type *checkGEPType(Type *Ty) { |
| 921 | assert(Ty && "Invalid GetElementPtrInst indices for type!")((void)0); |
| 922 | return Ty; |
| 923 | } |
| 924 | |
| 925 | /// an instruction for type-safe pointer arithmetic to |
| 926 | /// access elements of arrays and structs |
| 927 | /// |
| 928 | class GetElementPtrInst : public Instruction { |
| 929 | Type *SourceElementType; |
| 930 | Type *ResultElementType; |
| 931 | |
| 932 | GetElementPtrInst(const GetElementPtrInst &GEPI); |
| 933 | |
| 934 | /// Constructors - Create a getelementptr instruction with a base pointer an |
| 935 | /// list of indices. The first ctor can optionally insert before an existing |
| 936 | /// instruction, the second appends the new instruction to the specified |
| 937 | /// BasicBlock. |
| 938 | inline GetElementPtrInst(Type *PointeeType, Value *Ptr, |
| 939 | ArrayRef<Value *> IdxList, unsigned Values, |
| 940 | const Twine &NameStr, Instruction *InsertBefore); |
| 941 | inline GetElementPtrInst(Type *PointeeType, Value *Ptr, |
| 942 | ArrayRef<Value *> IdxList, unsigned Values, |
| 943 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 944 | |
| 945 | void init(Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr); |
| 946 | |
| 947 | protected: |
| 948 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 949 | friend class Instruction; |
| 950 | |
| 951 | GetElementPtrInst *cloneImpl() const; |
| 952 | |
| 953 | public: |
| 954 | static GetElementPtrInst *Create(Type *PointeeType, Value *Ptr, |
| 955 | ArrayRef<Value *> IdxList, |
| 956 | const Twine &NameStr = "", |
| 957 | Instruction *InsertBefore = nullptr) { |
| 958 | unsigned Values = 1 + unsigned(IdxList.size()); |
| 959 | assert(PointeeType && "Must specify element type")((void)0); |
| 960 | assert(cast<PointerType>(Ptr->getType()->getScalarType())((void)0) |
| 961 | ->isOpaqueOrPointeeTypeMatches(PointeeType))((void)0); |
| 962 | return new (Values) GetElementPtrInst(PointeeType, Ptr, IdxList, Values, |
| 963 | NameStr, InsertBefore); |
| 964 | } |
| 965 | |
| 966 | static GetElementPtrInst *Create(Type *PointeeType, Value *Ptr, |
| 967 | ArrayRef<Value *> IdxList, |
| 968 | const Twine &NameStr, |
| 969 | BasicBlock *InsertAtEnd) { |
| 970 | unsigned Values = 1 + unsigned(IdxList.size()); |
| 971 | assert(PointeeType && "Must specify element type")((void)0); |
| 972 | assert(cast<PointerType>(Ptr->getType()->getScalarType())((void)0) |
| 973 | ->isOpaqueOrPointeeTypeMatches(PointeeType))((void)0); |
| 974 | return new (Values) GetElementPtrInst(PointeeType, Ptr, IdxList, Values, |
| 975 | NameStr, InsertAtEnd); |
| 976 | } |
| 977 | |
| 978 | LLVM_ATTRIBUTE_DEPRECATED(static GetElementPtrInst *CreateInBounds([[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr = "", Instruction *InsertBefore = nullptr) |
| 979 | Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr = "",[[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr = "", Instruction *InsertBefore = nullptr) |
| 980 | Instruction *InsertBefore = nullptr),[[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr = "", Instruction *InsertBefore = nullptr) |
| 981 | "Use the version with explicit element type instead")[[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr = "", Instruction *InsertBefore = nullptr) { |
| 982 | return CreateInBounds( |
| 983 | Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, IdxList, |
| 984 | NameStr, InsertBefore); |
| 985 | } |
| 986 | |
| 987 | /// Create an "inbounds" getelementptr. See the documentation for the |
| 988 | /// "inbounds" flag in LangRef.html for details. |
| 989 | static GetElementPtrInst * |
| 990 | CreateInBounds(Type *PointeeType, Value *Ptr, ArrayRef<Value *> IdxList, |
| 991 | const Twine &NameStr = "", |
| 992 | Instruction *InsertBefore = nullptr) { |
| 993 | GetElementPtrInst *GEP = |
| 994 | Create(PointeeType, Ptr, IdxList, NameStr, InsertBefore); |
| 995 | GEP->setIsInBounds(true); |
| 996 | return GEP; |
| 997 | } |
| 998 | |
| 999 | LLVM_ATTRIBUTE_DEPRECATED(static GetElementPtrInst *CreateInBounds([[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr, BasicBlock *InsertAtEnd) |
| 1000 | Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr,[[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr, BasicBlock *InsertAtEnd) |
| 1001 | BasicBlock *InsertAtEnd),[[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr, BasicBlock *InsertAtEnd) |
| 1002 | "Use the version with explicit element type instead")[[deprecated("Use the version with explicit element type instead" )]] static GetElementPtrInst *CreateInBounds( Value *Ptr, ArrayRef <Value *> IdxList, const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 1003 | return CreateInBounds( |
| 1004 | Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, IdxList, |
| 1005 | NameStr, InsertAtEnd); |
| 1006 | } |
| 1007 | |
| 1008 | static GetElementPtrInst *CreateInBounds(Type *PointeeType, Value *Ptr, |
| 1009 | ArrayRef<Value *> IdxList, |
| 1010 | const Twine &NameStr, |
| 1011 | BasicBlock *InsertAtEnd) { |
| 1012 | GetElementPtrInst *GEP = |
| 1013 | Create(PointeeType, Ptr, IdxList, NameStr, InsertAtEnd); |
| 1014 | GEP->setIsInBounds(true); |
| 1015 | return GEP; |
| 1016 | } |
| 1017 | |
| 1018 | /// Transparently provide more efficient getOperand methods. |
| 1019 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 1020 | |
| 1021 | Type *getSourceElementType() const { return SourceElementType; } |
| 1022 | |
| 1023 | void setSourceElementType(Type *Ty) { SourceElementType = Ty; } |
| 1024 | void setResultElementType(Type *Ty) { ResultElementType = Ty; } |
| 1025 | |
| 1026 | Type *getResultElementType() const { |
| 1027 | assert(cast<PointerType>(getType()->getScalarType())((void)0) |
| 1028 | ->isOpaqueOrPointeeTypeMatches(ResultElementType))((void)0); |
| 1029 | return ResultElementType; |
| 1030 | } |
| 1031 | |
| 1032 | /// Returns the address space of this instruction's pointer type. |
| 1033 | unsigned getAddressSpace() const { |
| 1034 | // Note that this is always the same as the pointer operand's address space |
| 1035 | // and that is cheaper to compute, so cheat here. |
| 1036 | return getPointerAddressSpace(); |
| 1037 | } |
| 1038 | |
| 1039 | /// Returns the result type of a getelementptr with the given source |
| 1040 | /// element type and indexes. |
| 1041 | /// |
| 1042 | /// Null is returned if the indices are invalid for the specified |
| 1043 | /// source element type. |
| 1044 | static Type *getIndexedType(Type *Ty, ArrayRef<Value *> IdxList); |
| 1045 | static Type *getIndexedType(Type *Ty, ArrayRef<Constant *> IdxList); |
| 1046 | static Type *getIndexedType(Type *Ty, ArrayRef<uint64_t> IdxList); |
| 1047 | |
| 1048 | /// Return the type of the element at the given index of an indexable |
| 1049 | /// type. This is equivalent to "getIndexedType(Agg, {Zero, Idx})". |
| 1050 | /// |
| 1051 | /// Returns null if the type can't be indexed, or the given index is not |
| 1052 | /// legal for the given type. |
| 1053 | static Type *getTypeAtIndex(Type *Ty, Value *Idx); |
| 1054 | static Type *getTypeAtIndex(Type *Ty, uint64_t Idx); |
| 1055 | |
| 1056 | inline op_iterator idx_begin() { return op_begin()+1; } |
| 1057 | inline const_op_iterator idx_begin() const { return op_begin()+1; } |
| 1058 | inline op_iterator idx_end() { return op_end(); } |
| 1059 | inline const_op_iterator idx_end() const { return op_end(); } |
| 1060 | |
| 1061 | inline iterator_range<op_iterator> indices() { |
| 1062 | return make_range(idx_begin(), idx_end()); |
| 1063 | } |
| 1064 | |
| 1065 | inline iterator_range<const_op_iterator> indices() const { |
| 1066 | return make_range(idx_begin(), idx_end()); |
| 1067 | } |
| 1068 | |
| 1069 | Value *getPointerOperand() { |
| 1070 | return getOperand(0); |
| 1071 | } |
| 1072 | const Value *getPointerOperand() const { |
| 1073 | return getOperand(0); |
| 1074 | } |
| 1075 | static unsigned getPointerOperandIndex() { |
| 1076 | return 0U; // get index for modifying correct operand. |
| 1077 | } |
| 1078 | |
| 1079 | /// Method to return the pointer operand as a |
| 1080 | /// PointerType. |
| 1081 | Type *getPointerOperandType() const { |
| 1082 | return getPointerOperand()->getType(); |
| 1083 | } |
| 1084 | |
| 1085 | /// Returns the address space of the pointer operand. |
| 1086 | unsigned getPointerAddressSpace() const { |
| 1087 | return getPointerOperandType()->getPointerAddressSpace(); |
| 1088 | } |
| 1089 | |
| 1090 | /// Returns the pointer type returned by the GEP |
| 1091 | /// instruction, which may be a vector of pointers. |
| 1092 | static Type *getGEPReturnType(Type *ElTy, Value *Ptr, |
| 1093 | ArrayRef<Value *> IdxList) { |
| 1094 | PointerType *OrigPtrTy = cast<PointerType>(Ptr->getType()->getScalarType()); |
| 1095 | unsigned AddrSpace = OrigPtrTy->getAddressSpace(); |
| 1096 | Type *ResultElemTy = checkGEPType(getIndexedType(ElTy, IdxList)); |
| 1097 | Type *PtrTy = OrigPtrTy->isOpaque() |
| 1098 | ? PointerType::get(OrigPtrTy->getContext(), AddrSpace) |
| 1099 | : PointerType::get(ResultElemTy, AddrSpace); |
| 1100 | // Vector GEP |
| 1101 | if (auto *PtrVTy = dyn_cast<VectorType>(Ptr->getType())) { |
| 1102 | ElementCount EltCount = PtrVTy->getElementCount(); |
| 1103 | return VectorType::get(PtrTy, EltCount); |
| 1104 | } |
| 1105 | for (Value *Index : IdxList) |
| 1106 | if (auto *IndexVTy = dyn_cast<VectorType>(Index->getType())) { |
| 1107 | ElementCount EltCount = IndexVTy->getElementCount(); |
| 1108 | return VectorType::get(PtrTy, EltCount); |
| 1109 | } |
| 1110 | // Scalar GEP |
| 1111 | return PtrTy; |
| 1112 | } |
| 1113 | |
| 1114 | unsigned getNumIndices() const { // Note: always non-negative |
| 1115 | return getNumOperands() - 1; |
| 1116 | } |
| 1117 | |
| 1118 | bool hasIndices() const { |
| 1119 | return getNumOperands() > 1; |
| 1120 | } |
| 1121 | |
| 1122 | /// Return true if all of the indices of this GEP are |
| 1123 | /// zeros. If so, the result pointer and the first operand have the same |
| 1124 | /// value, just potentially different types. |
| 1125 | bool hasAllZeroIndices() const; |
| 1126 | |
| 1127 | /// Return true if all of the indices of this GEP are |
| 1128 | /// constant integers. If so, the result pointer and the first operand have |
| 1129 | /// a constant offset between them. |
| 1130 | bool hasAllConstantIndices() const; |
| 1131 | |
| 1132 | /// Set or clear the inbounds flag on this GEP instruction. |
| 1133 | /// See LangRef.html for the meaning of inbounds on a getelementptr. |
| 1134 | void setIsInBounds(bool b = true); |
| 1135 | |
| 1136 | /// Determine whether the GEP has the inbounds flag. |
| 1137 | bool isInBounds() const; |
| 1138 | |
| 1139 | /// Accumulate the constant address offset of this GEP if possible. |
| 1140 | /// |
| 1141 | /// This routine accepts an APInt into which it will accumulate the constant |
| 1142 | /// offset of this GEP if the GEP is in fact constant. If the GEP is not |
| 1143 | /// all-constant, it returns false and the value of the offset APInt is |
| 1144 | /// undefined (it is *not* preserved!). The APInt passed into this routine |
| 1145 | /// must be at least as wide as the IntPtr type for the address space of |
| 1146 | /// the base GEP pointer. |
| 1147 | bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const; |
| 1148 | bool collectOffset(const DataLayout &DL, unsigned BitWidth, |
| 1149 | MapVector<Value *, APInt> &VariableOffsets, |
| 1150 | APInt &ConstantOffset) const; |
| 1151 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1152 | static bool classof(const Instruction *I) { |
| 1153 | return (I->getOpcode() == Instruction::GetElementPtr); |
| 1154 | } |
| 1155 | static bool classof(const Value *V) { |
| 1156 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1157 | } |
| 1158 | }; |
| 1159 | |
| 1160 | template <> |
| 1161 | struct OperandTraits<GetElementPtrInst> : |
| 1162 | public VariadicOperandTraits<GetElementPtrInst, 1> { |
| 1163 | }; |
| 1164 | |
| 1165 | GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr, |
| 1166 | ArrayRef<Value *> IdxList, unsigned Values, |
| 1167 | const Twine &NameStr, |
| 1168 | Instruction *InsertBefore) |
| 1169 | : Instruction(getGEPReturnType(PointeeType, Ptr, IdxList), GetElementPtr, |
| 1170 | OperandTraits<GetElementPtrInst>::op_end(this) - Values, |
| 1171 | Values, InsertBefore), |
| 1172 | SourceElementType(PointeeType), |
| 1173 | ResultElementType(getIndexedType(PointeeType, IdxList)) { |
| 1174 | assert(cast<PointerType>(getType()->getScalarType())((void)0) |
| 1175 | ->isOpaqueOrPointeeTypeMatches(ResultElementType))((void)0); |
| 1176 | init(Ptr, IdxList, NameStr); |
| 1177 | } |
| 1178 | |
| 1179 | GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr, |
| 1180 | ArrayRef<Value *> IdxList, unsigned Values, |
| 1181 | const Twine &NameStr, |
| 1182 | BasicBlock *InsertAtEnd) |
| 1183 | : Instruction(getGEPReturnType(PointeeType, Ptr, IdxList), GetElementPtr, |
| 1184 | OperandTraits<GetElementPtrInst>::op_end(this) - Values, |
| 1185 | Values, InsertAtEnd), |
| 1186 | SourceElementType(PointeeType), |
| 1187 | ResultElementType(getIndexedType(PointeeType, IdxList)) { |
| 1188 | assert(cast<PointerType>(getType()->getScalarType())((void)0) |
| 1189 | ->isOpaqueOrPointeeTypeMatches(ResultElementType))((void)0); |
| 1190 | init(Ptr, IdxList, NameStr); |
| 1191 | } |
| 1192 | |
| 1193 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetElementPtrInst, Value)GetElementPtrInst::op_iterator GetElementPtrInst::op_begin() { return OperandTraits<GetElementPtrInst>::op_begin(this ); } GetElementPtrInst::const_op_iterator GetElementPtrInst:: op_begin() const { return OperandTraits<GetElementPtrInst> ::op_begin(const_cast<GetElementPtrInst*>(this)); } GetElementPtrInst ::op_iterator GetElementPtrInst::op_end() { return OperandTraits <GetElementPtrInst>::op_end(this); } GetElementPtrInst:: const_op_iterator GetElementPtrInst::op_end() const { return OperandTraits <GetElementPtrInst>::op_end(const_cast<GetElementPtrInst *>(this)); } Value *GetElementPtrInst::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null<Value >( OperandTraits<GetElementPtrInst>::op_begin(const_cast <GetElementPtrInst*>(this))[i_nocapture].get()); } void GetElementPtrInst::setOperand(unsigned i_nocapture, Value *Val_nocapture ) { ((void)0); OperandTraits<GetElementPtrInst>::op_begin (this)[i_nocapture] = Val_nocapture; } unsigned GetElementPtrInst ::getNumOperands() const { return OperandTraits<GetElementPtrInst >::operands(this); } template <int Idx_nocapture> Use &GetElementPtrInst::Op() { return this->OpFrom<Idx_nocapture >(this); } template <int Idx_nocapture> const Use & GetElementPtrInst::Op() const { return this->OpFrom<Idx_nocapture >(this); } |
| 1194 | |
| 1195 | //===----------------------------------------------------------------------===// |
| 1196 | // ICmpInst Class |
| 1197 | //===----------------------------------------------------------------------===// |
| 1198 | |
| 1199 | /// This instruction compares its operands according to the predicate given |
| 1200 | /// to the constructor. It only operates on integers or pointers. The operands |
| 1201 | /// must be identical types. |
| 1202 | /// Represent an integer comparison operator. |
| 1203 | class ICmpInst: public CmpInst { |
| 1204 | void AssertOK() { |
| 1205 | assert(isIntPredicate() &&((void)0) |
| 1206 | "Invalid ICmp predicate value")((void)0); |
| 1207 | assert(getOperand(0)->getType() == getOperand(1)->getType() &&((void)0) |
| 1208 | "Both operands to ICmp instruction are not of the same type!")((void)0); |
| 1209 | // Check that the operands are the right type |
| 1210 | assert((getOperand(0)->getType()->isIntOrIntVectorTy() ||((void)0) |
| 1211 | getOperand(0)->getType()->isPtrOrPtrVectorTy()) &&((void)0) |
| 1212 | "Invalid operand types for ICmp instruction")((void)0); |
| 1213 | } |
| 1214 | |
| 1215 | protected: |
| 1216 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1217 | friend class Instruction; |
| 1218 | |
| 1219 | /// Clone an identical ICmpInst |
| 1220 | ICmpInst *cloneImpl() const; |
| 1221 | |
| 1222 | public: |
| 1223 | /// Constructor with insert-before-instruction semantics. |
| 1224 | ICmpInst( |
| 1225 | Instruction *InsertBefore, ///< Where to insert |
| 1226 | Predicate pred, ///< The predicate to use for the comparison |
| 1227 | Value *LHS, ///< The left-hand-side of the expression |
| 1228 | Value *RHS, ///< The right-hand-side of the expression |
| 1229 | const Twine &NameStr = "" ///< Name of the instruction |
| 1230 | ) : CmpInst(makeCmpResultType(LHS->getType()), |
| 1231 | Instruction::ICmp, pred, LHS, RHS, NameStr, |
| 1232 | InsertBefore) { |
| 1233 | #ifndef NDEBUG1 |
| 1234 | AssertOK(); |
| 1235 | #endif |
| 1236 | } |
| 1237 | |
| 1238 | /// Constructor with insert-at-end semantics. |
| 1239 | ICmpInst( |
| 1240 | BasicBlock &InsertAtEnd, ///< Block to insert into. |
| 1241 | Predicate pred, ///< The predicate to use for the comparison |
| 1242 | Value *LHS, ///< The left-hand-side of the expression |
| 1243 | Value *RHS, ///< The right-hand-side of the expression |
| 1244 | const Twine &NameStr = "" ///< Name of the instruction |
| 1245 | ) : CmpInst(makeCmpResultType(LHS->getType()), |
| 1246 | Instruction::ICmp, pred, LHS, RHS, NameStr, |
| 1247 | &InsertAtEnd) { |
| 1248 | #ifndef NDEBUG1 |
| 1249 | AssertOK(); |
| 1250 | #endif |
| 1251 | } |
| 1252 | |
| 1253 | /// Constructor with no-insertion semantics |
| 1254 | ICmpInst( |
| 1255 | Predicate pred, ///< The predicate to use for the comparison |
| 1256 | Value *LHS, ///< The left-hand-side of the expression |
| 1257 | Value *RHS, ///< The right-hand-side of the expression |
| 1258 | const Twine &NameStr = "" ///< Name of the instruction |
| 1259 | ) : CmpInst(makeCmpResultType(LHS->getType()), |
| 1260 | Instruction::ICmp, pred, LHS, RHS, NameStr) { |
| 1261 | #ifndef NDEBUG1 |
| 1262 | AssertOK(); |
| 1263 | #endif |
| 1264 | } |
| 1265 | |
| 1266 | /// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc. |
| 1267 | /// @returns the predicate that would be the result if the operand were |
| 1268 | /// regarded as signed. |
| 1269 | /// Return the signed version of the predicate |
| 1270 | Predicate getSignedPredicate() const { |
| 1271 | return getSignedPredicate(getPredicate()); |
| 1272 | } |
| 1273 | |
| 1274 | /// This is a static version that you can use without an instruction. |
| 1275 | /// Return the signed version of the predicate. |
| 1276 | static Predicate getSignedPredicate(Predicate pred); |
| 1277 | |
| 1278 | /// For example, EQ->EQ, SLE->ULE, UGT->UGT, etc. |
| 1279 | /// @returns the predicate that would be the result if the operand were |
| 1280 | /// regarded as unsigned. |
| 1281 | /// Return the unsigned version of the predicate |
| 1282 | Predicate getUnsignedPredicate() const { |
| 1283 | return getUnsignedPredicate(getPredicate()); |
| 1284 | } |
| 1285 | |
| 1286 | /// This is a static version that you can use without an instruction. |
| 1287 | /// Return the unsigned version of the predicate. |
| 1288 | static Predicate getUnsignedPredicate(Predicate pred); |
| 1289 | |
| 1290 | /// Return true if this predicate is either EQ or NE. This also |
| 1291 | /// tests for commutativity. |
| 1292 | static bool isEquality(Predicate P) { |
| 1293 | return P == ICMP_EQ || P == ICMP_NE; |
| 1294 | } |
| 1295 | |
| 1296 | /// Return true if this predicate is either EQ or NE. This also |
| 1297 | /// tests for commutativity. |
| 1298 | bool isEquality() const { |
| 1299 | return isEquality(getPredicate()); |
| 1300 | } |
| 1301 | |
| 1302 | /// @returns true if the predicate of this ICmpInst is commutative |
| 1303 | /// Determine if this relation is commutative. |
| 1304 | bool isCommutative() const { return isEquality(); } |
| 1305 | |
| 1306 | /// Return true if the predicate is relational (not EQ or NE). |
| 1307 | /// |
| 1308 | bool isRelational() const { |
| 1309 | return !isEquality(); |
| 1310 | } |
| 1311 | |
| 1312 | /// Return true if the predicate is relational (not EQ or NE). |
| 1313 | /// |
| 1314 | static bool isRelational(Predicate P) { |
| 1315 | return !isEquality(P); |
| 1316 | } |
| 1317 | |
| 1318 | /// Return true if the predicate is SGT or UGT. |
| 1319 | /// |
| 1320 | static bool isGT(Predicate P) { |
| 1321 | return P == ICMP_SGT || P == ICMP_UGT; |
| 1322 | } |
| 1323 | |
| 1324 | /// Return true if the predicate is SLT or ULT. |
| 1325 | /// |
| 1326 | static bool isLT(Predicate P) { |
| 1327 | return P == ICMP_SLT || P == ICMP_ULT; |
| 1328 | } |
| 1329 | |
| 1330 | /// Return true if the predicate is SGE or UGE. |
| 1331 | /// |
| 1332 | static bool isGE(Predicate P) { |
| 1333 | return P == ICMP_SGE || P == ICMP_UGE; |
| 1334 | } |
| 1335 | |
| 1336 | /// Return true if the predicate is SLE or ULE. |
| 1337 | /// |
| 1338 | static bool isLE(Predicate P) { |
| 1339 | return P == ICMP_SLE || P == ICMP_ULE; |
| 1340 | } |
| 1341 | |
| 1342 | /// Exchange the two operands to this instruction in such a way that it does |
| 1343 | /// not modify the semantics of the instruction. The predicate value may be |
| 1344 | /// changed to retain the same result if the predicate is order dependent |
| 1345 | /// (e.g. ult). |
| 1346 | /// Swap operands and adjust predicate. |
| 1347 | void swapOperands() { |
| 1348 | setPredicate(getSwappedPredicate()); |
| 1349 | Op<0>().swap(Op<1>()); |
| 1350 | } |
| 1351 | |
| 1352 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1353 | static bool classof(const Instruction *I) { |
| 1354 | return I->getOpcode() == Instruction::ICmp; |
| 1355 | } |
| 1356 | static bool classof(const Value *V) { |
| 1357 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1358 | } |
| 1359 | }; |
| 1360 | |
| 1361 | //===----------------------------------------------------------------------===// |
| 1362 | // FCmpInst Class |
| 1363 | //===----------------------------------------------------------------------===// |
| 1364 | |
| 1365 | /// This instruction compares its operands according to the predicate given |
| 1366 | /// to the constructor. It only operates on floating point values or packed |
| 1367 | /// vectors of floating point values. The operands must be identical types. |
| 1368 | /// Represents a floating point comparison operator. |
| 1369 | class FCmpInst: public CmpInst { |
| 1370 | void AssertOK() { |
| 1371 | assert(isFPPredicate() && "Invalid FCmp predicate value")((void)0); |
| 1372 | assert(getOperand(0)->getType() == getOperand(1)->getType() &&((void)0) |
| 1373 | "Both operands to FCmp instruction are not of the same type!")((void)0); |
| 1374 | // Check that the operands are the right type |
| 1375 | assert(getOperand(0)->getType()->isFPOrFPVectorTy() &&((void)0) |
| 1376 | "Invalid operand types for FCmp instruction")((void)0); |
| 1377 | } |
| 1378 | |
| 1379 | protected: |
| 1380 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1381 | friend class Instruction; |
| 1382 | |
| 1383 | /// Clone an identical FCmpInst |
| 1384 | FCmpInst *cloneImpl() const; |
| 1385 | |
| 1386 | public: |
| 1387 | /// Constructor with insert-before-instruction semantics. |
| 1388 | FCmpInst( |
| 1389 | Instruction *InsertBefore, ///< Where to insert |
| 1390 | Predicate pred, ///< The predicate to use for the comparison |
| 1391 | Value *LHS, ///< The left-hand-side of the expression |
| 1392 | Value *RHS, ///< The right-hand-side of the expression |
| 1393 | const Twine &NameStr = "" ///< Name of the instruction |
| 1394 | ) : CmpInst(makeCmpResultType(LHS->getType()), |
| 1395 | Instruction::FCmp, pred, LHS, RHS, NameStr, |
| 1396 | InsertBefore) { |
| 1397 | AssertOK(); |
| 1398 | } |
| 1399 | |
| 1400 | /// Constructor with insert-at-end semantics. |
| 1401 | FCmpInst( |
| 1402 | BasicBlock &InsertAtEnd, ///< Block to insert into. |
| 1403 | Predicate pred, ///< The predicate to use for the comparison |
| 1404 | Value *LHS, ///< The left-hand-side of the expression |
| 1405 | Value *RHS, ///< The right-hand-side of the expression |
| 1406 | const Twine &NameStr = "" ///< Name of the instruction |
| 1407 | ) : CmpInst(makeCmpResultType(LHS->getType()), |
| 1408 | Instruction::FCmp, pred, LHS, RHS, NameStr, |
| 1409 | &InsertAtEnd) { |
| 1410 | AssertOK(); |
| 1411 | } |
| 1412 | |
| 1413 | /// Constructor with no-insertion semantics |
| 1414 | FCmpInst( |
| 1415 | Predicate Pred, ///< The predicate to use for the comparison |
| 1416 | Value *LHS, ///< The left-hand-side of the expression |
| 1417 | Value *RHS, ///< The right-hand-side of the expression |
| 1418 | const Twine &NameStr = "", ///< Name of the instruction |
| 1419 | Instruction *FlagsSource = nullptr |
| 1420 | ) : CmpInst(makeCmpResultType(LHS->getType()), Instruction::FCmp, Pred, LHS, |
| 1421 | RHS, NameStr, nullptr, FlagsSource) { |
| 1422 | AssertOK(); |
| 1423 | } |
| 1424 | |
| 1425 | /// @returns true if the predicate of this instruction is EQ or NE. |
| 1426 | /// Determine if this is an equality predicate. |
| 1427 | static bool isEquality(Predicate Pred) { |
| 1428 | return Pred == FCMP_OEQ || Pred == FCMP_ONE || Pred == FCMP_UEQ || |
| 1429 | Pred == FCMP_UNE; |
| 1430 | } |
| 1431 | |
| 1432 | /// @returns true if the predicate of this instruction is EQ or NE. |
| 1433 | /// Determine if this is an equality predicate. |
| 1434 | bool isEquality() const { return isEquality(getPredicate()); } |
| 1435 | |
| 1436 | /// @returns true if the predicate of this instruction is commutative. |
| 1437 | /// Determine if this is a commutative predicate. |
| 1438 | bool isCommutative() const { |
| 1439 | return isEquality() || |
| 1440 | getPredicate() == FCMP_FALSE || |
| 1441 | getPredicate() == FCMP_TRUE || |
| 1442 | getPredicate() == FCMP_ORD || |
| 1443 | getPredicate() == FCMP_UNO; |
| 1444 | } |
| 1445 | |
| 1446 | /// @returns true if the predicate is relational (not EQ or NE). |
| 1447 | /// Determine if this a relational predicate. |
| 1448 | bool isRelational() const { return !isEquality(); } |
| 1449 | |
| 1450 | /// Exchange the two operands to this instruction in such a way that it does |
| 1451 | /// not modify the semantics of the instruction. The predicate value may be |
| 1452 | /// changed to retain the same result if the predicate is order dependent |
| 1453 | /// (e.g. ult). |
| 1454 | /// Swap operands and adjust predicate. |
| 1455 | void swapOperands() { |
| 1456 | setPredicate(getSwappedPredicate()); |
| 1457 | Op<0>().swap(Op<1>()); |
| 1458 | } |
| 1459 | |
| 1460 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1461 | static bool classof(const Instruction *I) { |
| 1462 | return I->getOpcode() == Instruction::FCmp; |
| 1463 | } |
| 1464 | static bool classof(const Value *V) { |
| 1465 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1466 | } |
| 1467 | }; |
| 1468 | |
| 1469 | //===----------------------------------------------------------------------===// |
| 1470 | /// This class represents a function call, abstracting a target |
| 1471 | /// machine's calling convention. This class uses low bit of the SubClassData |
| 1472 | /// field to indicate whether or not this is a tail call. The rest of the bits |
| 1473 | /// hold the calling convention of the call. |
| 1474 | /// |
| 1475 | class CallInst : public CallBase { |
| 1476 | CallInst(const CallInst &CI); |
| 1477 | |
| 1478 | /// Construct a CallInst given a range of arguments. |
| 1479 | /// Construct a CallInst from a range of arguments |
| 1480 | inline CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1481 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr, |
| 1482 | Instruction *InsertBefore); |
| 1483 | |
| 1484 | inline CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1485 | const Twine &NameStr, Instruction *InsertBefore) |
| 1486 | : CallInst(Ty, Func, Args, None, NameStr, InsertBefore) {} |
| 1487 | |
| 1488 | /// Construct a CallInst given a range of arguments. |
| 1489 | /// Construct a CallInst from a range of arguments |
| 1490 | inline CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1491 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr, |
| 1492 | BasicBlock *InsertAtEnd); |
| 1493 | |
| 1494 | explicit CallInst(FunctionType *Ty, Value *F, const Twine &NameStr, |
| 1495 | Instruction *InsertBefore); |
| 1496 | |
| 1497 | CallInst(FunctionType *ty, Value *F, const Twine &NameStr, |
| 1498 | BasicBlock *InsertAtEnd); |
| 1499 | |
| 1500 | void init(FunctionType *FTy, Value *Func, ArrayRef<Value *> Args, |
| 1501 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr); |
| 1502 | void init(FunctionType *FTy, Value *Func, const Twine &NameStr); |
| 1503 | |
| 1504 | /// Compute the number of operands to allocate. |
| 1505 | static int ComputeNumOperands(int NumArgs, int NumBundleInputs = 0) { |
| 1506 | // We need one operand for the called function, plus the input operand |
| 1507 | // counts provided. |
| 1508 | return 1 + NumArgs + NumBundleInputs; |
| 1509 | } |
| 1510 | |
| 1511 | protected: |
| 1512 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1513 | friend class Instruction; |
| 1514 | |
| 1515 | CallInst *cloneImpl() const; |
| 1516 | |
| 1517 | public: |
| 1518 | static CallInst *Create(FunctionType *Ty, Value *F, const Twine &NameStr = "", |
| 1519 | Instruction *InsertBefore = nullptr) { |
| 1520 | return new (ComputeNumOperands(0)) CallInst(Ty, F, NameStr, InsertBefore); |
| 1521 | } |
| 1522 | |
| 1523 | static CallInst *Create(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1524 | const Twine &NameStr, |
| 1525 | Instruction *InsertBefore = nullptr) { |
| 1526 | return new (ComputeNumOperands(Args.size())) |
| 1527 | CallInst(Ty, Func, Args, None, NameStr, InsertBefore); |
| 1528 | } |
| 1529 | |
| 1530 | static CallInst *Create(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1531 | ArrayRef<OperandBundleDef> Bundles = None, |
| 1532 | const Twine &NameStr = "", |
| 1533 | Instruction *InsertBefore = nullptr) { |
| 1534 | const int NumOperands = |
| 1535 | ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)); |
| 1536 | const unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); |
| 1537 | |
| 1538 | return new (NumOperands, DescriptorBytes) |
| 1539 | CallInst(Ty, Func, Args, Bundles, NameStr, InsertBefore); |
| 1540 | } |
| 1541 | |
| 1542 | static CallInst *Create(FunctionType *Ty, Value *F, const Twine &NameStr, |
| 1543 | BasicBlock *InsertAtEnd) { |
| 1544 | return new (ComputeNumOperands(0)) CallInst(Ty, F, NameStr, InsertAtEnd); |
| 1545 | } |
| 1546 | |
| 1547 | static CallInst *Create(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1548 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 1549 | return new (ComputeNumOperands(Args.size())) |
| 1550 | CallInst(Ty, Func, Args, None, NameStr, InsertAtEnd); |
| 1551 | } |
| 1552 | |
| 1553 | static CallInst *Create(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1554 | ArrayRef<OperandBundleDef> Bundles, |
| 1555 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 1556 | const int NumOperands = |
| 1557 | ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)); |
| 1558 | const unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); |
| 1559 | |
| 1560 | return new (NumOperands, DescriptorBytes) |
| 1561 | CallInst(Ty, Func, Args, Bundles, NameStr, InsertAtEnd); |
| 1562 | } |
| 1563 | |
| 1564 | static CallInst *Create(FunctionCallee Func, const Twine &NameStr = "", |
| 1565 | Instruction *InsertBefore = nullptr) { |
| 1566 | return Create(Func.getFunctionType(), Func.getCallee(), NameStr, |
| 1567 | InsertBefore); |
| 1568 | } |
| 1569 | |
| 1570 | static CallInst *Create(FunctionCallee Func, ArrayRef<Value *> Args, |
| 1571 | ArrayRef<OperandBundleDef> Bundles = None, |
| 1572 | const Twine &NameStr = "", |
| 1573 | Instruction *InsertBefore = nullptr) { |
| 1574 | return Create(Func.getFunctionType(), Func.getCallee(), Args, Bundles, |
| 1575 | NameStr, InsertBefore); |
| 1576 | } |
| 1577 | |
| 1578 | static CallInst *Create(FunctionCallee Func, ArrayRef<Value *> Args, |
| 1579 | const Twine &NameStr, |
| 1580 | Instruction *InsertBefore = nullptr) { |
| 1581 | return Create(Func.getFunctionType(), Func.getCallee(), Args, NameStr, |
| 1582 | InsertBefore); |
| 1583 | } |
| 1584 | |
| 1585 | static CallInst *Create(FunctionCallee Func, const Twine &NameStr, |
| 1586 | BasicBlock *InsertAtEnd) { |
| 1587 | return Create(Func.getFunctionType(), Func.getCallee(), NameStr, |
| 1588 | InsertAtEnd); |
| 1589 | } |
| 1590 | |
| 1591 | static CallInst *Create(FunctionCallee Func, ArrayRef<Value *> Args, |
| 1592 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 1593 | return Create(Func.getFunctionType(), Func.getCallee(), Args, NameStr, |
| 1594 | InsertAtEnd); |
| 1595 | } |
| 1596 | |
| 1597 | static CallInst *Create(FunctionCallee Func, ArrayRef<Value *> Args, |
| 1598 | ArrayRef<OperandBundleDef> Bundles, |
| 1599 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 1600 | return Create(Func.getFunctionType(), Func.getCallee(), Args, Bundles, |
| 1601 | NameStr, InsertAtEnd); |
| 1602 | } |
| 1603 | |
| 1604 | /// Create a clone of \p CI with a different set of operand bundles and |
| 1605 | /// insert it before \p InsertPt. |
| 1606 | /// |
| 1607 | /// The returned call instruction is identical \p CI in every way except that |
| 1608 | /// the operand bundles for the new instruction are set to the operand bundles |
| 1609 | /// in \p Bundles. |
| 1610 | static CallInst *Create(CallInst *CI, ArrayRef<OperandBundleDef> Bundles, |
| 1611 | Instruction *InsertPt = nullptr); |
| 1612 | |
| 1613 | /// Generate the IR for a call to malloc: |
| 1614 | /// 1. Compute the malloc call's argument as the specified type's size, |
| 1615 | /// possibly multiplied by the array size if the array size is not |
| 1616 | /// constant 1. |
| 1617 | /// 2. Call malloc with that argument. |
| 1618 | /// 3. Bitcast the result of the malloc call to the specified type. |
| 1619 | static Instruction *CreateMalloc(Instruction *InsertBefore, Type *IntPtrTy, |
| 1620 | Type *AllocTy, Value *AllocSize, |
| 1621 | Value *ArraySize = nullptr, |
| 1622 | Function *MallocF = nullptr, |
| 1623 | const Twine &Name = ""); |
| 1624 | static Instruction *CreateMalloc(BasicBlock *InsertAtEnd, Type *IntPtrTy, |
| 1625 | Type *AllocTy, Value *AllocSize, |
| 1626 | Value *ArraySize = nullptr, |
| 1627 | Function *MallocF = nullptr, |
| 1628 | const Twine &Name = ""); |
| 1629 | static Instruction *CreateMalloc(Instruction *InsertBefore, Type *IntPtrTy, |
| 1630 | Type *AllocTy, Value *AllocSize, |
| 1631 | Value *ArraySize = nullptr, |
| 1632 | ArrayRef<OperandBundleDef> Bundles = None, |
| 1633 | Function *MallocF = nullptr, |
| 1634 | const Twine &Name = ""); |
| 1635 | static Instruction *CreateMalloc(BasicBlock *InsertAtEnd, Type *IntPtrTy, |
| 1636 | Type *AllocTy, Value *AllocSize, |
| 1637 | Value *ArraySize = nullptr, |
| 1638 | ArrayRef<OperandBundleDef> Bundles = None, |
| 1639 | Function *MallocF = nullptr, |
| 1640 | const Twine &Name = ""); |
| 1641 | /// Generate the IR for a call to the builtin free function. |
| 1642 | static Instruction *CreateFree(Value *Source, Instruction *InsertBefore); |
| 1643 | static Instruction *CreateFree(Value *Source, BasicBlock *InsertAtEnd); |
| 1644 | static Instruction *CreateFree(Value *Source, |
| 1645 | ArrayRef<OperandBundleDef> Bundles, |
| 1646 | Instruction *InsertBefore); |
| 1647 | static Instruction *CreateFree(Value *Source, |
| 1648 | ArrayRef<OperandBundleDef> Bundles, |
| 1649 | BasicBlock *InsertAtEnd); |
| 1650 | |
| 1651 | // Note that 'musttail' implies 'tail'. |
| 1652 | enum TailCallKind : unsigned { |
| 1653 | TCK_None = 0, |
| 1654 | TCK_Tail = 1, |
| 1655 | TCK_MustTail = 2, |
| 1656 | TCK_NoTail = 3, |
| 1657 | TCK_LAST = TCK_NoTail |
| 1658 | }; |
| 1659 | |
| 1660 | using TailCallKindField = Bitfield::Element<TailCallKind, 0, 2, TCK_LAST>; |
| 1661 | static_assert( |
| 1662 | Bitfield::areContiguous<TailCallKindField, CallBase::CallingConvField>(), |
| 1663 | "Bitfields must be contiguous"); |
| 1664 | |
| 1665 | TailCallKind getTailCallKind() const { |
| 1666 | return getSubclassData<TailCallKindField>(); |
| 1667 | } |
| 1668 | |
| 1669 | bool isTailCall() const { |
| 1670 | TailCallKind Kind = getTailCallKind(); |
| 1671 | return Kind == TCK_Tail || Kind == TCK_MustTail; |
| 1672 | } |
| 1673 | |
| 1674 | bool isMustTailCall() const { return getTailCallKind() == TCK_MustTail; } |
| 1675 | |
| 1676 | bool isNoTailCall() const { return getTailCallKind() == TCK_NoTail; } |
| 1677 | |
| 1678 | void setTailCallKind(TailCallKind TCK) { |
| 1679 | setSubclassData<TailCallKindField>(TCK); |
| 1680 | } |
| 1681 | |
| 1682 | void setTailCall(bool IsTc = true) { |
| 1683 | setTailCallKind(IsTc ? TCK_Tail : TCK_None); |
| 1684 | } |
| 1685 | |
| 1686 | /// Return true if the call can return twice |
| 1687 | bool canReturnTwice() const { return hasFnAttr(Attribute::ReturnsTwice); } |
| 1688 | void setCanReturnTwice() { |
| 1689 | addAttribute(AttributeList::FunctionIndex, Attribute::ReturnsTwice); |
| 1690 | } |
| 1691 | |
| 1692 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1693 | static bool classof(const Instruction *I) { |
| 1694 | return I->getOpcode() == Instruction::Call; |
| 1695 | } |
| 1696 | static bool classof(const Value *V) { |
| 1697 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1698 | } |
| 1699 | |
| 1700 | /// Updates profile metadata by scaling it by \p S / \p T. |
| 1701 | void updateProfWeight(uint64_t S, uint64_t T); |
| 1702 | |
| 1703 | private: |
| 1704 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 1705 | // method so that subclasses cannot accidentally use it. |
| 1706 | template <typename Bitfield> |
| 1707 | void setSubclassData(typename Bitfield::Type Value) { |
| 1708 | Instruction::setSubclassData<Bitfield>(Value); |
| 1709 | } |
| 1710 | }; |
| 1711 | |
| 1712 | CallInst::CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1713 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr, |
| 1714 | BasicBlock *InsertAtEnd) |
| 1715 | : CallBase(Ty->getReturnType(), Instruction::Call, |
| 1716 | OperandTraits<CallBase>::op_end(this) - |
| 1717 | (Args.size() + CountBundleInputs(Bundles) + 1), |
| 1718 | unsigned(Args.size() + CountBundleInputs(Bundles) + 1), |
| 1719 | InsertAtEnd) { |
| 1720 | init(Ty, Func, Args, Bundles, NameStr); |
| 1721 | } |
| 1722 | |
| 1723 | CallInst::CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args, |
| 1724 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr, |
| 1725 | Instruction *InsertBefore) |
| 1726 | : CallBase(Ty->getReturnType(), Instruction::Call, |
| 1727 | OperandTraits<CallBase>::op_end(this) - |
| 1728 | (Args.size() + CountBundleInputs(Bundles) + 1), |
| 1729 | unsigned(Args.size() + CountBundleInputs(Bundles) + 1), |
| 1730 | InsertBefore) { |
| 1731 | init(Ty, Func, Args, Bundles, NameStr); |
| 1732 | } |
| 1733 | |
| 1734 | //===----------------------------------------------------------------------===// |
| 1735 | // SelectInst Class |
| 1736 | //===----------------------------------------------------------------------===// |
| 1737 | |
| 1738 | /// This class represents the LLVM 'select' instruction. |
| 1739 | /// |
| 1740 | class SelectInst : public Instruction { |
| 1741 | SelectInst(Value *C, Value *S1, Value *S2, const Twine &NameStr, |
| 1742 | Instruction *InsertBefore) |
| 1743 | : Instruction(S1->getType(), Instruction::Select, |
| 1744 | &Op<0>(), 3, InsertBefore) { |
| 1745 | init(C, S1, S2); |
| 1746 | setName(NameStr); |
| 1747 | } |
| 1748 | |
| 1749 | SelectInst(Value *C, Value *S1, Value *S2, const Twine &NameStr, |
| 1750 | BasicBlock *InsertAtEnd) |
| 1751 | : Instruction(S1->getType(), Instruction::Select, |
| 1752 | &Op<0>(), 3, InsertAtEnd) { |
| 1753 | init(C, S1, S2); |
| 1754 | setName(NameStr); |
| 1755 | } |
| 1756 | |
| 1757 | void init(Value *C, Value *S1, Value *S2) { |
| 1758 | assert(!areInvalidOperands(C, S1, S2) && "Invalid operands for select")((void)0); |
| 1759 | Op<0>() = C; |
| 1760 | Op<1>() = S1; |
| 1761 | Op<2>() = S2; |
| 1762 | } |
| 1763 | |
| 1764 | protected: |
| 1765 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1766 | friend class Instruction; |
| 1767 | |
| 1768 | SelectInst *cloneImpl() const; |
| 1769 | |
| 1770 | public: |
| 1771 | static SelectInst *Create(Value *C, Value *S1, Value *S2, |
| 1772 | const Twine &NameStr = "", |
| 1773 | Instruction *InsertBefore = nullptr, |
| 1774 | Instruction *MDFrom = nullptr) { |
| 1775 | SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore); |
| 1776 | if (MDFrom) |
| 1777 | Sel->copyMetadata(*MDFrom); |
| 1778 | return Sel; |
| 1779 | } |
| 1780 | |
| 1781 | static SelectInst *Create(Value *C, Value *S1, Value *S2, |
| 1782 | const Twine &NameStr, |
| 1783 | BasicBlock *InsertAtEnd) { |
| 1784 | return new(3) SelectInst(C, S1, S2, NameStr, InsertAtEnd); |
| 1785 | } |
| 1786 | |
| 1787 | const Value *getCondition() const { return Op<0>(); } |
| 1788 | const Value *getTrueValue() const { return Op<1>(); } |
| 1789 | const Value *getFalseValue() const { return Op<2>(); } |
| 1790 | Value *getCondition() { return Op<0>(); } |
| 1791 | Value *getTrueValue() { return Op<1>(); } |
| 1792 | Value *getFalseValue() { return Op<2>(); } |
| 1793 | |
| 1794 | void setCondition(Value *V) { Op<0>() = V; } |
| 1795 | void setTrueValue(Value *V) { Op<1>() = V; } |
| 1796 | void setFalseValue(Value *V) { Op<2>() = V; } |
| 1797 | |
| 1798 | /// Swap the true and false values of the select instruction. |
| 1799 | /// This doesn't swap prof metadata. |
| 1800 | void swapValues() { Op<1>().swap(Op<2>()); } |
| 1801 | |
| 1802 | /// Return a string if the specified operands are invalid |
| 1803 | /// for a select operation, otherwise return null. |
| 1804 | static const char *areInvalidOperands(Value *Cond, Value *True, Value *False); |
| 1805 | |
| 1806 | /// Transparently provide more efficient getOperand methods. |
| 1807 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 1808 | |
| 1809 | OtherOps getOpcode() const { |
| 1810 | return static_cast<OtherOps>(Instruction::getOpcode()); |
| 1811 | } |
| 1812 | |
| 1813 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1814 | static bool classof(const Instruction *I) { |
| 1815 | return I->getOpcode() == Instruction::Select; |
| 1816 | } |
| 1817 | static bool classof(const Value *V) { |
| 1818 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1819 | } |
| 1820 | }; |
| 1821 | |
| 1822 | template <> |
| 1823 | struct OperandTraits<SelectInst> : public FixedNumOperandTraits<SelectInst, 3> { |
| 1824 | }; |
| 1825 | |
| 1826 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SelectInst, Value)SelectInst::op_iterator SelectInst::op_begin() { return OperandTraits <SelectInst>::op_begin(this); } SelectInst::const_op_iterator SelectInst::op_begin() const { return OperandTraits<SelectInst >::op_begin(const_cast<SelectInst*>(this)); } SelectInst ::op_iterator SelectInst::op_end() { return OperandTraits< SelectInst>::op_end(this); } SelectInst::const_op_iterator SelectInst::op_end() const { return OperandTraits<SelectInst >::op_end(const_cast<SelectInst*>(this)); } Value *SelectInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<SelectInst>::op_begin(const_cast <SelectInst*>(this))[i_nocapture].get()); } void SelectInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<SelectInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned SelectInst::getNumOperands() const { return OperandTraits<SelectInst>::operands(this); } template <int Idx_nocapture> Use &SelectInst::Op() { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &SelectInst::Op() const { return this->OpFrom<Idx_nocapture>(this); } |
| 1827 | |
| 1828 | //===----------------------------------------------------------------------===// |
| 1829 | // VAArgInst Class |
| 1830 | //===----------------------------------------------------------------------===// |
| 1831 | |
| 1832 | /// This class represents the va_arg llvm instruction, which returns |
| 1833 | /// an argument of the specified type given a va_list and increments that list |
| 1834 | /// |
| 1835 | class VAArgInst : public UnaryInstruction { |
| 1836 | protected: |
| 1837 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1838 | friend class Instruction; |
| 1839 | |
| 1840 | VAArgInst *cloneImpl() const; |
| 1841 | |
| 1842 | public: |
| 1843 | VAArgInst(Value *List, Type *Ty, const Twine &NameStr = "", |
| 1844 | Instruction *InsertBefore = nullptr) |
| 1845 | : UnaryInstruction(Ty, VAArg, List, InsertBefore) { |
| 1846 | setName(NameStr); |
| 1847 | } |
| 1848 | |
| 1849 | VAArgInst(Value *List, Type *Ty, const Twine &NameStr, |
| 1850 | BasicBlock *InsertAtEnd) |
| 1851 | : UnaryInstruction(Ty, VAArg, List, InsertAtEnd) { |
| 1852 | setName(NameStr); |
| 1853 | } |
| 1854 | |
| 1855 | Value *getPointerOperand() { return getOperand(0); } |
| 1856 | const Value *getPointerOperand() const { return getOperand(0); } |
| 1857 | static unsigned getPointerOperandIndex() { return 0U; } |
| 1858 | |
| 1859 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1860 | static bool classof(const Instruction *I) { |
| 1861 | return I->getOpcode() == VAArg; |
| 1862 | } |
| 1863 | static bool classof(const Value *V) { |
| 1864 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1865 | } |
| 1866 | }; |
| 1867 | |
| 1868 | //===----------------------------------------------------------------------===// |
| 1869 | // ExtractElementInst Class |
| 1870 | //===----------------------------------------------------------------------===// |
| 1871 | |
| 1872 | /// This instruction extracts a single (scalar) |
| 1873 | /// element from a VectorType value |
| 1874 | /// |
| 1875 | class ExtractElementInst : public Instruction { |
| 1876 | ExtractElementInst(Value *Vec, Value *Idx, const Twine &NameStr = "", |
| 1877 | Instruction *InsertBefore = nullptr); |
| 1878 | ExtractElementInst(Value *Vec, Value *Idx, const Twine &NameStr, |
| 1879 | BasicBlock *InsertAtEnd); |
| 1880 | |
| 1881 | protected: |
| 1882 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1883 | friend class Instruction; |
| 1884 | |
| 1885 | ExtractElementInst *cloneImpl() const; |
| 1886 | |
| 1887 | public: |
| 1888 | static ExtractElementInst *Create(Value *Vec, Value *Idx, |
| 1889 | const Twine &NameStr = "", |
| 1890 | Instruction *InsertBefore = nullptr) { |
| 1891 | return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertBefore); |
| 1892 | } |
| 1893 | |
| 1894 | static ExtractElementInst *Create(Value *Vec, Value *Idx, |
| 1895 | const Twine &NameStr, |
| 1896 | BasicBlock *InsertAtEnd) { |
| 1897 | return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertAtEnd); |
| 1898 | } |
| 1899 | |
| 1900 | /// Return true if an extractelement instruction can be |
| 1901 | /// formed with the specified operands. |
| 1902 | static bool isValidOperands(const Value *Vec, const Value *Idx); |
| 1903 | |
| 1904 | Value *getVectorOperand() { return Op<0>(); } |
| 1905 | Value *getIndexOperand() { return Op<1>(); } |
| 1906 | const Value *getVectorOperand() const { return Op<0>(); } |
| 1907 | const Value *getIndexOperand() const { return Op<1>(); } |
| 1908 | |
| 1909 | VectorType *getVectorOperandType() const { |
| 1910 | return cast<VectorType>(getVectorOperand()->getType()); |
| 1911 | } |
| 1912 | |
| 1913 | /// Transparently provide more efficient getOperand methods. |
| 1914 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 1915 | |
| 1916 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1917 | static bool classof(const Instruction *I) { |
| 1918 | return I->getOpcode() == Instruction::ExtractElement; |
| 1919 | } |
| 1920 | static bool classof(const Value *V) { |
| 1921 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1922 | } |
| 1923 | }; |
| 1924 | |
| 1925 | template <> |
| 1926 | struct OperandTraits<ExtractElementInst> : |
| 1927 | public FixedNumOperandTraits<ExtractElementInst, 2> { |
| 1928 | }; |
| 1929 | |
| 1930 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractElementInst, Value)ExtractElementInst::op_iterator ExtractElementInst::op_begin( ) { return OperandTraits<ExtractElementInst>::op_begin( this); } ExtractElementInst::const_op_iterator ExtractElementInst ::op_begin() const { return OperandTraits<ExtractElementInst >::op_begin(const_cast<ExtractElementInst*>(this)); } ExtractElementInst::op_iterator ExtractElementInst::op_end() { return OperandTraits<ExtractElementInst>::op_end(this ); } ExtractElementInst::const_op_iterator ExtractElementInst ::op_end() const { return OperandTraits<ExtractElementInst >::op_end(const_cast<ExtractElementInst*>(this)); } Value *ExtractElementInst::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null<Value>( OperandTraits< ExtractElementInst>::op_begin(const_cast<ExtractElementInst *>(this))[i_nocapture].get()); } void ExtractElementInst:: setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void )0); OperandTraits<ExtractElementInst>::op_begin(this)[ i_nocapture] = Val_nocapture; } unsigned ExtractElementInst:: getNumOperands() const { return OperandTraits<ExtractElementInst >::operands(this); } template <int Idx_nocapture> Use &ExtractElementInst::Op() { return this->OpFrom<Idx_nocapture >(this); } template <int Idx_nocapture> const Use & ExtractElementInst::Op() const { return this->OpFrom<Idx_nocapture >(this); } |
| 1931 | |
| 1932 | //===----------------------------------------------------------------------===// |
| 1933 | // InsertElementInst Class |
| 1934 | //===----------------------------------------------------------------------===// |
| 1935 | |
| 1936 | /// This instruction inserts a single (scalar) |
| 1937 | /// element into a VectorType value |
| 1938 | /// |
| 1939 | class InsertElementInst : public Instruction { |
| 1940 | InsertElementInst(Value *Vec, Value *NewElt, Value *Idx, |
| 1941 | const Twine &NameStr = "", |
| 1942 | Instruction *InsertBefore = nullptr); |
| 1943 | InsertElementInst(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr, |
| 1944 | BasicBlock *InsertAtEnd); |
| 1945 | |
| 1946 | protected: |
| 1947 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 1948 | friend class Instruction; |
| 1949 | |
| 1950 | InsertElementInst *cloneImpl() const; |
| 1951 | |
| 1952 | public: |
| 1953 | static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx, |
| 1954 | const Twine &NameStr = "", |
| 1955 | Instruction *InsertBefore = nullptr) { |
| 1956 | return new(3) InsertElementInst(Vec, NewElt, Idx, NameStr, InsertBefore); |
| 1957 | } |
| 1958 | |
| 1959 | static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx, |
| 1960 | const Twine &NameStr, |
| 1961 | BasicBlock *InsertAtEnd) { |
| 1962 | return new(3) InsertElementInst(Vec, NewElt, Idx, NameStr, InsertAtEnd); |
| 1963 | } |
| 1964 | |
| 1965 | /// Return true if an insertelement instruction can be |
| 1966 | /// formed with the specified operands. |
| 1967 | static bool isValidOperands(const Value *Vec, const Value *NewElt, |
| 1968 | const Value *Idx); |
| 1969 | |
| 1970 | /// Overload to return most specific vector type. |
| 1971 | /// |
| 1972 | VectorType *getType() const { |
| 1973 | return cast<VectorType>(Instruction::getType()); |
| 1974 | } |
| 1975 | |
| 1976 | /// Transparently provide more efficient getOperand methods. |
| 1977 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 1978 | |
| 1979 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 1980 | static bool classof(const Instruction *I) { |
| 1981 | return I->getOpcode() == Instruction::InsertElement; |
| 1982 | } |
| 1983 | static bool classof(const Value *V) { |
| 1984 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 1985 | } |
| 1986 | }; |
| 1987 | |
| 1988 | template <> |
| 1989 | struct OperandTraits<InsertElementInst> : |
| 1990 | public FixedNumOperandTraits<InsertElementInst, 3> { |
| 1991 | }; |
| 1992 | |
| 1993 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertElementInst, Value)InsertElementInst::op_iterator InsertElementInst::op_begin() { return OperandTraits<InsertElementInst>::op_begin(this ); } InsertElementInst::const_op_iterator InsertElementInst:: op_begin() const { return OperandTraits<InsertElementInst> ::op_begin(const_cast<InsertElementInst*>(this)); } InsertElementInst ::op_iterator InsertElementInst::op_end() { return OperandTraits <InsertElementInst>::op_end(this); } InsertElementInst:: const_op_iterator InsertElementInst::op_end() const { return OperandTraits <InsertElementInst>::op_end(const_cast<InsertElementInst *>(this)); } Value *InsertElementInst::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null<Value >( OperandTraits<InsertElementInst>::op_begin(const_cast <InsertElementInst*>(this))[i_nocapture].get()); } void InsertElementInst::setOperand(unsigned i_nocapture, Value *Val_nocapture ) { ((void)0); OperandTraits<InsertElementInst>::op_begin (this)[i_nocapture] = Val_nocapture; } unsigned InsertElementInst ::getNumOperands() const { return OperandTraits<InsertElementInst >::operands(this); } template <int Idx_nocapture> Use &InsertElementInst::Op() { return this->OpFrom<Idx_nocapture >(this); } template <int Idx_nocapture> const Use & InsertElementInst::Op() const { return this->OpFrom<Idx_nocapture >(this); } |
| 1994 | |
| 1995 | //===----------------------------------------------------------------------===// |
| 1996 | // ShuffleVectorInst Class |
| 1997 | //===----------------------------------------------------------------------===// |
| 1998 | |
| 1999 | constexpr int UndefMaskElem = -1; |
| 2000 | |
| 2001 | /// This instruction constructs a fixed permutation of two |
| 2002 | /// input vectors. |
| 2003 | /// |
| 2004 | /// For each element of the result vector, the shuffle mask selects an element |
| 2005 | /// from one of the input vectors to copy to the result. Non-negative elements |
| 2006 | /// in the mask represent an index into the concatenated pair of input vectors. |
| 2007 | /// UndefMaskElem (-1) specifies that the result element is undefined. |
| 2008 | /// |
| 2009 | /// For scalable vectors, all the elements of the mask must be 0 or -1. This |
| 2010 | /// requirement may be relaxed in the future. |
| 2011 | class ShuffleVectorInst : public Instruction { |
| 2012 | SmallVector<int, 4> ShuffleMask; |
| 2013 | Constant *ShuffleMaskForBitcode; |
| 2014 | |
| 2015 | protected: |
| 2016 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 2017 | friend class Instruction; |
| 2018 | |
| 2019 | ShuffleVectorInst *cloneImpl() const; |
| 2020 | |
| 2021 | public: |
| 2022 | ShuffleVectorInst(Value *V1, Value *V2, Value *Mask, |
| 2023 | const Twine &NameStr = "", |
| 2024 | Instruction *InsertBefor = nullptr); |
| 2025 | ShuffleVectorInst(Value *V1, Value *V2, Value *Mask, |
| 2026 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 2027 | ShuffleVectorInst(Value *V1, Value *V2, ArrayRef<int> Mask, |
| 2028 | const Twine &NameStr = "", |
| 2029 | Instruction *InsertBefor = nullptr); |
| 2030 | ShuffleVectorInst(Value *V1, Value *V2, ArrayRef<int> Mask, |
| 2031 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 2032 | |
| 2033 | void *operator new(size_t S) { return User::operator new(S, 2); } |
| 2034 | void operator delete(void *Ptr) { return User::operator delete(Ptr); } |
| 2035 | |
| 2036 | /// Swap the operands and adjust the mask to preserve the semantics |
| 2037 | /// of the instruction. |
| 2038 | void commute(); |
| 2039 | |
| 2040 | /// Return true if a shufflevector instruction can be |
| 2041 | /// formed with the specified operands. |
| 2042 | static bool isValidOperands(const Value *V1, const Value *V2, |
| 2043 | const Value *Mask); |
| 2044 | static bool isValidOperands(const Value *V1, const Value *V2, |
| 2045 | ArrayRef<int> Mask); |
| 2046 | |
| 2047 | /// Overload to return most specific vector type. |
| 2048 | /// |
| 2049 | VectorType *getType() const { |
| 2050 | return cast<VectorType>(Instruction::getType()); |
| 2051 | } |
| 2052 | |
| 2053 | /// Transparently provide more efficient getOperand methods. |
| 2054 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 2055 | |
| 2056 | /// Return the shuffle mask value of this instruction for the given element |
| 2057 | /// index. Return UndefMaskElem if the element is undef. |
| 2058 | int getMaskValue(unsigned Elt) const { return ShuffleMask[Elt]; } |
| 2059 | |
| 2060 | /// Convert the input shuffle mask operand to a vector of integers. Undefined |
| 2061 | /// elements of the mask are returned as UndefMaskElem. |
| 2062 | static void getShuffleMask(const Constant *Mask, |
| 2063 | SmallVectorImpl<int> &Result); |
| 2064 | |
| 2065 | /// Return the mask for this instruction as a vector of integers. Undefined |
| 2066 | /// elements of the mask are returned as UndefMaskElem. |
| 2067 | void getShuffleMask(SmallVectorImpl<int> &Result) const { |
| 2068 | Result.assign(ShuffleMask.begin(), ShuffleMask.end()); |
| 2069 | } |
| 2070 | |
| 2071 | /// Return the mask for this instruction, for use in bitcode. |
| 2072 | /// |
| 2073 | /// TODO: This is temporary until we decide a new bitcode encoding for |
| 2074 | /// shufflevector. |
| 2075 | Constant *getShuffleMaskForBitcode() const { return ShuffleMaskForBitcode; } |
| 2076 | |
| 2077 | static Constant *convertShuffleMaskForBitcode(ArrayRef<int> Mask, |
| 2078 | Type *ResultTy); |
| 2079 | |
| 2080 | void setShuffleMask(ArrayRef<int> Mask); |
| 2081 | |
| 2082 | ArrayRef<int> getShuffleMask() const { return ShuffleMask; } |
| 2083 | |
| 2084 | /// Return true if this shuffle returns a vector with a different number of |
| 2085 | /// elements than its source vectors. |
| 2086 | /// Examples: shufflevector <4 x n> A, <4 x n> B, <1,2,3> |
| 2087 | /// shufflevector <4 x n> A, <4 x n> B, <1,2,3,4,5> |
| 2088 | bool changesLength() const { |
| 2089 | unsigned NumSourceElts = cast<VectorType>(Op<0>()->getType()) |
| 2090 | ->getElementCount() |
| 2091 | .getKnownMinValue(); |
| 2092 | unsigned NumMaskElts = ShuffleMask.size(); |
| 2093 | return NumSourceElts != NumMaskElts; |
| 2094 | } |
| 2095 | |
| 2096 | /// Return true if this shuffle returns a vector with a greater number of |
| 2097 | /// elements than its source vectors. |
| 2098 | /// Example: shufflevector <2 x n> A, <2 x n> B, <1,2,3> |
| 2099 | bool increasesLength() const { |
| 2100 | unsigned NumSourceElts = cast<VectorType>(Op<0>()->getType()) |
| 2101 | ->getElementCount() |
| 2102 | .getKnownMinValue(); |
| 2103 | unsigned NumMaskElts = ShuffleMask.size(); |
| 2104 | return NumSourceElts < NumMaskElts; |
| 2105 | } |
| 2106 | |
| 2107 | /// Return true if this shuffle mask chooses elements from exactly one source |
| 2108 | /// vector. |
| 2109 | /// Example: <7,5,undef,7> |
| 2110 | /// This assumes that vector operands are the same length as the mask. |
| 2111 | static bool isSingleSourceMask(ArrayRef<int> Mask); |
| 2112 | static bool isSingleSourceMask(const Constant *Mask) { |
| 2113 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2114 | SmallVector<int, 16> MaskAsInts; |
| 2115 | getShuffleMask(Mask, MaskAsInts); |
| 2116 | return isSingleSourceMask(MaskAsInts); |
| 2117 | } |
| 2118 | |
| 2119 | /// Return true if this shuffle chooses elements from exactly one source |
| 2120 | /// vector without changing the length of that vector. |
| 2121 | /// Example: shufflevector <4 x n> A, <4 x n> B, <3,0,undef,3> |
| 2122 | /// TODO: Optionally allow length-changing shuffles. |
| 2123 | bool isSingleSource() const { |
| 2124 | return !changesLength() && isSingleSourceMask(ShuffleMask); |
| 2125 | } |
| 2126 | |
| 2127 | /// Return true if this shuffle mask chooses elements from exactly one source |
| 2128 | /// vector without lane crossings. A shuffle using this mask is not |
| 2129 | /// necessarily a no-op because it may change the number of elements from its |
| 2130 | /// input vectors or it may provide demanded bits knowledge via undef lanes. |
| 2131 | /// Example: <undef,undef,2,3> |
| 2132 | static bool isIdentityMask(ArrayRef<int> Mask); |
| 2133 | static bool isIdentityMask(const Constant *Mask) { |
| 2134 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2135 | SmallVector<int, 16> MaskAsInts; |
| 2136 | getShuffleMask(Mask, MaskAsInts); |
| 2137 | return isIdentityMask(MaskAsInts); |
| 2138 | } |
| 2139 | |
| 2140 | /// Return true if this shuffle chooses elements from exactly one source |
| 2141 | /// vector without lane crossings and does not change the number of elements |
| 2142 | /// from its input vectors. |
| 2143 | /// Example: shufflevector <4 x n> A, <4 x n> B, <4,undef,6,undef> |
| 2144 | bool isIdentity() const { |
| 2145 | return !changesLength() && isIdentityMask(ShuffleMask); |
| 2146 | } |
| 2147 | |
| 2148 | /// Return true if this shuffle lengthens exactly one source vector with |
| 2149 | /// undefs in the high elements. |
| 2150 | bool isIdentityWithPadding() const; |
| 2151 | |
| 2152 | /// Return true if this shuffle extracts the first N elements of exactly one |
| 2153 | /// source vector. |
| 2154 | bool isIdentityWithExtract() const; |
| 2155 | |
| 2156 | /// Return true if this shuffle concatenates its 2 source vectors. This |
| 2157 | /// returns false if either input is undefined. In that case, the shuffle is |
| 2158 | /// is better classified as an identity with padding operation. |
| 2159 | bool isConcat() const; |
| 2160 | |
| 2161 | /// Return true if this shuffle mask chooses elements from its source vectors |
| 2162 | /// without lane crossings. A shuffle using this mask would be |
| 2163 | /// equivalent to a vector select with a constant condition operand. |
| 2164 | /// Example: <4,1,6,undef> |
| 2165 | /// This returns false if the mask does not choose from both input vectors. |
| 2166 | /// In that case, the shuffle is better classified as an identity shuffle. |
| 2167 | /// This assumes that vector operands are the same length as the mask |
| 2168 | /// (a length-changing shuffle can never be equivalent to a vector select). |
| 2169 | static bool isSelectMask(ArrayRef<int> Mask); |
| 2170 | static bool isSelectMask(const Constant *Mask) { |
| 2171 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2172 | SmallVector<int, 16> MaskAsInts; |
| 2173 | getShuffleMask(Mask, MaskAsInts); |
| 2174 | return isSelectMask(MaskAsInts); |
| 2175 | } |
| 2176 | |
| 2177 | /// Return true if this shuffle chooses elements from its source vectors |
| 2178 | /// without lane crossings and all operands have the same number of elements. |
| 2179 | /// In other words, this shuffle is equivalent to a vector select with a |
| 2180 | /// constant condition operand. |
| 2181 | /// Example: shufflevector <4 x n> A, <4 x n> B, <undef,1,6,3> |
| 2182 | /// This returns false if the mask does not choose from both input vectors. |
| 2183 | /// In that case, the shuffle is better classified as an identity shuffle. |
| 2184 | /// TODO: Optionally allow length-changing shuffles. |
| 2185 | bool isSelect() const { |
| 2186 | return !changesLength() && isSelectMask(ShuffleMask); |
| 2187 | } |
| 2188 | |
| 2189 | /// Return true if this shuffle mask swaps the order of elements from exactly |
| 2190 | /// one source vector. |
| 2191 | /// Example: <7,6,undef,4> |
| 2192 | /// This assumes that vector operands are the same length as the mask. |
| 2193 | static bool isReverseMask(ArrayRef<int> Mask); |
| 2194 | static bool isReverseMask(const Constant *Mask) { |
| 2195 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2196 | SmallVector<int, 16> MaskAsInts; |
| 2197 | getShuffleMask(Mask, MaskAsInts); |
| 2198 | return isReverseMask(MaskAsInts); |
| 2199 | } |
| 2200 | |
| 2201 | /// Return true if this shuffle swaps the order of elements from exactly |
| 2202 | /// one source vector. |
| 2203 | /// Example: shufflevector <4 x n> A, <4 x n> B, <3,undef,1,undef> |
| 2204 | /// TODO: Optionally allow length-changing shuffles. |
| 2205 | bool isReverse() const { |
| 2206 | return !changesLength() && isReverseMask(ShuffleMask); |
| 2207 | } |
| 2208 | |
| 2209 | /// Return true if this shuffle mask chooses all elements with the same value |
| 2210 | /// as the first element of exactly one source vector. |
| 2211 | /// Example: <4,undef,undef,4> |
| 2212 | /// This assumes that vector operands are the same length as the mask. |
| 2213 | static bool isZeroEltSplatMask(ArrayRef<int> Mask); |
| 2214 | static bool isZeroEltSplatMask(const Constant *Mask) { |
| 2215 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2216 | SmallVector<int, 16> MaskAsInts; |
| 2217 | getShuffleMask(Mask, MaskAsInts); |
| 2218 | return isZeroEltSplatMask(MaskAsInts); |
| 2219 | } |
| 2220 | |
| 2221 | /// Return true if all elements of this shuffle are the same value as the |
| 2222 | /// first element of exactly one source vector without changing the length |
| 2223 | /// of that vector. |
| 2224 | /// Example: shufflevector <4 x n> A, <4 x n> B, <undef,0,undef,0> |
| 2225 | /// TODO: Optionally allow length-changing shuffles. |
| 2226 | /// TODO: Optionally allow splats from other elements. |
| 2227 | bool isZeroEltSplat() const { |
| 2228 | return !changesLength() && isZeroEltSplatMask(ShuffleMask); |
| 2229 | } |
| 2230 | |
| 2231 | /// Return true if this shuffle mask is a transpose mask. |
| 2232 | /// Transpose vector masks transpose a 2xn matrix. They read corresponding |
| 2233 | /// even- or odd-numbered vector elements from two n-dimensional source |
| 2234 | /// vectors and write each result into consecutive elements of an |
| 2235 | /// n-dimensional destination vector. Two shuffles are necessary to complete |
| 2236 | /// the transpose, one for the even elements and another for the odd elements. |
| 2237 | /// This description closely follows how the TRN1 and TRN2 AArch64 |
| 2238 | /// instructions operate. |
| 2239 | /// |
| 2240 | /// For example, a simple 2x2 matrix can be transposed with: |
| 2241 | /// |
| 2242 | /// ; Original matrix |
| 2243 | /// m0 = < a, b > |
| 2244 | /// m1 = < c, d > |
| 2245 | /// |
| 2246 | /// ; Transposed matrix |
| 2247 | /// t0 = < a, c > = shufflevector m0, m1, < 0, 2 > |
| 2248 | /// t1 = < b, d > = shufflevector m0, m1, < 1, 3 > |
| 2249 | /// |
| 2250 | /// For matrices having greater than n columns, the resulting nx2 transposed |
| 2251 | /// matrix is stored in two result vectors such that one vector contains |
| 2252 | /// interleaved elements from all the even-numbered rows and the other vector |
| 2253 | /// contains interleaved elements from all the odd-numbered rows. For example, |
| 2254 | /// a 2x4 matrix can be transposed with: |
| 2255 | /// |
| 2256 | /// ; Original matrix |
| 2257 | /// m0 = < a, b, c, d > |
| 2258 | /// m1 = < e, f, g, h > |
| 2259 | /// |
| 2260 | /// ; Transposed matrix |
| 2261 | /// t0 = < a, e, c, g > = shufflevector m0, m1 < 0, 4, 2, 6 > |
| 2262 | /// t1 = < b, f, d, h > = shufflevector m0, m1 < 1, 5, 3, 7 > |
| 2263 | static bool isTransposeMask(ArrayRef<int> Mask); |
| 2264 | static bool isTransposeMask(const Constant *Mask) { |
| 2265 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2266 | SmallVector<int, 16> MaskAsInts; |
| 2267 | getShuffleMask(Mask, MaskAsInts); |
| 2268 | return isTransposeMask(MaskAsInts); |
| 2269 | } |
| 2270 | |
| 2271 | /// Return true if this shuffle transposes the elements of its inputs without |
| 2272 | /// changing the length of the vectors. This operation may also be known as a |
| 2273 | /// merge or interleave. See the description for isTransposeMask() for the |
| 2274 | /// exact specification. |
| 2275 | /// Example: shufflevector <4 x n> A, <4 x n> B, <0,4,2,6> |
| 2276 | bool isTranspose() const { |
| 2277 | return !changesLength() && isTransposeMask(ShuffleMask); |
| 2278 | } |
| 2279 | |
| 2280 | /// Return true if this shuffle mask is an extract subvector mask. |
| 2281 | /// A valid extract subvector mask returns a smaller vector from a single |
| 2282 | /// source operand. The base extraction index is returned as well. |
| 2283 | static bool isExtractSubvectorMask(ArrayRef<int> Mask, int NumSrcElts, |
| 2284 | int &Index); |
| 2285 | static bool isExtractSubvectorMask(const Constant *Mask, int NumSrcElts, |
| 2286 | int &Index) { |
| 2287 | assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.")((void)0); |
| 2288 | // Not possible to express a shuffle mask for a scalable vector for this |
| 2289 | // case. |
| 2290 | if (isa<ScalableVectorType>(Mask->getType())) |
| 2291 | return false; |
| 2292 | SmallVector<int, 16> MaskAsInts; |
| 2293 | getShuffleMask(Mask, MaskAsInts); |
| 2294 | return isExtractSubvectorMask(MaskAsInts, NumSrcElts, Index); |
| 2295 | } |
| 2296 | |
| 2297 | /// Return true if this shuffle mask is an extract subvector mask. |
| 2298 | bool isExtractSubvectorMask(int &Index) const { |
| 2299 | // Not possible to express a shuffle mask for a scalable vector for this |
| 2300 | // case. |
| 2301 | if (isa<ScalableVectorType>(getType())) |
| 2302 | return false; |
| 2303 | |
| 2304 | int NumSrcElts = |
| 2305 | cast<FixedVectorType>(Op<0>()->getType())->getNumElements(); |
| 2306 | return isExtractSubvectorMask(ShuffleMask, NumSrcElts, Index); |
| 2307 | } |
| 2308 | |
| 2309 | /// Change values in a shuffle permute mask assuming the two vector operands |
| 2310 | /// of length InVecNumElts have swapped position. |
| 2311 | static void commuteShuffleMask(MutableArrayRef<int> Mask, |
| 2312 | unsigned InVecNumElts) { |
| 2313 | for (int &Idx : Mask) { |
| 2314 | if (Idx == -1) |
| 2315 | continue; |
| 2316 | Idx = Idx < (int)InVecNumElts ? Idx + InVecNumElts : Idx - InVecNumElts; |
| 2317 | assert(Idx >= 0 && Idx < (int)InVecNumElts * 2 &&((void)0) |
| 2318 | "shufflevector mask index out of range")((void)0); |
| 2319 | } |
| 2320 | } |
| 2321 | |
| 2322 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 2323 | static bool classof(const Instruction *I) { |
| 2324 | return I->getOpcode() == Instruction::ShuffleVector; |
| 2325 | } |
| 2326 | static bool classof(const Value *V) { |
| 2327 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 2328 | } |
| 2329 | }; |
| 2330 | |
| 2331 | template <> |
| 2332 | struct OperandTraits<ShuffleVectorInst> |
| 2333 | : public FixedNumOperandTraits<ShuffleVectorInst, 2> {}; |
| 2334 | |
| 2335 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ShuffleVectorInst, Value)ShuffleVectorInst::op_iterator ShuffleVectorInst::op_begin() { return OperandTraits<ShuffleVectorInst>::op_begin(this ); } ShuffleVectorInst::const_op_iterator ShuffleVectorInst:: op_begin() const { return OperandTraits<ShuffleVectorInst> ::op_begin(const_cast<ShuffleVectorInst*>(this)); } ShuffleVectorInst ::op_iterator ShuffleVectorInst::op_end() { return OperandTraits <ShuffleVectorInst>::op_end(this); } ShuffleVectorInst:: const_op_iterator ShuffleVectorInst::op_end() const { return OperandTraits <ShuffleVectorInst>::op_end(const_cast<ShuffleVectorInst *>(this)); } Value *ShuffleVectorInst::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null<Value >( OperandTraits<ShuffleVectorInst>::op_begin(const_cast <ShuffleVectorInst*>(this))[i_nocapture].get()); } void ShuffleVectorInst::setOperand(unsigned i_nocapture, Value *Val_nocapture ) { ((void)0); OperandTraits<ShuffleVectorInst>::op_begin (this)[i_nocapture] = Val_nocapture; } unsigned ShuffleVectorInst ::getNumOperands() const { return OperandTraits<ShuffleVectorInst >::operands(this); } template <int Idx_nocapture> Use &ShuffleVectorInst::Op() { return this->OpFrom<Idx_nocapture >(this); } template <int Idx_nocapture> const Use & ShuffleVectorInst::Op() const { return this->OpFrom<Idx_nocapture >(this); } |
| 2336 | |
| 2337 | //===----------------------------------------------------------------------===// |
| 2338 | // ExtractValueInst Class |
| 2339 | //===----------------------------------------------------------------------===// |
| 2340 | |
| 2341 | /// This instruction extracts a struct member or array |
| 2342 | /// element value from an aggregate value. |
| 2343 | /// |
| 2344 | class ExtractValueInst : public UnaryInstruction { |
| 2345 | SmallVector<unsigned, 4> Indices; |
| 2346 | |
| 2347 | ExtractValueInst(const ExtractValueInst &EVI); |
| 2348 | |
| 2349 | /// Constructors - Create a extractvalue instruction with a base aggregate |
| 2350 | /// value and a list of indices. The first ctor can optionally insert before |
| 2351 | /// an existing instruction, the second appends the new instruction to the |
| 2352 | /// specified BasicBlock. |
| 2353 | inline ExtractValueInst(Value *Agg, |
| 2354 | ArrayRef<unsigned> Idxs, |
| 2355 | const Twine &NameStr, |
| 2356 | Instruction *InsertBefore); |
| 2357 | inline ExtractValueInst(Value *Agg, |
| 2358 | ArrayRef<unsigned> Idxs, |
| 2359 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 2360 | |
| 2361 | void init(ArrayRef<unsigned> Idxs, const Twine &NameStr); |
| 2362 | |
| 2363 | protected: |
| 2364 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 2365 | friend class Instruction; |
| 2366 | |
| 2367 | ExtractValueInst *cloneImpl() const; |
| 2368 | |
| 2369 | public: |
| 2370 | static ExtractValueInst *Create(Value *Agg, |
| 2371 | ArrayRef<unsigned> Idxs, |
| 2372 | const Twine &NameStr = "", |
| 2373 | Instruction *InsertBefore = nullptr) { |
| 2374 | return new |
| 2375 | ExtractValueInst(Agg, Idxs, NameStr, InsertBefore); |
| 2376 | } |
| 2377 | |
| 2378 | static ExtractValueInst *Create(Value *Agg, |
| 2379 | ArrayRef<unsigned> Idxs, |
| 2380 | const Twine &NameStr, |
| 2381 | BasicBlock *InsertAtEnd) { |
| 2382 | return new ExtractValueInst(Agg, Idxs, NameStr, InsertAtEnd); |
| 2383 | } |
| 2384 | |
| 2385 | /// Returns the type of the element that would be extracted |
| 2386 | /// with an extractvalue instruction with the specified parameters. |
| 2387 | /// |
| 2388 | /// Null is returned if the indices are invalid for the specified type. |
| 2389 | static Type *getIndexedType(Type *Agg, ArrayRef<unsigned> Idxs); |
| 2390 | |
| 2391 | using idx_iterator = const unsigned*; |
| 2392 | |
| 2393 | inline idx_iterator idx_begin() const { return Indices.begin(); } |
| 2394 | inline idx_iterator idx_end() const { return Indices.end(); } |
| 2395 | inline iterator_range<idx_iterator> indices() const { |
| 2396 | return make_range(idx_begin(), idx_end()); |
| 2397 | } |
| 2398 | |
| 2399 | Value *getAggregateOperand() { |
| 2400 | return getOperand(0); |
| 2401 | } |
| 2402 | const Value *getAggregateOperand() const { |
| 2403 | return getOperand(0); |
| 2404 | } |
| 2405 | static unsigned getAggregateOperandIndex() { |
| 2406 | return 0U; // get index for modifying correct operand |
| 2407 | } |
| 2408 | |
| 2409 | ArrayRef<unsigned> getIndices() const { |
| 2410 | return Indices; |
| 2411 | } |
| 2412 | |
| 2413 | unsigned getNumIndices() const { |
| 2414 | return (unsigned)Indices.size(); |
| 2415 | } |
| 2416 | |
| 2417 | bool hasIndices() const { |
| 2418 | return true; |
| 2419 | } |
| 2420 | |
| 2421 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 2422 | static bool classof(const Instruction *I) { |
| 2423 | return I->getOpcode() == Instruction::ExtractValue; |
| 2424 | } |
| 2425 | static bool classof(const Value *V) { |
| 2426 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 2427 | } |
| 2428 | }; |
| 2429 | |
| 2430 | ExtractValueInst::ExtractValueInst(Value *Agg, |
| 2431 | ArrayRef<unsigned> Idxs, |
| 2432 | const Twine &NameStr, |
| 2433 | Instruction *InsertBefore) |
| 2434 | : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)), |
| 2435 | ExtractValue, Agg, InsertBefore) { |
| 2436 | init(Idxs, NameStr); |
| 2437 | } |
| 2438 | |
| 2439 | ExtractValueInst::ExtractValueInst(Value *Agg, |
| 2440 | ArrayRef<unsigned> Idxs, |
| 2441 | const Twine &NameStr, |
| 2442 | BasicBlock *InsertAtEnd) |
| 2443 | : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)), |
| 2444 | ExtractValue, Agg, InsertAtEnd) { |
| 2445 | init(Idxs, NameStr); |
| 2446 | } |
| 2447 | |
| 2448 | //===----------------------------------------------------------------------===// |
| 2449 | // InsertValueInst Class |
| 2450 | //===----------------------------------------------------------------------===// |
| 2451 | |
| 2452 | /// This instruction inserts a struct field of array element |
| 2453 | /// value into an aggregate value. |
| 2454 | /// |
| 2455 | class InsertValueInst : public Instruction { |
| 2456 | SmallVector<unsigned, 4> Indices; |
| 2457 | |
| 2458 | InsertValueInst(const InsertValueInst &IVI); |
| 2459 | |
| 2460 | /// Constructors - Create a insertvalue instruction with a base aggregate |
| 2461 | /// value, a value to insert, and a list of indices. The first ctor can |
| 2462 | /// optionally insert before an existing instruction, the second appends |
| 2463 | /// the new instruction to the specified BasicBlock. |
| 2464 | inline InsertValueInst(Value *Agg, Value *Val, |
| 2465 | ArrayRef<unsigned> Idxs, |
| 2466 | const Twine &NameStr, |
| 2467 | Instruction *InsertBefore); |
| 2468 | inline InsertValueInst(Value *Agg, Value *Val, |
| 2469 | ArrayRef<unsigned> Idxs, |
| 2470 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 2471 | |
| 2472 | /// Constructors - These two constructors are convenience methods because one |
| 2473 | /// and two index insertvalue instructions are so common. |
| 2474 | InsertValueInst(Value *Agg, Value *Val, unsigned Idx, |
| 2475 | const Twine &NameStr = "", |
| 2476 | Instruction *InsertBefore = nullptr); |
| 2477 | InsertValueInst(Value *Agg, Value *Val, unsigned Idx, const Twine &NameStr, |
| 2478 | BasicBlock *InsertAtEnd); |
| 2479 | |
| 2480 | void init(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs, |
| 2481 | const Twine &NameStr); |
| 2482 | |
| 2483 | protected: |
| 2484 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 2485 | friend class Instruction; |
| 2486 | |
| 2487 | InsertValueInst *cloneImpl() const; |
| 2488 | |
| 2489 | public: |
| 2490 | // allocate space for exactly two operands |
| 2491 | void *operator new(size_t S) { return User::operator new(S, 2); } |
| 2492 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 2493 | |
| 2494 | static InsertValueInst *Create(Value *Agg, Value *Val, |
| 2495 | ArrayRef<unsigned> Idxs, |
| 2496 | const Twine &NameStr = "", |
| 2497 | Instruction *InsertBefore = nullptr) { |
| 2498 | return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertBefore); |
| 2499 | } |
| 2500 | |
| 2501 | static InsertValueInst *Create(Value *Agg, Value *Val, |
| 2502 | ArrayRef<unsigned> Idxs, |
| 2503 | const Twine &NameStr, |
| 2504 | BasicBlock *InsertAtEnd) { |
| 2505 | return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertAtEnd); |
| 2506 | } |
| 2507 | |
| 2508 | /// Transparently provide more efficient getOperand methods. |
| 2509 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 2510 | |
| 2511 | using idx_iterator = const unsigned*; |
| 2512 | |
| 2513 | inline idx_iterator idx_begin() const { return Indices.begin(); } |
| 2514 | inline idx_iterator idx_end() const { return Indices.end(); } |
| 2515 | inline iterator_range<idx_iterator> indices() const { |
| 2516 | return make_range(idx_begin(), idx_end()); |
| 2517 | } |
| 2518 | |
| 2519 | Value *getAggregateOperand() { |
| 2520 | return getOperand(0); |
| 2521 | } |
| 2522 | const Value *getAggregateOperand() const { |
| 2523 | return getOperand(0); |
| 2524 | } |
| 2525 | static unsigned getAggregateOperandIndex() { |
| 2526 | return 0U; // get index for modifying correct operand |
| 2527 | } |
| 2528 | |
| 2529 | Value *getInsertedValueOperand() { |
| 2530 | return getOperand(1); |
| 2531 | } |
| 2532 | const Value *getInsertedValueOperand() const { |
| 2533 | return getOperand(1); |
| 2534 | } |
| 2535 | static unsigned getInsertedValueOperandIndex() { |
| 2536 | return 1U; // get index for modifying correct operand |
| 2537 | } |
| 2538 | |
| 2539 | ArrayRef<unsigned> getIndices() const { |
| 2540 | return Indices; |
| 2541 | } |
| 2542 | |
| 2543 | unsigned getNumIndices() const { |
| 2544 | return (unsigned)Indices.size(); |
| 2545 | } |
| 2546 | |
| 2547 | bool hasIndices() const { |
| 2548 | return true; |
| 2549 | } |
| 2550 | |
| 2551 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 2552 | static bool classof(const Instruction *I) { |
| 2553 | return I->getOpcode() == Instruction::InsertValue; |
| 2554 | } |
| 2555 | static bool classof(const Value *V) { |
| 2556 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 2557 | } |
| 2558 | }; |
| 2559 | |
| 2560 | template <> |
| 2561 | struct OperandTraits<InsertValueInst> : |
| 2562 | public FixedNumOperandTraits<InsertValueInst, 2> { |
| 2563 | }; |
| 2564 | |
| 2565 | InsertValueInst::InsertValueInst(Value *Agg, |
| 2566 | Value *Val, |
| 2567 | ArrayRef<unsigned> Idxs, |
| 2568 | const Twine &NameStr, |
| 2569 | Instruction *InsertBefore) |
| 2570 | : Instruction(Agg->getType(), InsertValue, |
| 2571 | OperandTraits<InsertValueInst>::op_begin(this), |
| 2572 | 2, InsertBefore) { |
| 2573 | init(Agg, Val, Idxs, NameStr); |
| 2574 | } |
| 2575 | |
| 2576 | InsertValueInst::InsertValueInst(Value *Agg, |
| 2577 | Value *Val, |
| 2578 | ArrayRef<unsigned> Idxs, |
| 2579 | const Twine &NameStr, |
| 2580 | BasicBlock *InsertAtEnd) |
| 2581 | : Instruction(Agg->getType(), InsertValue, |
| 2582 | OperandTraits<InsertValueInst>::op_begin(this), |
| 2583 | 2, InsertAtEnd) { |
| 2584 | init(Agg, Val, Idxs, NameStr); |
| 2585 | } |
| 2586 | |
| 2587 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value)InsertValueInst::op_iterator InsertValueInst::op_begin() { return OperandTraits<InsertValueInst>::op_begin(this); } InsertValueInst ::const_op_iterator InsertValueInst::op_begin() const { return OperandTraits<InsertValueInst>::op_begin(const_cast< InsertValueInst*>(this)); } InsertValueInst::op_iterator InsertValueInst ::op_end() { return OperandTraits<InsertValueInst>::op_end (this); } InsertValueInst::const_op_iterator InsertValueInst:: op_end() const { return OperandTraits<InsertValueInst>:: op_end(const_cast<InsertValueInst*>(this)); } Value *InsertValueInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<InsertValueInst>::op_begin (const_cast<InsertValueInst*>(this))[i_nocapture].get() ); } void InsertValueInst::setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void)0); OperandTraits<InsertValueInst >::op_begin(this)[i_nocapture] = Val_nocapture; } unsigned InsertValueInst::getNumOperands() const { return OperandTraits <InsertValueInst>::operands(this); } template <int Idx_nocapture > Use &InsertValueInst::Op() { return this->OpFrom< Idx_nocapture>(this); } template <int Idx_nocapture> const Use &InsertValueInst::Op() const { return this-> OpFrom<Idx_nocapture>(this); } |
| 2588 | |
| 2589 | //===----------------------------------------------------------------------===// |
| 2590 | // PHINode Class |
| 2591 | //===----------------------------------------------------------------------===// |
| 2592 | |
| 2593 | // PHINode - The PHINode class is used to represent the magical mystical PHI |
| 2594 | // node, that can not exist in nature, but can be synthesized in a computer |
| 2595 | // scientist's overactive imagination. |
| 2596 | // |
| 2597 | class PHINode : public Instruction { |
| 2598 | /// The number of operands actually allocated. NumOperands is |
| 2599 | /// the number actually in use. |
| 2600 | unsigned ReservedSpace; |
| 2601 | |
| 2602 | PHINode(const PHINode &PN); |
| 2603 | |
| 2604 | explicit PHINode(Type *Ty, unsigned NumReservedValues, |
| 2605 | const Twine &NameStr = "", |
| 2606 | Instruction *InsertBefore = nullptr) |
| 2607 | : Instruction(Ty, Instruction::PHI, nullptr, 0, InsertBefore), |
| 2608 | ReservedSpace(NumReservedValues) { |
| 2609 | assert(!Ty->isTokenTy() && "PHI nodes cannot have token type!")((void)0); |
| 2610 | setName(NameStr); |
| 2611 | allocHungoffUses(ReservedSpace); |
| 2612 | } |
| 2613 | |
| 2614 | PHINode(Type *Ty, unsigned NumReservedValues, const Twine &NameStr, |
| 2615 | BasicBlock *InsertAtEnd) |
| 2616 | : Instruction(Ty, Instruction::PHI, nullptr, 0, InsertAtEnd), |
| 2617 | ReservedSpace(NumReservedValues) { |
| 2618 | assert(!Ty->isTokenTy() && "PHI nodes cannot have token type!")((void)0); |
| 2619 | setName(NameStr); |
| 2620 | allocHungoffUses(ReservedSpace); |
| 2621 | } |
| 2622 | |
| 2623 | protected: |
| 2624 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 2625 | friend class Instruction; |
| 2626 | |
| 2627 | PHINode *cloneImpl() const; |
| 2628 | |
| 2629 | // allocHungoffUses - this is more complicated than the generic |
| 2630 | // User::allocHungoffUses, because we have to allocate Uses for the incoming |
| 2631 | // values and pointers to the incoming blocks, all in one allocation. |
| 2632 | void allocHungoffUses(unsigned N) { |
| 2633 | User::allocHungoffUses(N, /* IsPhi */ true); |
| 2634 | } |
| 2635 | |
| 2636 | public: |
| 2637 | /// Constructors - NumReservedValues is a hint for the number of incoming |
| 2638 | /// edges that this phi node will have (use 0 if you really have no idea). |
| 2639 | static PHINode *Create(Type *Ty, unsigned NumReservedValues, |
| 2640 | const Twine &NameStr = "", |
| 2641 | Instruction *InsertBefore = nullptr) { |
| 2642 | return new PHINode(Ty, NumReservedValues, NameStr, InsertBefore); |
| 2643 | } |
| 2644 | |
| 2645 | static PHINode *Create(Type *Ty, unsigned NumReservedValues, |
| 2646 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 2647 | return new PHINode(Ty, NumReservedValues, NameStr, InsertAtEnd); |
| 2648 | } |
| 2649 | |
| 2650 | /// Provide fast operand accessors |
| 2651 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 2652 | |
| 2653 | // Block iterator interface. This provides access to the list of incoming |
| 2654 | // basic blocks, which parallels the list of incoming values. |
| 2655 | |
| 2656 | using block_iterator = BasicBlock **; |
| 2657 | using const_block_iterator = BasicBlock * const *; |
| 2658 | |
| 2659 | block_iterator block_begin() { |
| 2660 | return reinterpret_cast<block_iterator>(op_begin() + ReservedSpace); |
| 2661 | } |
| 2662 | |
| 2663 | const_block_iterator block_begin() const { |
| 2664 | return reinterpret_cast<const_block_iterator>(op_begin() + ReservedSpace); |
| 2665 | } |
| 2666 | |
| 2667 | block_iterator block_end() { |
| 2668 | return block_begin() + getNumOperands(); |
| 2669 | } |
| 2670 | |
| 2671 | const_block_iterator block_end() const { |
| 2672 | return block_begin() + getNumOperands(); |
| 2673 | } |
| 2674 | |
| 2675 | iterator_range<block_iterator> blocks() { |
| 2676 | return make_range(block_begin(), block_end()); |
| 2677 | } |
| 2678 | |
| 2679 | iterator_range<const_block_iterator> blocks() const { |
| 2680 | return make_range(block_begin(), block_end()); |
| 2681 | } |
| 2682 | |
| 2683 | op_range incoming_values() { return operands(); } |
| 2684 | |
| 2685 | const_op_range incoming_values() const { return operands(); } |
| 2686 | |
| 2687 | /// Return the number of incoming edges |
| 2688 | /// |
| 2689 | unsigned getNumIncomingValues() const { return getNumOperands(); } |
| 2690 | |
| 2691 | /// Return incoming value number x |
| 2692 | /// |
| 2693 | Value *getIncomingValue(unsigned i) const { |
| 2694 | return getOperand(i); |
| 2695 | } |
| 2696 | void setIncomingValue(unsigned i, Value *V) { |
| 2697 | assert(V && "PHI node got a null value!")((void)0); |
| 2698 | assert(getType() == V->getType() &&((void)0) |
| 2699 | "All operands to PHI node must be the same type as the PHI node!")((void)0); |
| 2700 | setOperand(i, V); |
| 2701 | } |
| 2702 | |
| 2703 | static unsigned getOperandNumForIncomingValue(unsigned i) { |
| 2704 | return i; |
| 2705 | } |
| 2706 | |
| 2707 | static unsigned getIncomingValueNumForOperand(unsigned i) { |
| 2708 | return i; |
| 2709 | } |
| 2710 | |
| 2711 | /// Return incoming basic block number @p i. |
| 2712 | /// |
| 2713 | BasicBlock *getIncomingBlock(unsigned i) const { |
| 2714 | return block_begin()[i]; |
| 2715 | } |
| 2716 | |
| 2717 | /// Return incoming basic block corresponding |
| 2718 | /// to an operand of the PHI. |
| 2719 | /// |
| 2720 | BasicBlock *getIncomingBlock(const Use &U) const { |
| 2721 | assert(this == U.getUser() && "Iterator doesn't point to PHI's Uses?")((void)0); |
| 2722 | return getIncomingBlock(unsigned(&U - op_begin())); |
| 2723 | } |
| 2724 | |
| 2725 | /// Return incoming basic block corresponding |
| 2726 | /// to value use iterator. |
| 2727 | /// |
| 2728 | BasicBlock *getIncomingBlock(Value::const_user_iterator I) const { |
| 2729 | return getIncomingBlock(I.getUse()); |
| 2730 | } |
| 2731 | |
| 2732 | void setIncomingBlock(unsigned i, BasicBlock *BB) { |
| 2733 | assert(BB && "PHI node got a null basic block!")((void)0); |
| 2734 | block_begin()[i] = BB; |
| 2735 | } |
| 2736 | |
| 2737 | /// Replace every incoming basic block \p Old to basic block \p New. |
| 2738 | void replaceIncomingBlockWith(const BasicBlock *Old, BasicBlock *New) { |
| 2739 | assert(New && Old && "PHI node got a null basic block!")((void)0); |
| 2740 | for (unsigned Op = 0, NumOps = getNumOperands(); Op != NumOps; ++Op) |
| 2741 | if (getIncomingBlock(Op) == Old) |
| 2742 | setIncomingBlock(Op, New); |
| 2743 | } |
| 2744 | |
| 2745 | /// Add an incoming value to the end of the PHI list |
| 2746 | /// |
| 2747 | void addIncoming(Value *V, BasicBlock *BB) { |
| 2748 | if (getNumOperands() == ReservedSpace) |
| 2749 | growOperands(); // Get more space! |
| 2750 | // Initialize some new operands. |
| 2751 | setNumHungOffUseOperands(getNumOperands() + 1); |
| 2752 | setIncomingValue(getNumOperands() - 1, V); |
| 2753 | setIncomingBlock(getNumOperands() - 1, BB); |
| 2754 | } |
| 2755 | |
| 2756 | /// Remove an incoming value. This is useful if a |
| 2757 | /// predecessor basic block is deleted. The value removed is returned. |
| 2758 | /// |
| 2759 | /// If the last incoming value for a PHI node is removed (and DeletePHIIfEmpty |
| 2760 | /// is true), the PHI node is destroyed and any uses of it are replaced with |
| 2761 | /// dummy values. The only time there should be zero incoming values to a PHI |
| 2762 | /// node is when the block is dead, so this strategy is sound. |
| 2763 | /// |
| 2764 | Value *removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty = true); |
| 2765 | |
| 2766 | Value *removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty=true) { |
| 2767 | int Idx = getBasicBlockIndex(BB); |
| 2768 | assert(Idx >= 0 && "Invalid basic block argument to remove!")((void)0); |
| 2769 | return removeIncomingValue(Idx, DeletePHIIfEmpty); |
| 2770 | } |
| 2771 | |
| 2772 | /// Return the first index of the specified basic |
| 2773 | /// block in the value list for this PHI. Returns -1 if no instance. |
| 2774 | /// |
| 2775 | int getBasicBlockIndex(const BasicBlock *BB) const { |
| 2776 | for (unsigned i = 0, e = getNumOperands(); i != e; ++i) |
| 2777 | if (block_begin()[i] == BB) |
| 2778 | return i; |
| 2779 | return -1; |
| 2780 | } |
| 2781 | |
| 2782 | Value *getIncomingValueForBlock(const BasicBlock *BB) const { |
| 2783 | int Idx = getBasicBlockIndex(BB); |
| 2784 | assert(Idx >= 0 && "Invalid basic block argument!")((void)0); |
| 2785 | return getIncomingValue(Idx); |
| 2786 | } |
| 2787 | |
| 2788 | /// Set every incoming value(s) for block \p BB to \p V. |
| 2789 | void setIncomingValueForBlock(const BasicBlock *BB, Value *V) { |
| 2790 | assert(BB && "PHI node got a null basic block!")((void)0); |
| 2791 | bool Found = false; |
| 2792 | for (unsigned Op = 0, NumOps = getNumOperands(); Op != NumOps; ++Op) |
| 2793 | if (getIncomingBlock(Op) == BB) { |
| 2794 | Found = true; |
| 2795 | setIncomingValue(Op, V); |
| 2796 | } |
| 2797 | (void)Found; |
| 2798 | assert(Found && "Invalid basic block argument to set!")((void)0); |
| 2799 | } |
| 2800 | |
| 2801 | /// If the specified PHI node always merges together the |
| 2802 | /// same value, return the value, otherwise return null. |
| 2803 | Value *hasConstantValue() const; |
| 2804 | |
| 2805 | /// Whether the specified PHI node always merges |
| 2806 | /// together the same value, assuming undefs are equal to a unique |
| 2807 | /// non-undef value. |
| 2808 | bool hasConstantOrUndefValue() const; |
| 2809 | |
| 2810 | /// If the PHI node is complete which means all of its parent's predecessors |
| 2811 | /// have incoming value in this PHI, return true, otherwise return false. |
| 2812 | bool isComplete() const { |
| 2813 | return llvm::all_of(predecessors(getParent()), |
| 2814 | [this](const BasicBlock *Pred) { |
| 2815 | return getBasicBlockIndex(Pred) >= 0; |
| 2816 | }); |
| 2817 | } |
| 2818 | |
| 2819 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 2820 | static bool classof(const Instruction *I) { |
| 2821 | return I->getOpcode() == Instruction::PHI; |
| 2822 | } |
| 2823 | static bool classof(const Value *V) { |
| 2824 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 2825 | } |
| 2826 | |
| 2827 | private: |
| 2828 | void growOperands(); |
| 2829 | }; |
| 2830 | |
| 2831 | template <> |
| 2832 | struct OperandTraits<PHINode> : public HungoffOperandTraits<2> { |
| 2833 | }; |
| 2834 | |
| 2835 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(PHINode, Value)PHINode::op_iterator PHINode::op_begin() { return OperandTraits <PHINode>::op_begin(this); } PHINode::const_op_iterator PHINode::op_begin() const { return OperandTraits<PHINode> ::op_begin(const_cast<PHINode*>(this)); } PHINode::op_iterator PHINode::op_end() { return OperandTraits<PHINode>::op_end (this); } PHINode::const_op_iterator PHINode::op_end() const { return OperandTraits<PHINode>::op_end(const_cast<PHINode *>(this)); } Value *PHINode::getOperand(unsigned i_nocapture ) const { ((void)0); return cast_or_null<Value>( OperandTraits <PHINode>::op_begin(const_cast<PHINode*>(this))[i_nocapture ].get()); } void PHINode::setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void)0); OperandTraits<PHINode>::op_begin (this)[i_nocapture] = Val_nocapture; } unsigned PHINode::getNumOperands () const { return OperandTraits<PHINode>::operands(this ); } template <int Idx_nocapture> Use &PHINode::Op( ) { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &PHINode::Op() const { return this->OpFrom<Idx_nocapture>(this); } |
| 2836 | |
| 2837 | //===----------------------------------------------------------------------===// |
| 2838 | // LandingPadInst Class |
| 2839 | //===----------------------------------------------------------------------===// |
| 2840 | |
| 2841 | //===--------------------------------------------------------------------------- |
| 2842 | /// The landingpad instruction holds all of the information |
| 2843 | /// necessary to generate correct exception handling. The landingpad instruction |
| 2844 | /// cannot be moved from the top of a landing pad block, which itself is |
| 2845 | /// accessible only from the 'unwind' edge of an invoke. This uses the |
| 2846 | /// SubclassData field in Value to store whether or not the landingpad is a |
| 2847 | /// cleanup. |
| 2848 | /// |
| 2849 | class LandingPadInst : public Instruction { |
| 2850 | using CleanupField = BoolBitfieldElementT<0>; |
| 2851 | |
| 2852 | /// The number of operands actually allocated. NumOperands is |
| 2853 | /// the number actually in use. |
| 2854 | unsigned ReservedSpace; |
| 2855 | |
| 2856 | LandingPadInst(const LandingPadInst &LP); |
| 2857 | |
| 2858 | public: |
| 2859 | enum ClauseType { Catch, Filter }; |
| 2860 | |
| 2861 | private: |
| 2862 | explicit LandingPadInst(Type *RetTy, unsigned NumReservedValues, |
| 2863 | const Twine &NameStr, Instruction *InsertBefore); |
| 2864 | explicit LandingPadInst(Type *RetTy, unsigned NumReservedValues, |
| 2865 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 2866 | |
| 2867 | // Allocate space for exactly zero operands. |
| 2868 | void *operator new(size_t S) { return User::operator new(S); } |
| 2869 | |
| 2870 | void growOperands(unsigned Size); |
| 2871 | void init(unsigned NumReservedValues, const Twine &NameStr); |
| 2872 | |
| 2873 | protected: |
| 2874 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 2875 | friend class Instruction; |
| 2876 | |
| 2877 | LandingPadInst *cloneImpl() const; |
| 2878 | |
| 2879 | public: |
| 2880 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 2881 | |
| 2882 | /// Constructors - NumReservedClauses is a hint for the number of incoming |
| 2883 | /// clauses that this landingpad will have (use 0 if you really have no idea). |
| 2884 | static LandingPadInst *Create(Type *RetTy, unsigned NumReservedClauses, |
| 2885 | const Twine &NameStr = "", |
| 2886 | Instruction *InsertBefore = nullptr); |
| 2887 | static LandingPadInst *Create(Type *RetTy, unsigned NumReservedClauses, |
| 2888 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 2889 | |
| 2890 | /// Provide fast operand accessors |
| 2891 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 2892 | |
| 2893 | /// Return 'true' if this landingpad instruction is a |
| 2894 | /// cleanup. I.e., it should be run when unwinding even if its landing pad |
| 2895 | /// doesn't catch the exception. |
| 2896 | bool isCleanup() const { return getSubclassData<CleanupField>(); } |
| 2897 | |
| 2898 | /// Indicate that this landingpad instruction is a cleanup. |
| 2899 | void setCleanup(bool V) { setSubclassData<CleanupField>(V); } |
| 2900 | |
| 2901 | /// Add a catch or filter clause to the landing pad. |
| 2902 | void addClause(Constant *ClauseVal); |
| 2903 | |
| 2904 | /// Get the value of the clause at index Idx. Use isCatch/isFilter to |
| 2905 | /// determine what type of clause this is. |
| 2906 | Constant *getClause(unsigned Idx) const { |
| 2907 | return cast<Constant>(getOperandList()[Idx]); |
| 2908 | } |
| 2909 | |
| 2910 | /// Return 'true' if the clause and index Idx is a catch clause. |
| 2911 | bool isCatch(unsigned Idx) const { |
| 2912 | return !isa<ArrayType>(getOperandList()[Idx]->getType()); |
| 2913 | } |
| 2914 | |
| 2915 | /// Return 'true' if the clause and index Idx is a filter clause. |
| 2916 | bool isFilter(unsigned Idx) const { |
| 2917 | return isa<ArrayType>(getOperandList()[Idx]->getType()); |
| 2918 | } |
| 2919 | |
| 2920 | /// Get the number of clauses for this landing pad. |
| 2921 | unsigned getNumClauses() const { return getNumOperands(); } |
| 2922 | |
| 2923 | /// Grow the size of the operand list to accommodate the new |
| 2924 | /// number of clauses. |
| 2925 | void reserveClauses(unsigned Size) { growOperands(Size); } |
| 2926 | |
| 2927 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 2928 | static bool classof(const Instruction *I) { |
| 2929 | return I->getOpcode() == Instruction::LandingPad; |
| 2930 | } |
| 2931 | static bool classof(const Value *V) { |
| 2932 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 2933 | } |
| 2934 | }; |
| 2935 | |
| 2936 | template <> |
| 2937 | struct OperandTraits<LandingPadInst> : public HungoffOperandTraits<1> { |
| 2938 | }; |
| 2939 | |
| 2940 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(LandingPadInst, Value)LandingPadInst::op_iterator LandingPadInst::op_begin() { return OperandTraits<LandingPadInst>::op_begin(this); } LandingPadInst ::const_op_iterator LandingPadInst::op_begin() const { return OperandTraits<LandingPadInst>::op_begin(const_cast< LandingPadInst*>(this)); } LandingPadInst::op_iterator LandingPadInst ::op_end() { return OperandTraits<LandingPadInst>::op_end (this); } LandingPadInst::const_op_iterator LandingPadInst::op_end () const { return OperandTraits<LandingPadInst>::op_end (const_cast<LandingPadInst*>(this)); } Value *LandingPadInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<LandingPadInst>::op_begin( const_cast<LandingPadInst*>(this))[i_nocapture].get()); } void LandingPadInst::setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void)0); OperandTraits<LandingPadInst >::op_begin(this)[i_nocapture] = Val_nocapture; } unsigned LandingPadInst::getNumOperands() const { return OperandTraits <LandingPadInst>::operands(this); } template <int Idx_nocapture > Use &LandingPadInst::Op() { return this->OpFrom< Idx_nocapture>(this); } template <int Idx_nocapture> const Use &LandingPadInst::Op() const { return this-> OpFrom<Idx_nocapture>(this); } |
| 2941 | |
| 2942 | //===----------------------------------------------------------------------===// |
| 2943 | // ReturnInst Class |
| 2944 | //===----------------------------------------------------------------------===// |
| 2945 | |
| 2946 | //===--------------------------------------------------------------------------- |
| 2947 | /// Return a value (possibly void), from a function. Execution |
| 2948 | /// does not continue in this function any longer. |
| 2949 | /// |
| 2950 | class ReturnInst : public Instruction { |
| 2951 | ReturnInst(const ReturnInst &RI); |
| 2952 | |
| 2953 | private: |
| 2954 | // ReturnInst constructors: |
| 2955 | // ReturnInst() - 'ret void' instruction |
| 2956 | // ReturnInst( null) - 'ret void' instruction |
| 2957 | // ReturnInst(Value* X) - 'ret X' instruction |
| 2958 | // ReturnInst( null, Inst *I) - 'ret void' instruction, insert before I |
| 2959 | // ReturnInst(Value* X, Inst *I) - 'ret X' instruction, insert before I |
| 2960 | // ReturnInst( null, BB *B) - 'ret void' instruction, insert @ end of B |
| 2961 | // ReturnInst(Value* X, BB *B) - 'ret X' instruction, insert @ end of B |
| 2962 | // |
| 2963 | // NOTE: If the Value* passed is of type void then the constructor behaves as |
| 2964 | // if it was passed NULL. |
| 2965 | explicit ReturnInst(LLVMContext &C, Value *retVal = nullptr, |
| 2966 | Instruction *InsertBefore = nullptr); |
| 2967 | ReturnInst(LLVMContext &C, Value *retVal, BasicBlock *InsertAtEnd); |
| 2968 | explicit ReturnInst(LLVMContext &C, BasicBlock *InsertAtEnd); |
| 2969 | |
| 2970 | protected: |
| 2971 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 2972 | friend class Instruction; |
| 2973 | |
| 2974 | ReturnInst *cloneImpl() const; |
| 2975 | |
| 2976 | public: |
| 2977 | static ReturnInst* Create(LLVMContext &C, Value *retVal = nullptr, |
| 2978 | Instruction *InsertBefore = nullptr) { |
| 2979 | return new(!!retVal) ReturnInst(C, retVal, InsertBefore); |
| 2980 | } |
| 2981 | |
| 2982 | static ReturnInst* Create(LLVMContext &C, Value *retVal, |
| 2983 | BasicBlock *InsertAtEnd) { |
| 2984 | return new(!!retVal) ReturnInst(C, retVal, InsertAtEnd); |
| 2985 | } |
| 2986 | |
| 2987 | static ReturnInst* Create(LLVMContext &C, BasicBlock *InsertAtEnd) { |
| 2988 | return new(0) ReturnInst(C, InsertAtEnd); |
| 2989 | } |
| 2990 | |
| 2991 | /// Provide fast operand accessors |
| 2992 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 2993 | |
| 2994 | /// Convenience accessor. Returns null if there is no return value. |
| 2995 | Value *getReturnValue() const { |
| 2996 | return getNumOperands() != 0 ? getOperand(0) : nullptr; |
| 2997 | } |
| 2998 | |
| 2999 | unsigned getNumSuccessors() const { return 0; } |
| 3000 | |
| 3001 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 3002 | static bool classof(const Instruction *I) { |
| 3003 | return (I->getOpcode() == Instruction::Ret); |
| 3004 | } |
| 3005 | static bool classof(const Value *V) { |
| 3006 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 3007 | } |
| 3008 | |
| 3009 | private: |
| 3010 | BasicBlock *getSuccessor(unsigned idx) const { |
| 3011 | llvm_unreachable("ReturnInst has no successors!")__builtin_unreachable(); |
| 3012 | } |
| 3013 | |
| 3014 | void setSuccessor(unsigned idx, BasicBlock *B) { |
| 3015 | llvm_unreachable("ReturnInst has no successors!")__builtin_unreachable(); |
| 3016 | } |
| 3017 | }; |
| 3018 | |
| 3019 | template <> |
| 3020 | struct OperandTraits<ReturnInst> : public VariadicOperandTraits<ReturnInst> { |
| 3021 | }; |
| 3022 | |
| 3023 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ReturnInst, Value)ReturnInst::op_iterator ReturnInst::op_begin() { return OperandTraits <ReturnInst>::op_begin(this); } ReturnInst::const_op_iterator ReturnInst::op_begin() const { return OperandTraits<ReturnInst >::op_begin(const_cast<ReturnInst*>(this)); } ReturnInst ::op_iterator ReturnInst::op_end() { return OperandTraits< ReturnInst>::op_end(this); } ReturnInst::const_op_iterator ReturnInst::op_end() const { return OperandTraits<ReturnInst >::op_end(const_cast<ReturnInst*>(this)); } Value *ReturnInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<ReturnInst>::op_begin(const_cast <ReturnInst*>(this))[i_nocapture].get()); } void ReturnInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<ReturnInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned ReturnInst::getNumOperands() const { return OperandTraits<ReturnInst>::operands(this); } template <int Idx_nocapture> Use &ReturnInst::Op() { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &ReturnInst::Op() const { return this->OpFrom<Idx_nocapture>(this); } |
| 3024 | |
| 3025 | //===----------------------------------------------------------------------===// |
| 3026 | // BranchInst Class |
| 3027 | //===----------------------------------------------------------------------===// |
| 3028 | |
| 3029 | //===--------------------------------------------------------------------------- |
| 3030 | /// Conditional or Unconditional Branch instruction. |
| 3031 | /// |
| 3032 | class BranchInst : public Instruction { |
| 3033 | /// Ops list - Branches are strange. The operands are ordered: |
| 3034 | /// [Cond, FalseDest,] TrueDest. This makes some accessors faster because |
| 3035 | /// they don't have to check for cond/uncond branchness. These are mostly |
| 3036 | /// accessed relative from op_end(). |
| 3037 | BranchInst(const BranchInst &BI); |
| 3038 | // BranchInst constructors (where {B, T, F} are blocks, and C is a condition): |
| 3039 | // BranchInst(BB *B) - 'br B' |
| 3040 | // BranchInst(BB* T, BB *F, Value *C) - 'br C, T, F' |
| 3041 | // BranchInst(BB* B, Inst *I) - 'br B' insert before I |
| 3042 | // BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I |
| 3043 | // BranchInst(BB* B, BB *I) - 'br B' insert at end |
| 3044 | // BranchInst(BB* T, BB *F, Value *C, BB *I) - 'br C, T, F', insert at end |
| 3045 | explicit BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = nullptr); |
| 3046 | BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond, |
| 3047 | Instruction *InsertBefore = nullptr); |
| 3048 | BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd); |
| 3049 | BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond, |
| 3050 | BasicBlock *InsertAtEnd); |
| 3051 | |
| 3052 | void AssertOK(); |
| 3053 | |
| 3054 | protected: |
| 3055 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 3056 | friend class Instruction; |
| 3057 | |
| 3058 | BranchInst *cloneImpl() const; |
| 3059 | |
| 3060 | public: |
| 3061 | /// Iterator type that casts an operand to a basic block. |
| 3062 | /// |
| 3063 | /// This only makes sense because the successors are stored as adjacent |
| 3064 | /// operands for branch instructions. |
| 3065 | struct succ_op_iterator |
| 3066 | : iterator_adaptor_base<succ_op_iterator, value_op_iterator, |
| 3067 | std::random_access_iterator_tag, BasicBlock *, |
| 3068 | ptrdiff_t, BasicBlock *, BasicBlock *> { |
| 3069 | explicit succ_op_iterator(value_op_iterator I) : iterator_adaptor_base(I) {} |
| 3070 | |
| 3071 | BasicBlock *operator*() const { return cast<BasicBlock>(*I); } |
| 3072 | BasicBlock *operator->() const { return operator*(); } |
| 3073 | }; |
| 3074 | |
| 3075 | /// The const version of `succ_op_iterator`. |
| 3076 | struct const_succ_op_iterator |
| 3077 | : iterator_adaptor_base<const_succ_op_iterator, const_value_op_iterator, |
| 3078 | std::random_access_iterator_tag, |
| 3079 | const BasicBlock *, ptrdiff_t, const BasicBlock *, |
| 3080 | const BasicBlock *> { |
| 3081 | explicit const_succ_op_iterator(const_value_op_iterator I) |
| 3082 | : iterator_adaptor_base(I) {} |
| 3083 | |
| 3084 | const BasicBlock *operator*() const { return cast<BasicBlock>(*I); } |
| 3085 | const BasicBlock *operator->() const { return operator*(); } |
| 3086 | }; |
| 3087 | |
| 3088 | static BranchInst *Create(BasicBlock *IfTrue, |
| 3089 | Instruction *InsertBefore = nullptr) { |
| 3090 | return new(1) BranchInst(IfTrue, InsertBefore); |
| 3091 | } |
| 3092 | |
| 3093 | static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse, |
| 3094 | Value *Cond, Instruction *InsertBefore = nullptr) { |
| 3095 | return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertBefore); |
| 3096 | } |
| 3097 | |
| 3098 | static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *InsertAtEnd) { |
| 3099 | return new(1) BranchInst(IfTrue, InsertAtEnd); |
| 3100 | } |
| 3101 | |
| 3102 | static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse, |
| 3103 | Value *Cond, BasicBlock *InsertAtEnd) { |
| 3104 | return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertAtEnd); |
| 3105 | } |
| 3106 | |
| 3107 | /// Transparently provide more efficient getOperand methods. |
| 3108 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 3109 | |
| 3110 | bool isUnconditional() const { return getNumOperands() == 1; } |
| 3111 | bool isConditional() const { return getNumOperands() == 3; } |
| 3112 | |
| 3113 | Value *getCondition() const { |
| 3114 | assert(isConditional() && "Cannot get condition of an uncond branch!")((void)0); |
| 3115 | return Op<-3>(); |
| 3116 | } |
| 3117 | |
| 3118 | void setCondition(Value *V) { |
| 3119 | assert(isConditional() && "Cannot set condition of unconditional branch!")((void)0); |
| 3120 | Op<-3>() = V; |
| 3121 | } |
| 3122 | |
| 3123 | unsigned getNumSuccessors() const { return 1+isConditional(); } |
| 3124 | |
| 3125 | BasicBlock *getSuccessor(unsigned i) const { |
| 3126 | assert(i < getNumSuccessors() && "Successor # out of range for Branch!")((void)0); |
| 3127 | return cast_or_null<BasicBlock>((&Op<-1>() - i)->get()); |
| 3128 | } |
| 3129 | |
| 3130 | void setSuccessor(unsigned idx, BasicBlock *NewSucc) { |
| 3131 | assert(idx < getNumSuccessors() && "Successor # out of range for Branch!")((void)0); |
| 3132 | *(&Op<-1>() - idx) = NewSucc; |
| 3133 | } |
| 3134 | |
| 3135 | /// Swap the successors of this branch instruction. |
| 3136 | /// |
| 3137 | /// Swaps the successors of the branch instruction. This also swaps any |
| 3138 | /// branch weight metadata associated with the instruction so that it |
| 3139 | /// continues to map correctly to each operand. |
| 3140 | void swapSuccessors(); |
| 3141 | |
| 3142 | iterator_range<succ_op_iterator> successors() { |
| 3143 | return make_range( |
| 3144 | succ_op_iterator(std::next(value_op_begin(), isConditional() ? 1 : 0)), |
| 3145 | succ_op_iterator(value_op_end())); |
| 3146 | } |
| 3147 | |
| 3148 | iterator_range<const_succ_op_iterator> successors() const { |
| 3149 | return make_range(const_succ_op_iterator( |
| 3150 | std::next(value_op_begin(), isConditional() ? 1 : 0)), |
| 3151 | const_succ_op_iterator(value_op_end())); |
| 3152 | } |
| 3153 | |
| 3154 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 3155 | static bool classof(const Instruction *I) { |
| 3156 | return (I->getOpcode() == Instruction::Br); |
| 3157 | } |
| 3158 | static bool classof(const Value *V) { |
| 3159 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 3160 | } |
| 3161 | }; |
| 3162 | |
| 3163 | template <> |
| 3164 | struct OperandTraits<BranchInst> : public VariadicOperandTraits<BranchInst, 1> { |
| 3165 | }; |
| 3166 | |
| 3167 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BranchInst, Value)BranchInst::op_iterator BranchInst::op_begin() { return OperandTraits <BranchInst>::op_begin(this); } BranchInst::const_op_iterator BranchInst::op_begin() const { return OperandTraits<BranchInst >::op_begin(const_cast<BranchInst*>(this)); } BranchInst ::op_iterator BranchInst::op_end() { return OperandTraits< BranchInst>::op_end(this); } BranchInst::const_op_iterator BranchInst::op_end() const { return OperandTraits<BranchInst >::op_end(const_cast<BranchInst*>(this)); } Value *BranchInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<BranchInst>::op_begin(const_cast <BranchInst*>(this))[i_nocapture].get()); } void BranchInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<BranchInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned BranchInst::getNumOperands() const { return OperandTraits<BranchInst>::operands(this); } template <int Idx_nocapture> Use &BranchInst::Op() { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &BranchInst::Op() const { return this->OpFrom<Idx_nocapture>(this); } |
| 3168 | |
| 3169 | //===----------------------------------------------------------------------===// |
| 3170 | // SwitchInst Class |
| 3171 | //===----------------------------------------------------------------------===// |
| 3172 | |
| 3173 | //===--------------------------------------------------------------------------- |
| 3174 | /// Multiway switch |
| 3175 | /// |
| 3176 | class SwitchInst : public Instruction { |
| 3177 | unsigned ReservedSpace; |
| 3178 | |
| 3179 | // Operand[0] = Value to switch on |
| 3180 | // Operand[1] = Default basic block destination |
| 3181 | // Operand[2n ] = Value to match |
| 3182 | // Operand[2n+1] = BasicBlock to go to on match |
| 3183 | SwitchInst(const SwitchInst &SI); |
| 3184 | |
| 3185 | /// Create a new switch instruction, specifying a value to switch on and a |
| 3186 | /// default destination. The number of additional cases can be specified here |
| 3187 | /// to make memory allocation more efficient. This constructor can also |
| 3188 | /// auto-insert before another instruction. |
| 3189 | SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases, |
| 3190 | Instruction *InsertBefore); |
| 3191 | |
| 3192 | /// Create a new switch instruction, specifying a value to switch on and a |
| 3193 | /// default destination. The number of additional cases can be specified here |
| 3194 | /// to make memory allocation more efficient. This constructor also |
| 3195 | /// auto-inserts at the end of the specified BasicBlock. |
| 3196 | SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases, |
| 3197 | BasicBlock *InsertAtEnd); |
| 3198 | |
| 3199 | // allocate space for exactly zero operands |
| 3200 | void *operator new(size_t S) { return User::operator new(S); } |
| 3201 | |
| 3202 | void init(Value *Value, BasicBlock *Default, unsigned NumReserved); |
| 3203 | void growOperands(); |
| 3204 | |
| 3205 | protected: |
| 3206 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 3207 | friend class Instruction; |
| 3208 | |
| 3209 | SwitchInst *cloneImpl() const; |
| 3210 | |
| 3211 | public: |
| 3212 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 3213 | |
| 3214 | // -2 |
| 3215 | static const unsigned DefaultPseudoIndex = static_cast<unsigned>(~0L-1); |
| 3216 | |
| 3217 | template <typename CaseHandleT> class CaseIteratorImpl; |
| 3218 | |
| 3219 | /// A handle to a particular switch case. It exposes a convenient interface |
| 3220 | /// to both the case value and the successor block. |
| 3221 | /// |
| 3222 | /// We define this as a template and instantiate it to form both a const and |
| 3223 | /// non-const handle. |
| 3224 | template <typename SwitchInstT, typename ConstantIntT, typename BasicBlockT> |
| 3225 | class CaseHandleImpl { |
| 3226 | // Directly befriend both const and non-const iterators. |
| 3227 | friend class SwitchInst::CaseIteratorImpl< |
| 3228 | CaseHandleImpl<SwitchInstT, ConstantIntT, BasicBlockT>>; |
| 3229 | |
| 3230 | protected: |
| 3231 | // Expose the switch type we're parameterized with to the iterator. |
| 3232 | using SwitchInstType = SwitchInstT; |
| 3233 | |
| 3234 | SwitchInstT *SI; |
| 3235 | ptrdiff_t Index; |
| 3236 | |
| 3237 | CaseHandleImpl() = default; |
| 3238 | CaseHandleImpl(SwitchInstT *SI, ptrdiff_t Index) : SI(SI), Index(Index) {} |
| 3239 | |
| 3240 | public: |
| 3241 | /// Resolves case value for current case. |
| 3242 | ConstantIntT *getCaseValue() const { |
| 3243 | assert((unsigned)Index < SI->getNumCases() &&((void)0) |
| 3244 | "Index out the number of cases.")((void)0); |
| 3245 | return reinterpret_cast<ConstantIntT *>(SI->getOperand(2 + Index * 2)); |
| 3246 | } |
| 3247 | |
| 3248 | /// Resolves successor for current case. |
| 3249 | BasicBlockT *getCaseSuccessor() const { |
| 3250 | assert(((unsigned)Index < SI->getNumCases() ||((void)0) |
| 3251 | (unsigned)Index == DefaultPseudoIndex) &&((void)0) |
| 3252 | "Index out the number of cases.")((void)0); |
| 3253 | return SI->getSuccessor(getSuccessorIndex()); |
| 3254 | } |
| 3255 | |
| 3256 | /// Returns number of current case. |
| 3257 | unsigned getCaseIndex() const { return Index; } |
| 3258 | |
| 3259 | /// Returns successor index for current case successor. |
| 3260 | unsigned getSuccessorIndex() const { |
| 3261 | assert(((unsigned)Index == DefaultPseudoIndex ||((void)0) |
| 3262 | (unsigned)Index < SI->getNumCases()) &&((void)0) |
| 3263 | "Index out the number of cases.")((void)0); |
| 3264 | return (unsigned)Index != DefaultPseudoIndex ? Index + 1 : 0; |
| 3265 | } |
| 3266 | |
| 3267 | bool operator==(const CaseHandleImpl &RHS) const { |
| 3268 | assert(SI == RHS.SI && "Incompatible operators.")((void)0); |
| 3269 | return Index == RHS.Index; |
| 3270 | } |
| 3271 | }; |
| 3272 | |
| 3273 | using ConstCaseHandle = |
| 3274 | CaseHandleImpl<const SwitchInst, const ConstantInt, const BasicBlock>; |
| 3275 | |
| 3276 | class CaseHandle |
| 3277 | : public CaseHandleImpl<SwitchInst, ConstantInt, BasicBlock> { |
| 3278 | friend class SwitchInst::CaseIteratorImpl<CaseHandle>; |
| 3279 | |
| 3280 | public: |
| 3281 | CaseHandle(SwitchInst *SI, ptrdiff_t Index) : CaseHandleImpl(SI, Index) {} |
| 3282 | |
| 3283 | /// Sets the new value for current case. |
| 3284 | void setValue(ConstantInt *V) { |
| 3285 | assert((unsigned)Index < SI->getNumCases() &&((void)0) |
| 3286 | "Index out the number of cases.")((void)0); |
| 3287 | SI->setOperand(2 + Index*2, reinterpret_cast<Value*>(V)); |
| 3288 | } |
| 3289 | |
| 3290 | /// Sets the new successor for current case. |
| 3291 | void setSuccessor(BasicBlock *S) { |
| 3292 | SI->setSuccessor(getSuccessorIndex(), S); |
| 3293 | } |
| 3294 | }; |
| 3295 | |
| 3296 | template <typename CaseHandleT> |
| 3297 | class CaseIteratorImpl |
| 3298 | : public iterator_facade_base<CaseIteratorImpl<CaseHandleT>, |
| 3299 | std::random_access_iterator_tag, |
| 3300 | CaseHandleT> { |
| 3301 | using SwitchInstT = typename CaseHandleT::SwitchInstType; |
| 3302 | |
| 3303 | CaseHandleT Case; |
| 3304 | |
| 3305 | public: |
| 3306 | /// Default constructed iterator is in an invalid state until assigned to |
| 3307 | /// a case for a particular switch. |
| 3308 | CaseIteratorImpl() = default; |
| 3309 | |
| 3310 | /// Initializes case iterator for given SwitchInst and for given |
| 3311 | /// case number. |
| 3312 | CaseIteratorImpl(SwitchInstT *SI, unsigned CaseNum) : Case(SI, CaseNum) {} |
| 3313 | |
| 3314 | /// Initializes case iterator for given SwitchInst and for given |
| 3315 | /// successor index. |
| 3316 | static CaseIteratorImpl fromSuccessorIndex(SwitchInstT *SI, |
| 3317 | unsigned SuccessorIndex) { |
| 3318 | assert(SuccessorIndex < SI->getNumSuccessors() &&((void)0) |
| 3319 | "Successor index # out of range!")((void)0); |
| 3320 | return SuccessorIndex != 0 ? CaseIteratorImpl(SI, SuccessorIndex - 1) |
| 3321 | : CaseIteratorImpl(SI, DefaultPseudoIndex); |
| 3322 | } |
| 3323 | |
| 3324 | /// Support converting to the const variant. This will be a no-op for const |
| 3325 | /// variant. |
| 3326 | operator CaseIteratorImpl<ConstCaseHandle>() const { |
| 3327 | return CaseIteratorImpl<ConstCaseHandle>(Case.SI, Case.Index); |
| 3328 | } |
| 3329 | |
| 3330 | CaseIteratorImpl &operator+=(ptrdiff_t N) { |
| 3331 | // Check index correctness after addition. |
| 3332 | // Note: Index == getNumCases() means end(). |
| 3333 | assert(Case.Index + N >= 0 &&((void)0) |
| 3334 | (unsigned)(Case.Index + N) <= Case.SI->getNumCases() &&((void)0) |
| 3335 | "Case.Index out the number of cases.")((void)0); |
| 3336 | Case.Index += N; |
| 3337 | return *this; |
| 3338 | } |
| 3339 | CaseIteratorImpl &operator-=(ptrdiff_t N) { |
| 3340 | // Check index correctness after subtraction. |
| 3341 | // Note: Case.Index == getNumCases() means end(). |
| 3342 | assert(Case.Index - N >= 0 &&((void)0) |
| 3343 | (unsigned)(Case.Index - N) <= Case.SI->getNumCases() &&((void)0) |
| 3344 | "Case.Index out the number of cases.")((void)0); |
| 3345 | Case.Index -= N; |
| 3346 | return *this; |
| 3347 | } |
| 3348 | ptrdiff_t operator-(const CaseIteratorImpl &RHS) const { |
| 3349 | assert(Case.SI == RHS.Case.SI && "Incompatible operators.")((void)0); |
| 3350 | return Case.Index - RHS.Case.Index; |
| 3351 | } |
| 3352 | bool operator==(const CaseIteratorImpl &RHS) const { |
| 3353 | return Case == RHS.Case; |
| 3354 | } |
| 3355 | bool operator<(const CaseIteratorImpl &RHS) const { |
| 3356 | assert(Case.SI == RHS.Case.SI && "Incompatible operators.")((void)0); |
| 3357 | return Case.Index < RHS.Case.Index; |
| 3358 | } |
| 3359 | CaseHandleT &operator*() { return Case; } |
| 3360 | const CaseHandleT &operator*() const { return Case; } |
| 3361 | }; |
| 3362 | |
| 3363 | using CaseIt = CaseIteratorImpl<CaseHandle>; |
| 3364 | using ConstCaseIt = CaseIteratorImpl<ConstCaseHandle>; |
| 3365 | |
| 3366 | static SwitchInst *Create(Value *Value, BasicBlock *Default, |
| 3367 | unsigned NumCases, |
| 3368 | Instruction *InsertBefore = nullptr) { |
| 3369 | return new SwitchInst(Value, Default, NumCases, InsertBefore); |
| 3370 | } |
| 3371 | |
| 3372 | static SwitchInst *Create(Value *Value, BasicBlock *Default, |
| 3373 | unsigned NumCases, BasicBlock *InsertAtEnd) { |
| 3374 | return new SwitchInst(Value, Default, NumCases, InsertAtEnd); |
| 3375 | } |
| 3376 | |
| 3377 | /// Provide fast operand accessors |
| 3378 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 3379 | |
| 3380 | // Accessor Methods for Switch stmt |
| 3381 | Value *getCondition() const { return getOperand(0); } |
| 3382 | void setCondition(Value *V) { setOperand(0, V); } |
| 3383 | |
| 3384 | BasicBlock *getDefaultDest() const { |
| 3385 | return cast<BasicBlock>(getOperand(1)); |
| 3386 | } |
| 3387 | |
| 3388 | void setDefaultDest(BasicBlock *DefaultCase) { |
| 3389 | setOperand(1, reinterpret_cast<Value*>(DefaultCase)); |
| 3390 | } |
| 3391 | |
| 3392 | /// Return the number of 'cases' in this switch instruction, excluding the |
| 3393 | /// default case. |
| 3394 | unsigned getNumCases() const { |
| 3395 | return getNumOperands()/2 - 1; |
| 3396 | } |
| 3397 | |
| 3398 | /// Returns a read/write iterator that points to the first case in the |
| 3399 | /// SwitchInst. |
| 3400 | CaseIt case_begin() { |
| 3401 | return CaseIt(this, 0); |
| 3402 | } |
| 3403 | |
| 3404 | /// Returns a read-only iterator that points to the first case in the |
| 3405 | /// SwitchInst. |
| 3406 | ConstCaseIt case_begin() const { |
| 3407 | return ConstCaseIt(this, 0); |
| 3408 | } |
| 3409 | |
| 3410 | /// Returns a read/write iterator that points one past the last in the |
| 3411 | /// SwitchInst. |
| 3412 | CaseIt case_end() { |
| 3413 | return CaseIt(this, getNumCases()); |
| 3414 | } |
| 3415 | |
| 3416 | /// Returns a read-only iterator that points one past the last in the |
| 3417 | /// SwitchInst. |
| 3418 | ConstCaseIt case_end() const { |
| 3419 | return ConstCaseIt(this, getNumCases()); |
| 3420 | } |
| 3421 | |
| 3422 | /// Iteration adapter for range-for loops. |
| 3423 | iterator_range<CaseIt> cases() { |
| 3424 | return make_range(case_begin(), case_end()); |
| 3425 | } |
| 3426 | |
| 3427 | /// Constant iteration adapter for range-for loops. |
| 3428 | iterator_range<ConstCaseIt> cases() const { |
| 3429 | return make_range(case_begin(), case_end()); |
| 3430 | } |
| 3431 | |
| 3432 | /// Returns an iterator that points to the default case. |
| 3433 | /// Note: this iterator allows to resolve successor only. Attempt |
| 3434 | /// to resolve case value causes an assertion. |
| 3435 | /// Also note, that increment and decrement also causes an assertion and |
| 3436 | /// makes iterator invalid. |
| 3437 | CaseIt case_default() { |
| 3438 | return CaseIt(this, DefaultPseudoIndex); |
| 3439 | } |
| 3440 | ConstCaseIt case_default() const { |
| 3441 | return ConstCaseIt(this, DefaultPseudoIndex); |
| 3442 | } |
| 3443 | |
| 3444 | /// Search all of the case values for the specified constant. If it is |
| 3445 | /// explicitly handled, return the case iterator of it, otherwise return |
| 3446 | /// default case iterator to indicate that it is handled by the default |
| 3447 | /// handler. |
| 3448 | CaseIt findCaseValue(const ConstantInt *C) { |
| 3449 | CaseIt I = llvm::find_if( |
| 3450 | cases(), [C](CaseHandle &Case) { return Case.getCaseValue() == C; }); |
| 3451 | if (I != case_end()) |
| 3452 | return I; |
| 3453 | |
| 3454 | return case_default(); |
| 3455 | } |
| 3456 | ConstCaseIt findCaseValue(const ConstantInt *C) const { |
| 3457 | ConstCaseIt I = llvm::find_if(cases(), [C](ConstCaseHandle &Case) { |
| 3458 | return Case.getCaseValue() == C; |
| 3459 | }); |
| 3460 | if (I != case_end()) |
| 3461 | return I; |
| 3462 | |
| 3463 | return case_default(); |
| 3464 | } |
| 3465 | |
| 3466 | /// Finds the unique case value for a given successor. Returns null if the |
| 3467 | /// successor is not found, not unique, or is the default case. |
| 3468 | ConstantInt *findCaseDest(BasicBlock *BB) { |
| 3469 | if (BB == getDefaultDest()) |
| 3470 | return nullptr; |
| 3471 | |
| 3472 | ConstantInt *CI = nullptr; |
| 3473 | for (auto Case : cases()) { |
| 3474 | if (Case.getCaseSuccessor() != BB) |
| 3475 | continue; |
| 3476 | |
| 3477 | if (CI) |
| 3478 | return nullptr; // Multiple cases lead to BB. |
| 3479 | |
| 3480 | CI = Case.getCaseValue(); |
| 3481 | } |
| 3482 | |
| 3483 | return CI; |
| 3484 | } |
| 3485 | |
| 3486 | /// Add an entry to the switch instruction. |
| 3487 | /// Note: |
| 3488 | /// This action invalidates case_end(). Old case_end() iterator will |
| 3489 | /// point to the added case. |
| 3490 | void addCase(ConstantInt *OnVal, BasicBlock *Dest); |
| 3491 | |
| 3492 | /// This method removes the specified case and its successor from the switch |
| 3493 | /// instruction. Note that this operation may reorder the remaining cases at |
| 3494 | /// index idx and above. |
| 3495 | /// Note: |
| 3496 | /// This action invalidates iterators for all cases following the one removed, |
| 3497 | /// including the case_end() iterator. It returns an iterator for the next |
| 3498 | /// case. |
| 3499 | CaseIt removeCase(CaseIt I); |
| 3500 | |
| 3501 | unsigned getNumSuccessors() const { return getNumOperands()/2; } |
| 3502 | BasicBlock *getSuccessor(unsigned idx) const { |
| 3503 | assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!")((void)0); |
| 3504 | return cast<BasicBlock>(getOperand(idx*2+1)); |
| 3505 | } |
| 3506 | void setSuccessor(unsigned idx, BasicBlock *NewSucc) { |
| 3507 | assert(idx < getNumSuccessors() && "Successor # out of range for switch!")((void)0); |
| 3508 | setOperand(idx * 2 + 1, NewSucc); |
| 3509 | } |
| 3510 | |
| 3511 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 3512 | static bool classof(const Instruction *I) { |
| 3513 | return I->getOpcode() == Instruction::Switch; |
| 3514 | } |
| 3515 | static bool classof(const Value *V) { |
| 3516 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 3517 | } |
| 3518 | }; |
| 3519 | |
| 3520 | /// A wrapper class to simplify modification of SwitchInst cases along with |
| 3521 | /// their prof branch_weights metadata. |
| 3522 | class SwitchInstProfUpdateWrapper { |
| 3523 | SwitchInst &SI; |
| 3524 | Optional<SmallVector<uint32_t, 8> > Weights = None; |
| 3525 | bool Changed = false; |
| 3526 | |
| 3527 | protected: |
| 3528 | static MDNode *getProfBranchWeightsMD(const SwitchInst &SI); |
| 3529 | |
| 3530 | MDNode *buildProfBranchWeightsMD(); |
| 3531 | |
| 3532 | void init(); |
| 3533 | |
| 3534 | public: |
| 3535 | using CaseWeightOpt = Optional<uint32_t>; |
| 3536 | SwitchInst *operator->() { return &SI; } |
| 3537 | SwitchInst &operator*() { return SI; } |
| 3538 | operator SwitchInst *() { return &SI; } |
| 3539 | |
| 3540 | SwitchInstProfUpdateWrapper(SwitchInst &SI) : SI(SI) { init(); } |
| 3541 | |
| 3542 | ~SwitchInstProfUpdateWrapper() { |
| 3543 | if (Changed) |
| 3544 | SI.setMetadata(LLVMContext::MD_prof, buildProfBranchWeightsMD()); |
| 3545 | } |
| 3546 | |
| 3547 | /// Delegate the call to the underlying SwitchInst::removeCase() and remove |
| 3548 | /// correspondent branch weight. |
| 3549 | SwitchInst::CaseIt removeCase(SwitchInst::CaseIt I); |
| 3550 | |
| 3551 | /// Delegate the call to the underlying SwitchInst::addCase() and set the |
| 3552 | /// specified branch weight for the added case. |
| 3553 | void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W); |
| 3554 | |
| 3555 | /// Delegate the call to the underlying SwitchInst::eraseFromParent() and mark |
| 3556 | /// this object to not touch the underlying SwitchInst in destructor. |
| 3557 | SymbolTableList<Instruction>::iterator eraseFromParent(); |
| 3558 | |
| 3559 | void setSuccessorWeight(unsigned idx, CaseWeightOpt W); |
| 3560 | CaseWeightOpt getSuccessorWeight(unsigned idx); |
| 3561 | |
| 3562 | static CaseWeightOpt getSuccessorWeight(const SwitchInst &SI, unsigned idx); |
| 3563 | }; |
| 3564 | |
| 3565 | template <> |
| 3566 | struct OperandTraits<SwitchInst> : public HungoffOperandTraits<2> { |
| 3567 | }; |
| 3568 | |
| 3569 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SwitchInst, Value)SwitchInst::op_iterator SwitchInst::op_begin() { return OperandTraits <SwitchInst>::op_begin(this); } SwitchInst::const_op_iterator SwitchInst::op_begin() const { return OperandTraits<SwitchInst >::op_begin(const_cast<SwitchInst*>(this)); } SwitchInst ::op_iterator SwitchInst::op_end() { return OperandTraits< SwitchInst>::op_end(this); } SwitchInst::const_op_iterator SwitchInst::op_end() const { return OperandTraits<SwitchInst >::op_end(const_cast<SwitchInst*>(this)); } Value *SwitchInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<SwitchInst>::op_begin(const_cast <SwitchInst*>(this))[i_nocapture].get()); } void SwitchInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<SwitchInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned SwitchInst::getNumOperands() const { return OperandTraits<SwitchInst>::operands(this); } template <int Idx_nocapture> Use &SwitchInst::Op() { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &SwitchInst::Op() const { return this->OpFrom<Idx_nocapture>(this); } |
| 3570 | |
| 3571 | //===----------------------------------------------------------------------===// |
| 3572 | // IndirectBrInst Class |
| 3573 | //===----------------------------------------------------------------------===// |
| 3574 | |
| 3575 | //===--------------------------------------------------------------------------- |
| 3576 | /// Indirect Branch Instruction. |
| 3577 | /// |
| 3578 | class IndirectBrInst : public Instruction { |
| 3579 | unsigned ReservedSpace; |
| 3580 | |
| 3581 | // Operand[0] = Address to jump to |
| 3582 | // Operand[n+1] = n-th destination |
| 3583 | IndirectBrInst(const IndirectBrInst &IBI); |
| 3584 | |
| 3585 | /// Create a new indirectbr instruction, specifying an |
| 3586 | /// Address to jump to. The number of expected destinations can be specified |
| 3587 | /// here to make memory allocation more efficient. This constructor can also |
| 3588 | /// autoinsert before another instruction. |
| 3589 | IndirectBrInst(Value *Address, unsigned NumDests, Instruction *InsertBefore); |
| 3590 | |
| 3591 | /// Create a new indirectbr instruction, specifying an |
| 3592 | /// Address to jump to. The number of expected destinations can be specified |
| 3593 | /// here to make memory allocation more efficient. This constructor also |
| 3594 | /// autoinserts at the end of the specified BasicBlock. |
| 3595 | IndirectBrInst(Value *Address, unsigned NumDests, BasicBlock *InsertAtEnd); |
| 3596 | |
| 3597 | // allocate space for exactly zero operands |
| 3598 | void *operator new(size_t S) { return User::operator new(S); } |
| 3599 | |
| 3600 | void init(Value *Address, unsigned NumDests); |
| 3601 | void growOperands(); |
| 3602 | |
| 3603 | protected: |
| 3604 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 3605 | friend class Instruction; |
| 3606 | |
| 3607 | IndirectBrInst *cloneImpl() const; |
| 3608 | |
| 3609 | public: |
| 3610 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 3611 | |
| 3612 | /// Iterator type that casts an operand to a basic block. |
| 3613 | /// |
| 3614 | /// This only makes sense because the successors are stored as adjacent |
| 3615 | /// operands for indirectbr instructions. |
| 3616 | struct succ_op_iterator |
| 3617 | : iterator_adaptor_base<succ_op_iterator, value_op_iterator, |
| 3618 | std::random_access_iterator_tag, BasicBlock *, |
| 3619 | ptrdiff_t, BasicBlock *, BasicBlock *> { |
| 3620 | explicit succ_op_iterator(value_op_iterator I) : iterator_adaptor_base(I) {} |
| 3621 | |
| 3622 | BasicBlock *operator*() const { return cast<BasicBlock>(*I); } |
| 3623 | BasicBlock *operator->() const { return operator*(); } |
| 3624 | }; |
| 3625 | |
| 3626 | /// The const version of `succ_op_iterator`. |
| 3627 | struct const_succ_op_iterator |
| 3628 | : iterator_adaptor_base<const_succ_op_iterator, const_value_op_iterator, |
| 3629 | std::random_access_iterator_tag, |
| 3630 | const BasicBlock *, ptrdiff_t, const BasicBlock *, |
| 3631 | const BasicBlock *> { |
| 3632 | explicit const_succ_op_iterator(const_value_op_iterator I) |
| 3633 | : iterator_adaptor_base(I) {} |
| 3634 | |
| 3635 | const BasicBlock *operator*() const { return cast<BasicBlock>(*I); } |
| 3636 | const BasicBlock *operator->() const { return operator*(); } |
| 3637 | }; |
| 3638 | |
| 3639 | static IndirectBrInst *Create(Value *Address, unsigned NumDests, |
| 3640 | Instruction *InsertBefore = nullptr) { |
| 3641 | return new IndirectBrInst(Address, NumDests, InsertBefore); |
| 3642 | } |
| 3643 | |
| 3644 | static IndirectBrInst *Create(Value *Address, unsigned NumDests, |
| 3645 | BasicBlock *InsertAtEnd) { |
| 3646 | return new IndirectBrInst(Address, NumDests, InsertAtEnd); |
| 3647 | } |
| 3648 | |
| 3649 | /// Provide fast operand accessors. |
| 3650 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 3651 | |
| 3652 | // Accessor Methods for IndirectBrInst instruction. |
| 3653 | Value *getAddress() { return getOperand(0); } |
| 3654 | const Value *getAddress() const { return getOperand(0); } |
| 3655 | void setAddress(Value *V) { setOperand(0, V); } |
| 3656 | |
| 3657 | /// return the number of possible destinations in this |
| 3658 | /// indirectbr instruction. |
| 3659 | unsigned getNumDestinations() const { return getNumOperands()-1; } |
| 3660 | |
| 3661 | /// Return the specified destination. |
| 3662 | BasicBlock *getDestination(unsigned i) { return getSuccessor(i); } |
| 3663 | const BasicBlock *getDestination(unsigned i) const { return getSuccessor(i); } |
| 3664 | |
| 3665 | /// Add a destination. |
| 3666 | /// |
| 3667 | void addDestination(BasicBlock *Dest); |
| 3668 | |
| 3669 | /// This method removes the specified successor from the |
| 3670 | /// indirectbr instruction. |
| 3671 | void removeDestination(unsigned i); |
| 3672 | |
| 3673 | unsigned getNumSuccessors() const { return getNumOperands()-1; } |
| 3674 | BasicBlock *getSuccessor(unsigned i) const { |
| 3675 | return cast<BasicBlock>(getOperand(i+1)); |
| 3676 | } |
| 3677 | void setSuccessor(unsigned i, BasicBlock *NewSucc) { |
| 3678 | setOperand(i + 1, NewSucc); |
| 3679 | } |
| 3680 | |
| 3681 | iterator_range<succ_op_iterator> successors() { |
| 3682 | return make_range(succ_op_iterator(std::next(value_op_begin())), |
| 3683 | succ_op_iterator(value_op_end())); |
| 3684 | } |
| 3685 | |
| 3686 | iterator_range<const_succ_op_iterator> successors() const { |
| 3687 | return make_range(const_succ_op_iterator(std::next(value_op_begin())), |
| 3688 | const_succ_op_iterator(value_op_end())); |
| 3689 | } |
| 3690 | |
| 3691 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 3692 | static bool classof(const Instruction *I) { |
| 3693 | return I->getOpcode() == Instruction::IndirectBr; |
| 3694 | } |
| 3695 | static bool classof(const Value *V) { |
| 3696 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 3697 | } |
| 3698 | }; |
| 3699 | |
| 3700 | template <> |
| 3701 | struct OperandTraits<IndirectBrInst> : public HungoffOperandTraits<1> { |
| 3702 | }; |
| 3703 | |
| 3704 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(IndirectBrInst, Value)IndirectBrInst::op_iterator IndirectBrInst::op_begin() { return OperandTraits<IndirectBrInst>::op_begin(this); } IndirectBrInst ::const_op_iterator IndirectBrInst::op_begin() const { return OperandTraits<IndirectBrInst>::op_begin(const_cast< IndirectBrInst*>(this)); } IndirectBrInst::op_iterator IndirectBrInst ::op_end() { return OperandTraits<IndirectBrInst>::op_end (this); } IndirectBrInst::const_op_iterator IndirectBrInst::op_end () const { return OperandTraits<IndirectBrInst>::op_end (const_cast<IndirectBrInst*>(this)); } Value *IndirectBrInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<IndirectBrInst>::op_begin( const_cast<IndirectBrInst*>(this))[i_nocapture].get()); } void IndirectBrInst::setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void)0); OperandTraits<IndirectBrInst >::op_begin(this)[i_nocapture] = Val_nocapture; } unsigned IndirectBrInst::getNumOperands() const { return OperandTraits <IndirectBrInst>::operands(this); } template <int Idx_nocapture > Use &IndirectBrInst::Op() { return this->OpFrom< Idx_nocapture>(this); } template <int Idx_nocapture> const Use &IndirectBrInst::Op() const { return this-> OpFrom<Idx_nocapture>(this); } |
| 3705 | |
| 3706 | //===----------------------------------------------------------------------===// |
| 3707 | // InvokeInst Class |
| 3708 | //===----------------------------------------------------------------------===// |
| 3709 | |
| 3710 | /// Invoke instruction. The SubclassData field is used to hold the |
| 3711 | /// calling convention of the call. |
| 3712 | /// |
| 3713 | class InvokeInst : public CallBase { |
| 3714 | /// The number of operands for this call beyond the called function, |
| 3715 | /// arguments, and operand bundles. |
| 3716 | static constexpr int NumExtraOperands = 2; |
| 3717 | |
| 3718 | /// The index from the end of the operand array to the normal destination. |
| 3719 | static constexpr int NormalDestOpEndIdx = -3; |
| 3720 | |
| 3721 | /// The index from the end of the operand array to the unwind destination. |
| 3722 | static constexpr int UnwindDestOpEndIdx = -2; |
| 3723 | |
| 3724 | InvokeInst(const InvokeInst &BI); |
| 3725 | |
| 3726 | /// Construct an InvokeInst given a range of arguments. |
| 3727 | /// |
| 3728 | /// Construct an InvokeInst from a range of arguments |
| 3729 | inline InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3730 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3731 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 3732 | const Twine &NameStr, Instruction *InsertBefore); |
| 3733 | |
| 3734 | inline InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3735 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3736 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 3737 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 3738 | |
| 3739 | void init(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3740 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3741 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr); |
| 3742 | |
| 3743 | /// Compute the number of operands to allocate. |
| 3744 | static int ComputeNumOperands(int NumArgs, int NumBundleInputs = 0) { |
| 3745 | // We need one operand for the called function, plus our extra operands and |
| 3746 | // the input operand counts provided. |
| 3747 | return 1 + NumExtraOperands + NumArgs + NumBundleInputs; |
| 3748 | } |
| 3749 | |
| 3750 | protected: |
| 3751 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 3752 | friend class Instruction; |
| 3753 | |
| 3754 | InvokeInst *cloneImpl() const; |
| 3755 | |
| 3756 | public: |
| 3757 | static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3758 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3759 | const Twine &NameStr, |
| 3760 | Instruction *InsertBefore = nullptr) { |
| 3761 | int NumOperands = ComputeNumOperands(Args.size()); |
| 3762 | return new (NumOperands) |
| 3763 | InvokeInst(Ty, Func, IfNormal, IfException, Args, None, NumOperands, |
| 3764 | NameStr, InsertBefore); |
| 3765 | } |
| 3766 | |
| 3767 | static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3768 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3769 | ArrayRef<OperandBundleDef> Bundles = None, |
| 3770 | const Twine &NameStr = "", |
| 3771 | Instruction *InsertBefore = nullptr) { |
| 3772 | int NumOperands = |
| 3773 | ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)); |
| 3774 | unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); |
| 3775 | |
| 3776 | return new (NumOperands, DescriptorBytes) |
| 3777 | InvokeInst(Ty, Func, IfNormal, IfException, Args, Bundles, NumOperands, |
| 3778 | NameStr, InsertBefore); |
| 3779 | } |
| 3780 | |
| 3781 | static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3782 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3783 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 3784 | int NumOperands = ComputeNumOperands(Args.size()); |
| 3785 | return new (NumOperands) |
| 3786 | InvokeInst(Ty, Func, IfNormal, IfException, Args, None, NumOperands, |
| 3787 | NameStr, InsertAtEnd); |
| 3788 | } |
| 3789 | |
| 3790 | static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3791 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3792 | ArrayRef<OperandBundleDef> Bundles, |
| 3793 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 3794 | int NumOperands = |
| 3795 | ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)); |
| 3796 | unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); |
| 3797 | |
| 3798 | return new (NumOperands, DescriptorBytes) |
| 3799 | InvokeInst(Ty, Func, IfNormal, IfException, Args, Bundles, NumOperands, |
| 3800 | NameStr, InsertAtEnd); |
| 3801 | } |
| 3802 | |
| 3803 | static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal, |
| 3804 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3805 | const Twine &NameStr, |
| 3806 | Instruction *InsertBefore = nullptr) { |
| 3807 | return Create(Func.getFunctionType(), Func.getCallee(), IfNormal, |
| 3808 | IfException, Args, None, NameStr, InsertBefore); |
| 3809 | } |
| 3810 | |
| 3811 | static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal, |
| 3812 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3813 | ArrayRef<OperandBundleDef> Bundles = None, |
| 3814 | const Twine &NameStr = "", |
| 3815 | Instruction *InsertBefore = nullptr) { |
| 3816 | return Create(Func.getFunctionType(), Func.getCallee(), IfNormal, |
| 3817 | IfException, Args, Bundles, NameStr, InsertBefore); |
| 3818 | } |
| 3819 | |
| 3820 | static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal, |
| 3821 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3822 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 3823 | return Create(Func.getFunctionType(), Func.getCallee(), IfNormal, |
| 3824 | IfException, Args, NameStr, InsertAtEnd); |
| 3825 | } |
| 3826 | |
| 3827 | static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal, |
| 3828 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3829 | ArrayRef<OperandBundleDef> Bundles, |
| 3830 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 3831 | return Create(Func.getFunctionType(), Func.getCallee(), IfNormal, |
| 3832 | IfException, Args, Bundles, NameStr, InsertAtEnd); |
| 3833 | } |
| 3834 | |
| 3835 | /// Create a clone of \p II with a different set of operand bundles and |
| 3836 | /// insert it before \p InsertPt. |
| 3837 | /// |
| 3838 | /// The returned invoke instruction is identical to \p II in every way except |
| 3839 | /// that the operand bundles for the new instruction are set to the operand |
| 3840 | /// bundles in \p Bundles. |
| 3841 | static InvokeInst *Create(InvokeInst *II, ArrayRef<OperandBundleDef> Bundles, |
| 3842 | Instruction *InsertPt = nullptr); |
| 3843 | |
| 3844 | // get*Dest - Return the destination basic blocks... |
| 3845 | BasicBlock *getNormalDest() const { |
| 3846 | return cast<BasicBlock>(Op<NormalDestOpEndIdx>()); |
| 3847 | } |
| 3848 | BasicBlock *getUnwindDest() const { |
| 3849 | return cast<BasicBlock>(Op<UnwindDestOpEndIdx>()); |
| 3850 | } |
| 3851 | void setNormalDest(BasicBlock *B) { |
| 3852 | Op<NormalDestOpEndIdx>() = reinterpret_cast<Value *>(B); |
| 3853 | } |
| 3854 | void setUnwindDest(BasicBlock *B) { |
| 3855 | Op<UnwindDestOpEndIdx>() = reinterpret_cast<Value *>(B); |
| 3856 | } |
| 3857 | |
| 3858 | /// Get the landingpad instruction from the landing pad |
| 3859 | /// block (the unwind destination). |
| 3860 | LandingPadInst *getLandingPadInst() const; |
| 3861 | |
| 3862 | BasicBlock *getSuccessor(unsigned i) const { |
| 3863 | assert(i < 2 && "Successor # out of range for invoke!")((void)0); |
| 3864 | return i == 0 ? getNormalDest() : getUnwindDest(); |
| 3865 | } |
| 3866 | |
| 3867 | void setSuccessor(unsigned i, BasicBlock *NewSucc) { |
| 3868 | assert(i < 2 && "Successor # out of range for invoke!")((void)0); |
| 3869 | if (i == 0) |
| 3870 | setNormalDest(NewSucc); |
| 3871 | else |
| 3872 | setUnwindDest(NewSucc); |
| 3873 | } |
| 3874 | |
| 3875 | unsigned getNumSuccessors() const { return 2; } |
| 3876 | |
| 3877 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 3878 | static bool classof(const Instruction *I) { |
| 3879 | return (I->getOpcode() == Instruction::Invoke); |
| 3880 | } |
| 3881 | static bool classof(const Value *V) { |
| 3882 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 3883 | } |
| 3884 | |
| 3885 | private: |
| 3886 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 3887 | // method so that subclasses cannot accidentally use it. |
| 3888 | template <typename Bitfield> |
| 3889 | void setSubclassData(typename Bitfield::Type Value) { |
| 3890 | Instruction::setSubclassData<Bitfield>(Value); |
| 3891 | } |
| 3892 | }; |
| 3893 | |
| 3894 | InvokeInst::InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3895 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3896 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 3897 | const Twine &NameStr, Instruction *InsertBefore) |
| 3898 | : CallBase(Ty->getReturnType(), Instruction::Invoke, |
| 3899 | OperandTraits<CallBase>::op_end(this) - NumOperands, NumOperands, |
| 3900 | InsertBefore) { |
| 3901 | init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr); |
| 3902 | } |
| 3903 | |
| 3904 | InvokeInst::InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, |
| 3905 | BasicBlock *IfException, ArrayRef<Value *> Args, |
| 3906 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 3907 | const Twine &NameStr, BasicBlock *InsertAtEnd) |
| 3908 | : CallBase(Ty->getReturnType(), Instruction::Invoke, |
| 3909 | OperandTraits<CallBase>::op_end(this) - NumOperands, NumOperands, |
| 3910 | InsertAtEnd) { |
| 3911 | init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr); |
| 3912 | } |
| 3913 | |
| 3914 | //===----------------------------------------------------------------------===// |
| 3915 | // CallBrInst Class |
| 3916 | //===----------------------------------------------------------------------===// |
| 3917 | |
| 3918 | /// CallBr instruction, tracking function calls that may not return control but |
| 3919 | /// instead transfer it to a third location. The SubclassData field is used to |
| 3920 | /// hold the calling convention of the call. |
| 3921 | /// |
| 3922 | class CallBrInst : public CallBase { |
| 3923 | |
| 3924 | unsigned NumIndirectDests; |
| 3925 | |
| 3926 | CallBrInst(const CallBrInst &BI); |
| 3927 | |
| 3928 | /// Construct a CallBrInst given a range of arguments. |
| 3929 | /// |
| 3930 | /// Construct a CallBrInst from a range of arguments |
| 3931 | inline CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, |
| 3932 | ArrayRef<BasicBlock *> IndirectDests, |
| 3933 | ArrayRef<Value *> Args, |
| 3934 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 3935 | const Twine &NameStr, Instruction *InsertBefore); |
| 3936 | |
| 3937 | inline CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, |
| 3938 | ArrayRef<BasicBlock *> IndirectDests, |
| 3939 | ArrayRef<Value *> Args, |
| 3940 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 3941 | const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 3942 | |
| 3943 | void init(FunctionType *FTy, Value *Func, BasicBlock *DefaultDest, |
| 3944 | ArrayRef<BasicBlock *> IndirectDests, ArrayRef<Value *> Args, |
| 3945 | ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr); |
| 3946 | |
| 3947 | /// Should the Indirect Destinations change, scan + update the Arg list. |
| 3948 | void updateArgBlockAddresses(unsigned i, BasicBlock *B); |
| 3949 | |
| 3950 | /// Compute the number of operands to allocate. |
| 3951 | static int ComputeNumOperands(int NumArgs, int NumIndirectDests, |
| 3952 | int NumBundleInputs = 0) { |
| 3953 | // We need one operand for the called function, plus our extra operands and |
| 3954 | // the input operand counts provided. |
| 3955 | return 2 + NumIndirectDests + NumArgs + NumBundleInputs; |
| 3956 | } |
| 3957 | |
| 3958 | protected: |
| 3959 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 3960 | friend class Instruction; |
| 3961 | |
| 3962 | CallBrInst *cloneImpl() const; |
| 3963 | |
| 3964 | public: |
| 3965 | static CallBrInst *Create(FunctionType *Ty, Value *Func, |
| 3966 | BasicBlock *DefaultDest, |
| 3967 | ArrayRef<BasicBlock *> IndirectDests, |
| 3968 | ArrayRef<Value *> Args, const Twine &NameStr, |
| 3969 | Instruction *InsertBefore = nullptr) { |
| 3970 | int NumOperands = ComputeNumOperands(Args.size(), IndirectDests.size()); |
| 3971 | return new (NumOperands) |
| 3972 | CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, None, |
| 3973 | NumOperands, NameStr, InsertBefore); |
| 3974 | } |
| 3975 | |
| 3976 | static CallBrInst *Create(FunctionType *Ty, Value *Func, |
| 3977 | BasicBlock *DefaultDest, |
| 3978 | ArrayRef<BasicBlock *> IndirectDests, |
| 3979 | ArrayRef<Value *> Args, |
| 3980 | ArrayRef<OperandBundleDef> Bundles = None, |
| 3981 | const Twine &NameStr = "", |
| 3982 | Instruction *InsertBefore = nullptr) { |
| 3983 | int NumOperands = ComputeNumOperands(Args.size(), IndirectDests.size(), |
| 3984 | CountBundleInputs(Bundles)); |
| 3985 | unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); |
| 3986 | |
| 3987 | return new (NumOperands, DescriptorBytes) |
| 3988 | CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, |
| 3989 | NumOperands, NameStr, InsertBefore); |
| 3990 | } |
| 3991 | |
| 3992 | static CallBrInst *Create(FunctionType *Ty, Value *Func, |
| 3993 | BasicBlock *DefaultDest, |
| 3994 | ArrayRef<BasicBlock *> IndirectDests, |
| 3995 | ArrayRef<Value *> Args, const Twine &NameStr, |
| 3996 | BasicBlock *InsertAtEnd) { |
| 3997 | int NumOperands = ComputeNumOperands(Args.size(), IndirectDests.size()); |
| 3998 | return new (NumOperands) |
| 3999 | CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, None, |
| 4000 | NumOperands, NameStr, InsertAtEnd); |
| 4001 | } |
| 4002 | |
| 4003 | static CallBrInst *Create(FunctionType *Ty, Value *Func, |
| 4004 | BasicBlock *DefaultDest, |
| 4005 | ArrayRef<BasicBlock *> IndirectDests, |
| 4006 | ArrayRef<Value *> Args, |
| 4007 | ArrayRef<OperandBundleDef> Bundles, |
| 4008 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 4009 | int NumOperands = ComputeNumOperands(Args.size(), IndirectDests.size(), |
| 4010 | CountBundleInputs(Bundles)); |
| 4011 | unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); |
| 4012 | |
| 4013 | return new (NumOperands, DescriptorBytes) |
| 4014 | CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, |
| 4015 | NumOperands, NameStr, InsertAtEnd); |
| 4016 | } |
| 4017 | |
| 4018 | static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest, |
| 4019 | ArrayRef<BasicBlock *> IndirectDests, |
| 4020 | ArrayRef<Value *> Args, const Twine &NameStr, |
| 4021 | Instruction *InsertBefore = nullptr) { |
| 4022 | return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest, |
| 4023 | IndirectDests, Args, NameStr, InsertBefore); |
| 4024 | } |
| 4025 | |
| 4026 | static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest, |
| 4027 | ArrayRef<BasicBlock *> IndirectDests, |
| 4028 | ArrayRef<Value *> Args, |
| 4029 | ArrayRef<OperandBundleDef> Bundles = None, |
| 4030 | const Twine &NameStr = "", |
| 4031 | Instruction *InsertBefore = nullptr) { |
| 4032 | return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest, |
| 4033 | IndirectDests, Args, Bundles, NameStr, InsertBefore); |
| 4034 | } |
| 4035 | |
| 4036 | static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest, |
| 4037 | ArrayRef<BasicBlock *> IndirectDests, |
| 4038 | ArrayRef<Value *> Args, const Twine &NameStr, |
| 4039 | BasicBlock *InsertAtEnd) { |
| 4040 | return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest, |
| 4041 | IndirectDests, Args, NameStr, InsertAtEnd); |
| 4042 | } |
| 4043 | |
| 4044 | static CallBrInst *Create(FunctionCallee Func, |
| 4045 | BasicBlock *DefaultDest, |
| 4046 | ArrayRef<BasicBlock *> IndirectDests, |
| 4047 | ArrayRef<Value *> Args, |
| 4048 | ArrayRef<OperandBundleDef> Bundles, |
| 4049 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 4050 | return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest, |
| 4051 | IndirectDests, Args, Bundles, NameStr, InsertAtEnd); |
| 4052 | } |
| 4053 | |
| 4054 | /// Create a clone of \p CBI with a different set of operand bundles and |
| 4055 | /// insert it before \p InsertPt. |
| 4056 | /// |
| 4057 | /// The returned callbr instruction is identical to \p CBI in every way |
| 4058 | /// except that the operand bundles for the new instruction are set to the |
| 4059 | /// operand bundles in \p Bundles. |
| 4060 | static CallBrInst *Create(CallBrInst *CBI, |
| 4061 | ArrayRef<OperandBundleDef> Bundles, |
| 4062 | Instruction *InsertPt = nullptr); |
| 4063 | |
| 4064 | /// Return the number of callbr indirect dest labels. |
| 4065 | /// |
| 4066 | unsigned getNumIndirectDests() const { return NumIndirectDests; } |
| 4067 | |
| 4068 | /// getIndirectDestLabel - Return the i-th indirect dest label. |
| 4069 | /// |
| 4070 | Value *getIndirectDestLabel(unsigned i) const { |
| 4071 | assert(i < getNumIndirectDests() && "Out of bounds!")((void)0); |
| 4072 | return getOperand(i + getNumArgOperands() + getNumTotalBundleOperands() + |
| 4073 | 1); |
| 4074 | } |
| 4075 | |
| 4076 | Value *getIndirectDestLabelUse(unsigned i) const { |
| 4077 | assert(i < getNumIndirectDests() && "Out of bounds!")((void)0); |
| 4078 | return getOperandUse(i + getNumArgOperands() + getNumTotalBundleOperands() + |
| 4079 | 1); |
| 4080 | } |
| 4081 | |
| 4082 | // Return the destination basic blocks... |
| 4083 | BasicBlock *getDefaultDest() const { |
| 4084 | return cast<BasicBlock>(*(&Op<-1>() - getNumIndirectDests() - 1)); |
| 4085 | } |
| 4086 | BasicBlock *getIndirectDest(unsigned i) const { |
| 4087 | return cast_or_null<BasicBlock>(*(&Op<-1>() - getNumIndirectDests() + i)); |
| 4088 | } |
| 4089 | SmallVector<BasicBlock *, 16> getIndirectDests() const { |
| 4090 | SmallVector<BasicBlock *, 16> IndirectDests; |
| 4091 | for (unsigned i = 0, e = getNumIndirectDests(); i < e; ++i) |
| 4092 | IndirectDests.push_back(getIndirectDest(i)); |
| 4093 | return IndirectDests; |
| 4094 | } |
| 4095 | void setDefaultDest(BasicBlock *B) { |
| 4096 | *(&Op<-1>() - getNumIndirectDests() - 1) = reinterpret_cast<Value *>(B); |
| 4097 | } |
| 4098 | void setIndirectDest(unsigned i, BasicBlock *B) { |
| 4099 | updateArgBlockAddresses(i, B); |
| 4100 | *(&Op<-1>() - getNumIndirectDests() + i) = reinterpret_cast<Value *>(B); |
| 4101 | } |
| 4102 | |
| 4103 | BasicBlock *getSuccessor(unsigned i) const { |
| 4104 | assert(i < getNumSuccessors() + 1 &&((void)0) |
| 4105 | "Successor # out of range for callbr!")((void)0); |
| 4106 | return i == 0 ? getDefaultDest() : getIndirectDest(i - 1); |
| 4107 | } |
| 4108 | |
| 4109 | void setSuccessor(unsigned i, BasicBlock *NewSucc) { |
| 4110 | assert(i < getNumIndirectDests() + 1 &&((void)0) |
| 4111 | "Successor # out of range for callbr!")((void)0); |
| 4112 | return i == 0 ? setDefaultDest(NewSucc) : setIndirectDest(i - 1, NewSucc); |
| 4113 | } |
| 4114 | |
| 4115 | unsigned getNumSuccessors() const { return getNumIndirectDests() + 1; } |
| 4116 | |
| 4117 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4118 | static bool classof(const Instruction *I) { |
| 4119 | return (I->getOpcode() == Instruction::CallBr); |
| 4120 | } |
| 4121 | static bool classof(const Value *V) { |
| 4122 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4123 | } |
| 4124 | |
| 4125 | private: |
| 4126 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 4127 | // method so that subclasses cannot accidentally use it. |
| 4128 | template <typename Bitfield> |
| 4129 | void setSubclassData(typename Bitfield::Type Value) { |
| 4130 | Instruction::setSubclassData<Bitfield>(Value); |
| 4131 | } |
| 4132 | }; |
| 4133 | |
| 4134 | CallBrInst::CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, |
| 4135 | ArrayRef<BasicBlock *> IndirectDests, |
| 4136 | ArrayRef<Value *> Args, |
| 4137 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 4138 | const Twine &NameStr, Instruction *InsertBefore) |
| 4139 | : CallBase(Ty->getReturnType(), Instruction::CallBr, |
| 4140 | OperandTraits<CallBase>::op_end(this) - NumOperands, NumOperands, |
| 4141 | InsertBefore) { |
| 4142 | init(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, NameStr); |
| 4143 | } |
| 4144 | |
| 4145 | CallBrInst::CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, |
| 4146 | ArrayRef<BasicBlock *> IndirectDests, |
| 4147 | ArrayRef<Value *> Args, |
| 4148 | ArrayRef<OperandBundleDef> Bundles, int NumOperands, |
| 4149 | const Twine &NameStr, BasicBlock *InsertAtEnd) |
| 4150 | : CallBase(Ty->getReturnType(), Instruction::CallBr, |
| 4151 | OperandTraits<CallBase>::op_end(this) - NumOperands, NumOperands, |
| 4152 | InsertAtEnd) { |
| 4153 | init(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, NameStr); |
| 4154 | } |
| 4155 | |
| 4156 | //===----------------------------------------------------------------------===// |
| 4157 | // ResumeInst Class |
| 4158 | //===----------------------------------------------------------------------===// |
| 4159 | |
| 4160 | //===--------------------------------------------------------------------------- |
| 4161 | /// Resume the propagation of an exception. |
| 4162 | /// |
| 4163 | class ResumeInst : public Instruction { |
| 4164 | ResumeInst(const ResumeInst &RI); |
| 4165 | |
| 4166 | explicit ResumeInst(Value *Exn, Instruction *InsertBefore=nullptr); |
| 4167 | ResumeInst(Value *Exn, BasicBlock *InsertAtEnd); |
| 4168 | |
| 4169 | protected: |
| 4170 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4171 | friend class Instruction; |
| 4172 | |
| 4173 | ResumeInst *cloneImpl() const; |
| 4174 | |
| 4175 | public: |
| 4176 | static ResumeInst *Create(Value *Exn, Instruction *InsertBefore = nullptr) { |
| 4177 | return new(1) ResumeInst(Exn, InsertBefore); |
| 4178 | } |
| 4179 | |
| 4180 | static ResumeInst *Create(Value *Exn, BasicBlock *InsertAtEnd) { |
| 4181 | return new(1) ResumeInst(Exn, InsertAtEnd); |
| 4182 | } |
| 4183 | |
| 4184 | /// Provide fast operand accessors |
| 4185 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 4186 | |
| 4187 | /// Convenience accessor. |
| 4188 | Value *getValue() const { return Op<0>(); } |
| 4189 | |
| 4190 | unsigned getNumSuccessors() const { return 0; } |
| 4191 | |
| 4192 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4193 | static bool classof(const Instruction *I) { |
| 4194 | return I->getOpcode() == Instruction::Resume; |
| 4195 | } |
| 4196 | static bool classof(const Value *V) { |
| 4197 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4198 | } |
| 4199 | |
| 4200 | private: |
| 4201 | BasicBlock *getSuccessor(unsigned idx) const { |
| 4202 | llvm_unreachable("ResumeInst has no successors!")__builtin_unreachable(); |
| 4203 | } |
| 4204 | |
| 4205 | void setSuccessor(unsigned idx, BasicBlock *NewSucc) { |
| 4206 | llvm_unreachable("ResumeInst has no successors!")__builtin_unreachable(); |
| 4207 | } |
| 4208 | }; |
| 4209 | |
| 4210 | template <> |
| 4211 | struct OperandTraits<ResumeInst> : |
| 4212 | public FixedNumOperandTraits<ResumeInst, 1> { |
| 4213 | }; |
| 4214 | |
| 4215 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ResumeInst, Value)ResumeInst::op_iterator ResumeInst::op_begin() { return OperandTraits <ResumeInst>::op_begin(this); } ResumeInst::const_op_iterator ResumeInst::op_begin() const { return OperandTraits<ResumeInst >::op_begin(const_cast<ResumeInst*>(this)); } ResumeInst ::op_iterator ResumeInst::op_end() { return OperandTraits< ResumeInst>::op_end(this); } ResumeInst::const_op_iterator ResumeInst::op_end() const { return OperandTraits<ResumeInst >::op_end(const_cast<ResumeInst*>(this)); } Value *ResumeInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<ResumeInst>::op_begin(const_cast <ResumeInst*>(this))[i_nocapture].get()); } void ResumeInst ::setOperand(unsigned i_nocapture, Value *Val_nocapture) { (( void)0); OperandTraits<ResumeInst>::op_begin(this)[i_nocapture ] = Val_nocapture; } unsigned ResumeInst::getNumOperands() const { return OperandTraits<ResumeInst>::operands(this); } template <int Idx_nocapture> Use &ResumeInst::Op() { return this->OpFrom<Idx_nocapture>(this); } template <int Idx_nocapture> const Use &ResumeInst::Op() const { return this->OpFrom<Idx_nocapture>(this); } |
| 4216 | |
| 4217 | //===----------------------------------------------------------------------===// |
| 4218 | // CatchSwitchInst Class |
| 4219 | //===----------------------------------------------------------------------===// |
| 4220 | class CatchSwitchInst : public Instruction { |
| 4221 | using UnwindDestField = BoolBitfieldElementT<0>; |
| 4222 | |
| 4223 | /// The number of operands actually allocated. NumOperands is |
| 4224 | /// the number actually in use. |
| 4225 | unsigned ReservedSpace; |
| 4226 | |
| 4227 | // Operand[0] = Outer scope |
| 4228 | // Operand[1] = Unwind block destination |
| 4229 | // Operand[n] = BasicBlock to go to on match |
| 4230 | CatchSwitchInst(const CatchSwitchInst &CSI); |
| 4231 | |
| 4232 | /// Create a new switch instruction, specifying a |
| 4233 | /// default destination. The number of additional handlers can be specified |
| 4234 | /// here to make memory allocation more efficient. |
| 4235 | /// This constructor can also autoinsert before another instruction. |
| 4236 | CatchSwitchInst(Value *ParentPad, BasicBlock *UnwindDest, |
| 4237 | unsigned NumHandlers, const Twine &NameStr, |
| 4238 | Instruction *InsertBefore); |
| 4239 | |
| 4240 | /// Create a new switch instruction, specifying a |
| 4241 | /// default destination. The number of additional handlers can be specified |
| 4242 | /// here to make memory allocation more efficient. |
| 4243 | /// This constructor also autoinserts at the end of the specified BasicBlock. |
| 4244 | CatchSwitchInst(Value *ParentPad, BasicBlock *UnwindDest, |
| 4245 | unsigned NumHandlers, const Twine &NameStr, |
| 4246 | BasicBlock *InsertAtEnd); |
| 4247 | |
| 4248 | // allocate space for exactly zero operands |
| 4249 | void *operator new(size_t S) { return User::operator new(S); } |
| 4250 | |
| 4251 | void init(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumReserved); |
| 4252 | void growOperands(unsigned Size); |
| 4253 | |
| 4254 | protected: |
| 4255 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4256 | friend class Instruction; |
| 4257 | |
| 4258 | CatchSwitchInst *cloneImpl() const; |
| 4259 | |
| 4260 | public: |
| 4261 | void operator delete(void *Ptr) { return User::operator delete(Ptr); } |
| 4262 | |
| 4263 | static CatchSwitchInst *Create(Value *ParentPad, BasicBlock *UnwindDest, |
| 4264 | unsigned NumHandlers, |
| 4265 | const Twine &NameStr = "", |
| 4266 | Instruction *InsertBefore = nullptr) { |
| 4267 | return new CatchSwitchInst(ParentPad, UnwindDest, NumHandlers, NameStr, |
| 4268 | InsertBefore); |
| 4269 | } |
| 4270 | |
| 4271 | static CatchSwitchInst *Create(Value *ParentPad, BasicBlock *UnwindDest, |
| 4272 | unsigned NumHandlers, const Twine &NameStr, |
| 4273 | BasicBlock *InsertAtEnd) { |
| 4274 | return new CatchSwitchInst(ParentPad, UnwindDest, NumHandlers, NameStr, |
| 4275 | InsertAtEnd); |
| 4276 | } |
| 4277 | |
| 4278 | /// Provide fast operand accessors |
| 4279 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 4280 | |
| 4281 | // Accessor Methods for CatchSwitch stmt |
| 4282 | Value *getParentPad() const { return getOperand(0); } |
| 4283 | void setParentPad(Value *ParentPad) { setOperand(0, ParentPad); } |
| 4284 | |
| 4285 | // Accessor Methods for CatchSwitch stmt |
| 4286 | bool hasUnwindDest() const { return getSubclassData<UnwindDestField>(); } |
| 4287 | bool unwindsToCaller() const { return !hasUnwindDest(); } |
| 4288 | BasicBlock *getUnwindDest() const { |
| 4289 | if (hasUnwindDest()) |
| 4290 | return cast<BasicBlock>(getOperand(1)); |
| 4291 | return nullptr; |
| 4292 | } |
| 4293 | void setUnwindDest(BasicBlock *UnwindDest) { |
| 4294 | assert(UnwindDest)((void)0); |
| 4295 | assert(hasUnwindDest())((void)0); |
| 4296 | setOperand(1, UnwindDest); |
| 4297 | } |
| 4298 | |
| 4299 | /// return the number of 'handlers' in this catchswitch |
| 4300 | /// instruction, except the default handler |
| 4301 | unsigned getNumHandlers() const { |
| 4302 | if (hasUnwindDest()) |
| 4303 | return getNumOperands() - 2; |
| 4304 | return getNumOperands() - 1; |
| 4305 | } |
| 4306 | |
| 4307 | private: |
| 4308 | static BasicBlock *handler_helper(Value *V) { return cast<BasicBlock>(V); } |
| 4309 | static const BasicBlock *handler_helper(const Value *V) { |
| 4310 | return cast<BasicBlock>(V); |
| 4311 | } |
| 4312 | |
| 4313 | public: |
| 4314 | using DerefFnTy = BasicBlock *(*)(Value *); |
| 4315 | using handler_iterator = mapped_iterator<op_iterator, DerefFnTy>; |
| 4316 | using handler_range = iterator_range<handler_iterator>; |
| 4317 | using ConstDerefFnTy = const BasicBlock *(*)(const Value *); |
| 4318 | using const_handler_iterator = |
| 4319 | mapped_iterator<const_op_iterator, ConstDerefFnTy>; |
| 4320 | using const_handler_range = iterator_range<const_handler_iterator>; |
| 4321 | |
| 4322 | /// Returns an iterator that points to the first handler in CatchSwitchInst. |
| 4323 | handler_iterator handler_begin() { |
| 4324 | op_iterator It = op_begin() + 1; |
| 4325 | if (hasUnwindDest()) |
| 4326 | ++It; |
| 4327 | return handler_iterator(It, DerefFnTy(handler_helper)); |
| 4328 | } |
| 4329 | |
| 4330 | /// Returns an iterator that points to the first handler in the |
| 4331 | /// CatchSwitchInst. |
| 4332 | const_handler_iterator handler_begin() const { |
| 4333 | const_op_iterator It = op_begin() + 1; |
| 4334 | if (hasUnwindDest()) |
| 4335 | ++It; |
| 4336 | return const_handler_iterator(It, ConstDerefFnTy(handler_helper)); |
| 4337 | } |
| 4338 | |
| 4339 | /// Returns a read-only iterator that points one past the last |
| 4340 | /// handler in the CatchSwitchInst. |
| 4341 | handler_iterator handler_end() { |
| 4342 | return handler_iterator(op_end(), DerefFnTy(handler_helper)); |
| 4343 | } |
| 4344 | |
| 4345 | /// Returns an iterator that points one past the last handler in the |
| 4346 | /// CatchSwitchInst. |
| 4347 | const_handler_iterator handler_end() const { |
| 4348 | return const_handler_iterator(op_end(), ConstDerefFnTy(handler_helper)); |
| 4349 | } |
| 4350 | |
| 4351 | /// iteration adapter for range-for loops. |
| 4352 | handler_range handlers() { |
| 4353 | return make_range(handler_begin(), handler_end()); |
| 4354 | } |
| 4355 | |
| 4356 | /// iteration adapter for range-for loops. |
| 4357 | const_handler_range handlers() const { |
| 4358 | return make_range(handler_begin(), handler_end()); |
| 4359 | } |
| 4360 | |
| 4361 | /// Add an entry to the switch instruction... |
| 4362 | /// Note: |
| 4363 | /// This action invalidates handler_end(). Old handler_end() iterator will |
| 4364 | /// point to the added handler. |
| 4365 | void addHandler(BasicBlock *Dest); |
| 4366 | |
| 4367 | void removeHandler(handler_iterator HI); |
| 4368 | |
| 4369 | unsigned getNumSuccessors() const { return getNumOperands() - 1; } |
| 4370 | BasicBlock *getSuccessor(unsigned Idx) const { |
| 4371 | assert(Idx < getNumSuccessors() &&((void)0) |
| 4372 | "Successor # out of range for catchswitch!")((void)0); |
| 4373 | return cast<BasicBlock>(getOperand(Idx + 1)); |
| 4374 | } |
| 4375 | void setSuccessor(unsigned Idx, BasicBlock *NewSucc) { |
| 4376 | assert(Idx < getNumSuccessors() &&((void)0) |
| 4377 | "Successor # out of range for catchswitch!")((void)0); |
| 4378 | setOperand(Idx + 1, NewSucc); |
| 4379 | } |
| 4380 | |
| 4381 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4382 | static bool classof(const Instruction *I) { |
| 4383 | return I->getOpcode() == Instruction::CatchSwitch; |
| 4384 | } |
| 4385 | static bool classof(const Value *V) { |
| 4386 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4387 | } |
| 4388 | }; |
| 4389 | |
| 4390 | template <> |
| 4391 | struct OperandTraits<CatchSwitchInst> : public HungoffOperandTraits<2> {}; |
| 4392 | |
| 4393 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CatchSwitchInst, Value)CatchSwitchInst::op_iterator CatchSwitchInst::op_begin() { return OperandTraits<CatchSwitchInst>::op_begin(this); } CatchSwitchInst ::const_op_iterator CatchSwitchInst::op_begin() const { return OperandTraits<CatchSwitchInst>::op_begin(const_cast< CatchSwitchInst*>(this)); } CatchSwitchInst::op_iterator CatchSwitchInst ::op_end() { return OperandTraits<CatchSwitchInst>::op_end (this); } CatchSwitchInst::const_op_iterator CatchSwitchInst:: op_end() const { return OperandTraits<CatchSwitchInst>:: op_end(const_cast<CatchSwitchInst*>(this)); } Value *CatchSwitchInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<CatchSwitchInst>::op_begin (const_cast<CatchSwitchInst*>(this))[i_nocapture].get() ); } void CatchSwitchInst::setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void)0); OperandTraits<CatchSwitchInst >::op_begin(this)[i_nocapture] = Val_nocapture; } unsigned CatchSwitchInst::getNumOperands() const { return OperandTraits <CatchSwitchInst>::operands(this); } template <int Idx_nocapture > Use &CatchSwitchInst::Op() { return this->OpFrom< Idx_nocapture>(this); } template <int Idx_nocapture> const Use &CatchSwitchInst::Op() const { return this-> OpFrom<Idx_nocapture>(this); } |
| 4394 | |
| 4395 | //===----------------------------------------------------------------------===// |
| 4396 | // CleanupPadInst Class |
| 4397 | //===----------------------------------------------------------------------===// |
| 4398 | class CleanupPadInst : public FuncletPadInst { |
| 4399 | private: |
| 4400 | explicit CleanupPadInst(Value *ParentPad, ArrayRef<Value *> Args, |
| 4401 | unsigned Values, const Twine &NameStr, |
| 4402 | Instruction *InsertBefore) |
| 4403 | : FuncletPadInst(Instruction::CleanupPad, ParentPad, Args, Values, |
| 4404 | NameStr, InsertBefore) {} |
| 4405 | explicit CleanupPadInst(Value *ParentPad, ArrayRef<Value *> Args, |
| 4406 | unsigned Values, const Twine &NameStr, |
| 4407 | BasicBlock *InsertAtEnd) |
| 4408 | : FuncletPadInst(Instruction::CleanupPad, ParentPad, Args, Values, |
| 4409 | NameStr, InsertAtEnd) {} |
| 4410 | |
| 4411 | public: |
| 4412 | static CleanupPadInst *Create(Value *ParentPad, ArrayRef<Value *> Args = None, |
| 4413 | const Twine &NameStr = "", |
| 4414 | Instruction *InsertBefore = nullptr) { |
| 4415 | unsigned Values = 1 + Args.size(); |
| 4416 | return new (Values) |
| 4417 | CleanupPadInst(ParentPad, Args, Values, NameStr, InsertBefore); |
| 4418 | } |
| 4419 | |
| 4420 | static CleanupPadInst *Create(Value *ParentPad, ArrayRef<Value *> Args, |
| 4421 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 4422 | unsigned Values = 1 + Args.size(); |
| 4423 | return new (Values) |
| 4424 | CleanupPadInst(ParentPad, Args, Values, NameStr, InsertAtEnd); |
| 4425 | } |
| 4426 | |
| 4427 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4428 | static bool classof(const Instruction *I) { |
| 4429 | return I->getOpcode() == Instruction::CleanupPad; |
| 4430 | } |
| 4431 | static bool classof(const Value *V) { |
| 4432 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4433 | } |
| 4434 | }; |
| 4435 | |
| 4436 | //===----------------------------------------------------------------------===// |
| 4437 | // CatchPadInst Class |
| 4438 | //===----------------------------------------------------------------------===// |
| 4439 | class CatchPadInst : public FuncletPadInst { |
| 4440 | private: |
| 4441 | explicit CatchPadInst(Value *CatchSwitch, ArrayRef<Value *> Args, |
| 4442 | unsigned Values, const Twine &NameStr, |
| 4443 | Instruction *InsertBefore) |
| 4444 | : FuncletPadInst(Instruction::CatchPad, CatchSwitch, Args, Values, |
| 4445 | NameStr, InsertBefore) {} |
| 4446 | explicit CatchPadInst(Value *CatchSwitch, ArrayRef<Value *> Args, |
| 4447 | unsigned Values, const Twine &NameStr, |
| 4448 | BasicBlock *InsertAtEnd) |
| 4449 | : FuncletPadInst(Instruction::CatchPad, CatchSwitch, Args, Values, |
| 4450 | NameStr, InsertAtEnd) {} |
| 4451 | |
| 4452 | public: |
| 4453 | static CatchPadInst *Create(Value *CatchSwitch, ArrayRef<Value *> Args, |
| 4454 | const Twine &NameStr = "", |
| 4455 | Instruction *InsertBefore = nullptr) { |
| 4456 | unsigned Values = 1 + Args.size(); |
| 4457 | return new (Values) |
| 4458 | CatchPadInst(CatchSwitch, Args, Values, NameStr, InsertBefore); |
| 4459 | } |
| 4460 | |
| 4461 | static CatchPadInst *Create(Value *CatchSwitch, ArrayRef<Value *> Args, |
| 4462 | const Twine &NameStr, BasicBlock *InsertAtEnd) { |
| 4463 | unsigned Values = 1 + Args.size(); |
| 4464 | return new (Values) |
| 4465 | CatchPadInst(CatchSwitch, Args, Values, NameStr, InsertAtEnd); |
| 4466 | } |
| 4467 | |
| 4468 | /// Convenience accessors |
| 4469 | CatchSwitchInst *getCatchSwitch() const { |
| 4470 | return cast<CatchSwitchInst>(Op<-1>()); |
| 4471 | } |
| 4472 | void setCatchSwitch(Value *CatchSwitch) { |
| 4473 | assert(CatchSwitch)((void)0); |
| 4474 | Op<-1>() = CatchSwitch; |
| 4475 | } |
| 4476 | |
| 4477 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4478 | static bool classof(const Instruction *I) { |
| 4479 | return I->getOpcode() == Instruction::CatchPad; |
| 4480 | } |
| 4481 | static bool classof(const Value *V) { |
| 4482 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4483 | } |
| 4484 | }; |
| 4485 | |
| 4486 | //===----------------------------------------------------------------------===// |
| 4487 | // CatchReturnInst Class |
| 4488 | //===----------------------------------------------------------------------===// |
| 4489 | |
| 4490 | class CatchReturnInst : public Instruction { |
| 4491 | CatchReturnInst(const CatchReturnInst &RI); |
| 4492 | CatchReturnInst(Value *CatchPad, BasicBlock *BB, Instruction *InsertBefore); |
| 4493 | CatchReturnInst(Value *CatchPad, BasicBlock *BB, BasicBlock *InsertAtEnd); |
| 4494 | |
| 4495 | void init(Value *CatchPad, BasicBlock *BB); |
| 4496 | |
| 4497 | protected: |
| 4498 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4499 | friend class Instruction; |
| 4500 | |
| 4501 | CatchReturnInst *cloneImpl() const; |
| 4502 | |
| 4503 | public: |
| 4504 | static CatchReturnInst *Create(Value *CatchPad, BasicBlock *BB, |
| 4505 | Instruction *InsertBefore = nullptr) { |
| 4506 | assert(CatchPad)((void)0); |
| 4507 | assert(BB)((void)0); |
| 4508 | return new (2) CatchReturnInst(CatchPad, BB, InsertBefore); |
| 4509 | } |
| 4510 | |
| 4511 | static CatchReturnInst *Create(Value *CatchPad, BasicBlock *BB, |
| 4512 | BasicBlock *InsertAtEnd) { |
| 4513 | assert(CatchPad)((void)0); |
| 4514 | assert(BB)((void)0); |
| 4515 | return new (2) CatchReturnInst(CatchPad, BB, InsertAtEnd); |
| 4516 | } |
| 4517 | |
| 4518 | /// Provide fast operand accessors |
| 4519 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 4520 | |
| 4521 | /// Convenience accessors. |
| 4522 | CatchPadInst *getCatchPad() const { return cast<CatchPadInst>(Op<0>()); } |
| 4523 | void setCatchPad(CatchPadInst *CatchPad) { |
| 4524 | assert(CatchPad)((void)0); |
| 4525 | Op<0>() = CatchPad; |
| 4526 | } |
| 4527 | |
| 4528 | BasicBlock *getSuccessor() const { return cast<BasicBlock>(Op<1>()); } |
| 4529 | void setSuccessor(BasicBlock *NewSucc) { |
| 4530 | assert(NewSucc)((void)0); |
| 4531 | Op<1>() = NewSucc; |
| 4532 | } |
| 4533 | unsigned getNumSuccessors() const { return 1; } |
| 4534 | |
| 4535 | /// Get the parentPad of this catchret's catchpad's catchswitch. |
| 4536 | /// The successor block is implicitly a member of this funclet. |
| 4537 | Value *getCatchSwitchParentPad() const { |
| 4538 | return getCatchPad()->getCatchSwitch()->getParentPad(); |
| 4539 | } |
| 4540 | |
| 4541 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4542 | static bool classof(const Instruction *I) { |
| 4543 | return (I->getOpcode() == Instruction::CatchRet); |
| 4544 | } |
| 4545 | static bool classof(const Value *V) { |
| 4546 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4547 | } |
| 4548 | |
| 4549 | private: |
| 4550 | BasicBlock *getSuccessor(unsigned Idx) const { |
| 4551 | assert(Idx < getNumSuccessors() && "Successor # out of range for catchret!")((void)0); |
| 4552 | return getSuccessor(); |
| 4553 | } |
| 4554 | |
| 4555 | void setSuccessor(unsigned Idx, BasicBlock *B) { |
| 4556 | assert(Idx < getNumSuccessors() && "Successor # out of range for catchret!")((void)0); |
| 4557 | setSuccessor(B); |
| 4558 | } |
| 4559 | }; |
| 4560 | |
| 4561 | template <> |
| 4562 | struct OperandTraits<CatchReturnInst> |
| 4563 | : public FixedNumOperandTraits<CatchReturnInst, 2> {}; |
| 4564 | |
| 4565 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CatchReturnInst, Value)CatchReturnInst::op_iterator CatchReturnInst::op_begin() { return OperandTraits<CatchReturnInst>::op_begin(this); } CatchReturnInst ::const_op_iterator CatchReturnInst::op_begin() const { return OperandTraits<CatchReturnInst>::op_begin(const_cast< CatchReturnInst*>(this)); } CatchReturnInst::op_iterator CatchReturnInst ::op_end() { return OperandTraits<CatchReturnInst>::op_end (this); } CatchReturnInst::const_op_iterator CatchReturnInst:: op_end() const { return OperandTraits<CatchReturnInst>:: op_end(const_cast<CatchReturnInst*>(this)); } Value *CatchReturnInst ::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null <Value>( OperandTraits<CatchReturnInst>::op_begin (const_cast<CatchReturnInst*>(this))[i_nocapture].get() ); } void CatchReturnInst::setOperand(unsigned i_nocapture, Value *Val_nocapture) { ((void)0); OperandTraits<CatchReturnInst >::op_begin(this)[i_nocapture] = Val_nocapture; } unsigned CatchReturnInst::getNumOperands() const { return OperandTraits <CatchReturnInst>::operands(this); } template <int Idx_nocapture > Use &CatchReturnInst::Op() { return this->OpFrom< Idx_nocapture>(this); } template <int Idx_nocapture> const Use &CatchReturnInst::Op() const { return this-> OpFrom<Idx_nocapture>(this); } |
| 4566 | |
| 4567 | //===----------------------------------------------------------------------===// |
| 4568 | // CleanupReturnInst Class |
| 4569 | //===----------------------------------------------------------------------===// |
| 4570 | |
| 4571 | class CleanupReturnInst : public Instruction { |
| 4572 | using UnwindDestField = BoolBitfieldElementT<0>; |
| 4573 | |
| 4574 | private: |
| 4575 | CleanupReturnInst(const CleanupReturnInst &RI); |
| 4576 | CleanupReturnInst(Value *CleanupPad, BasicBlock *UnwindBB, unsigned Values, |
| 4577 | Instruction *InsertBefore = nullptr); |
| 4578 | CleanupReturnInst(Value *CleanupPad, BasicBlock *UnwindBB, unsigned Values, |
| 4579 | BasicBlock *InsertAtEnd); |
| 4580 | |
| 4581 | void init(Value *CleanupPad, BasicBlock *UnwindBB); |
| 4582 | |
| 4583 | protected: |
| 4584 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4585 | friend class Instruction; |
| 4586 | |
| 4587 | CleanupReturnInst *cloneImpl() const; |
| 4588 | |
| 4589 | public: |
| 4590 | static CleanupReturnInst *Create(Value *CleanupPad, |
| 4591 | BasicBlock *UnwindBB = nullptr, |
| 4592 | Instruction *InsertBefore = nullptr) { |
| 4593 | assert(CleanupPad)((void)0); |
| 4594 | unsigned Values = 1; |
| 4595 | if (UnwindBB) |
| 4596 | ++Values; |
| 4597 | return new (Values) |
| 4598 | CleanupReturnInst(CleanupPad, UnwindBB, Values, InsertBefore); |
| 4599 | } |
| 4600 | |
| 4601 | static CleanupReturnInst *Create(Value *CleanupPad, BasicBlock *UnwindBB, |
| 4602 | BasicBlock *InsertAtEnd) { |
| 4603 | assert(CleanupPad)((void)0); |
| 4604 | unsigned Values = 1; |
| 4605 | if (UnwindBB) |
| 4606 | ++Values; |
| 4607 | return new (Values) |
| 4608 | CleanupReturnInst(CleanupPad, UnwindBB, Values, InsertAtEnd); |
| 4609 | } |
| 4610 | |
| 4611 | /// Provide fast operand accessors |
| 4612 | DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)public: inline Value *getOperand(unsigned) const; inline void setOperand(unsigned, Value*); inline op_iterator op_begin(); inline const_op_iterator op_begin() const; inline op_iterator op_end(); inline const_op_iterator op_end() const; protected : template <int> inline Use &Op(); template <int > inline const Use &Op() const; public: inline unsigned getNumOperands() const; |
| 4613 | |
| 4614 | bool hasUnwindDest() const { return getSubclassData<UnwindDestField>(); } |
| 4615 | bool unwindsToCaller() const { return !hasUnwindDest(); } |
| 4616 | |
| 4617 | /// Convenience accessor. |
| 4618 | CleanupPadInst *getCleanupPad() const { |
| 4619 | return cast<CleanupPadInst>(Op<0>()); |
| 4620 | } |
| 4621 | void setCleanupPad(CleanupPadInst *CleanupPad) { |
| 4622 | assert(CleanupPad)((void)0); |
| 4623 | Op<0>() = CleanupPad; |
| 4624 | } |
| 4625 | |
| 4626 | unsigned getNumSuccessors() const { return hasUnwindDest() ? 1 : 0; } |
| 4627 | |
| 4628 | BasicBlock *getUnwindDest() const { |
| 4629 | return hasUnwindDest() ? cast<BasicBlock>(Op<1>()) : nullptr; |
| 4630 | } |
| 4631 | void setUnwindDest(BasicBlock *NewDest) { |
| 4632 | assert(NewDest)((void)0); |
| 4633 | assert(hasUnwindDest())((void)0); |
| 4634 | Op<1>() = NewDest; |
| 4635 | } |
| 4636 | |
| 4637 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4638 | static bool classof(const Instruction *I) { |
| 4639 | return (I->getOpcode() == Instruction::CleanupRet); |
| 4640 | } |
| 4641 | static bool classof(const Value *V) { |
| 4642 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4643 | } |
| 4644 | |
| 4645 | private: |
| 4646 | BasicBlock *getSuccessor(unsigned Idx) const { |
| 4647 | assert(Idx == 0)((void)0); |
| 4648 | return getUnwindDest(); |
| 4649 | } |
| 4650 | |
| 4651 | void setSuccessor(unsigned Idx, BasicBlock *B) { |
| 4652 | assert(Idx == 0)((void)0); |
| 4653 | setUnwindDest(B); |
| 4654 | } |
| 4655 | |
| 4656 | // Shadow Instruction::setInstructionSubclassData with a private forwarding |
| 4657 | // method so that subclasses cannot accidentally use it. |
| 4658 | template <typename Bitfield> |
| 4659 | void setSubclassData(typename Bitfield::Type Value) { |
| 4660 | Instruction::setSubclassData<Bitfield>(Value); |
| 4661 | } |
| 4662 | }; |
| 4663 | |
| 4664 | template <> |
| 4665 | struct OperandTraits<CleanupReturnInst> |
| 4666 | : public VariadicOperandTraits<CleanupReturnInst, /*MINARITY=*/1> {}; |
| 4667 | |
| 4668 | DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CleanupReturnInst, Value)CleanupReturnInst::op_iterator CleanupReturnInst::op_begin() { return OperandTraits<CleanupReturnInst>::op_begin(this ); } CleanupReturnInst::const_op_iterator CleanupReturnInst:: op_begin() const { return OperandTraits<CleanupReturnInst> ::op_begin(const_cast<CleanupReturnInst*>(this)); } CleanupReturnInst ::op_iterator CleanupReturnInst::op_end() { return OperandTraits <CleanupReturnInst>::op_end(this); } CleanupReturnInst:: const_op_iterator CleanupReturnInst::op_end() const { return OperandTraits <CleanupReturnInst>::op_end(const_cast<CleanupReturnInst *>(this)); } Value *CleanupReturnInst::getOperand(unsigned i_nocapture) const { ((void)0); return cast_or_null<Value >( OperandTraits<CleanupReturnInst>::op_begin(const_cast <CleanupReturnInst*>(this))[i_nocapture].get()); } void CleanupReturnInst::setOperand(unsigned i_nocapture, Value *Val_nocapture ) { ((void)0); OperandTraits<CleanupReturnInst>::op_begin (this)[i_nocapture] = Val_nocapture; } unsigned CleanupReturnInst ::getNumOperands() const { return OperandTraits<CleanupReturnInst >::operands(this); } template <int Idx_nocapture> Use &CleanupReturnInst::Op() { return this->OpFrom<Idx_nocapture >(this); } template <int Idx_nocapture> const Use & CleanupReturnInst::Op() const { return this->OpFrom<Idx_nocapture >(this); } |
| 4669 | |
| 4670 | //===----------------------------------------------------------------------===// |
| 4671 | // UnreachableInst Class |
| 4672 | //===----------------------------------------------------------------------===// |
| 4673 | |
| 4674 | //===--------------------------------------------------------------------------- |
| 4675 | /// This function has undefined behavior. In particular, the |
| 4676 | /// presence of this instruction indicates some higher level knowledge that the |
| 4677 | /// end of the block cannot be reached. |
| 4678 | /// |
| 4679 | class UnreachableInst : public Instruction { |
| 4680 | protected: |
| 4681 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4682 | friend class Instruction; |
| 4683 | |
| 4684 | UnreachableInst *cloneImpl() const; |
| 4685 | |
| 4686 | public: |
| 4687 | explicit UnreachableInst(LLVMContext &C, Instruction *InsertBefore = nullptr); |
| 4688 | explicit UnreachableInst(LLVMContext &C, BasicBlock *InsertAtEnd); |
| 4689 | |
| 4690 | // allocate space for exactly zero operands |
| 4691 | void *operator new(size_t S) { return User::operator new(S, 0); } |
| 4692 | void operator delete(void *Ptr) { User::operator delete(Ptr); } |
| 4693 | |
| 4694 | unsigned getNumSuccessors() const { return 0; } |
| 4695 | |
| 4696 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4697 | static bool classof(const Instruction *I) { |
| 4698 | return I->getOpcode() == Instruction::Unreachable; |
| 4699 | } |
| 4700 | static bool classof(const Value *V) { |
| 4701 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4702 | } |
| 4703 | |
| 4704 | private: |
| 4705 | BasicBlock *getSuccessor(unsigned idx) const { |
| 4706 | llvm_unreachable("UnreachableInst has no successors!")__builtin_unreachable(); |
| 4707 | } |
| 4708 | |
| 4709 | void setSuccessor(unsigned idx, BasicBlock *B) { |
| 4710 | llvm_unreachable("UnreachableInst has no successors!")__builtin_unreachable(); |
| 4711 | } |
| 4712 | }; |
| 4713 | |
| 4714 | //===----------------------------------------------------------------------===// |
| 4715 | // TruncInst Class |
| 4716 | //===----------------------------------------------------------------------===// |
| 4717 | |
| 4718 | /// This class represents a truncation of integer types. |
| 4719 | class TruncInst : public CastInst { |
| 4720 | protected: |
| 4721 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4722 | friend class Instruction; |
| 4723 | |
| 4724 | /// Clone an identical TruncInst |
| 4725 | TruncInst *cloneImpl() const; |
| 4726 | |
| 4727 | public: |
| 4728 | /// Constructor with insert-before-instruction semantics |
| 4729 | TruncInst( |
| 4730 | Value *S, ///< The value to be truncated |
| 4731 | Type *Ty, ///< The (smaller) type to truncate to |
| 4732 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4733 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4734 | ); |
| 4735 | |
| 4736 | /// Constructor with insert-at-end-of-block semantics |
| 4737 | TruncInst( |
| 4738 | Value *S, ///< The value to be truncated |
| 4739 | Type *Ty, ///< The (smaller) type to truncate to |
| 4740 | const Twine &NameStr, ///< A name for the new instruction |
| 4741 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4742 | ); |
| 4743 | |
| 4744 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4745 | static bool classof(const Instruction *I) { |
| 4746 | return I->getOpcode() == Trunc; |
| 4747 | } |
| 4748 | static bool classof(const Value *V) { |
| 4749 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4750 | } |
| 4751 | }; |
| 4752 | |
| 4753 | //===----------------------------------------------------------------------===// |
| 4754 | // ZExtInst Class |
| 4755 | //===----------------------------------------------------------------------===// |
| 4756 | |
| 4757 | /// This class represents zero extension of integer types. |
| 4758 | class ZExtInst : public CastInst { |
| 4759 | protected: |
| 4760 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4761 | friend class Instruction; |
| 4762 | |
| 4763 | /// Clone an identical ZExtInst |
| 4764 | ZExtInst *cloneImpl() const; |
| 4765 | |
| 4766 | public: |
| 4767 | /// Constructor with insert-before-instruction semantics |
| 4768 | ZExtInst( |
| 4769 | Value *S, ///< The value to be zero extended |
| 4770 | Type *Ty, ///< The type to zero extend to |
| 4771 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4772 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4773 | ); |
| 4774 | |
| 4775 | /// Constructor with insert-at-end semantics. |
| 4776 | ZExtInst( |
| 4777 | Value *S, ///< The value to be zero extended |
| 4778 | Type *Ty, ///< The type to zero extend to |
| 4779 | const Twine &NameStr, ///< A name for the new instruction |
| 4780 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4781 | ); |
| 4782 | |
| 4783 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4784 | static bool classof(const Instruction *I) { |
| 4785 | return I->getOpcode() == ZExt; |
| 4786 | } |
| 4787 | static bool classof(const Value *V) { |
| 4788 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4789 | } |
| 4790 | }; |
| 4791 | |
| 4792 | //===----------------------------------------------------------------------===// |
| 4793 | // SExtInst Class |
| 4794 | //===----------------------------------------------------------------------===// |
| 4795 | |
| 4796 | /// This class represents a sign extension of integer types. |
| 4797 | class SExtInst : public CastInst { |
| 4798 | protected: |
| 4799 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4800 | friend class Instruction; |
| 4801 | |
| 4802 | /// Clone an identical SExtInst |
| 4803 | SExtInst *cloneImpl() const; |
| 4804 | |
| 4805 | public: |
| 4806 | /// Constructor with insert-before-instruction semantics |
| 4807 | SExtInst( |
| 4808 | Value *S, ///< The value to be sign extended |
| 4809 | Type *Ty, ///< The type to sign extend to |
| 4810 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4811 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4812 | ); |
| 4813 | |
| 4814 | /// Constructor with insert-at-end-of-block semantics |
| 4815 | SExtInst( |
| 4816 | Value *S, ///< The value to be sign extended |
| 4817 | Type *Ty, ///< The type to sign extend to |
| 4818 | const Twine &NameStr, ///< A name for the new instruction |
| 4819 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4820 | ); |
| 4821 | |
| 4822 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4823 | static bool classof(const Instruction *I) { |
| 4824 | return I->getOpcode() == SExt; |
| 4825 | } |
| 4826 | static bool classof(const Value *V) { |
| 4827 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4828 | } |
| 4829 | }; |
| 4830 | |
| 4831 | //===----------------------------------------------------------------------===// |
| 4832 | // FPTruncInst Class |
| 4833 | //===----------------------------------------------------------------------===// |
| 4834 | |
| 4835 | /// This class represents a truncation of floating point types. |
| 4836 | class FPTruncInst : public CastInst { |
| 4837 | protected: |
| 4838 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4839 | friend class Instruction; |
| 4840 | |
| 4841 | /// Clone an identical FPTruncInst |
| 4842 | FPTruncInst *cloneImpl() const; |
| 4843 | |
| 4844 | public: |
| 4845 | /// Constructor with insert-before-instruction semantics |
| 4846 | FPTruncInst( |
| 4847 | Value *S, ///< The value to be truncated |
| 4848 | Type *Ty, ///< The type to truncate to |
| 4849 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4850 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4851 | ); |
| 4852 | |
| 4853 | /// Constructor with insert-before-instruction semantics |
| 4854 | FPTruncInst( |
| 4855 | Value *S, ///< The value to be truncated |
| 4856 | Type *Ty, ///< The type to truncate to |
| 4857 | const Twine &NameStr, ///< A name for the new instruction |
| 4858 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4859 | ); |
| 4860 | |
| 4861 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4862 | static bool classof(const Instruction *I) { |
| 4863 | return I->getOpcode() == FPTrunc; |
| 4864 | } |
| 4865 | static bool classof(const Value *V) { |
| 4866 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4867 | } |
| 4868 | }; |
| 4869 | |
| 4870 | //===----------------------------------------------------------------------===// |
| 4871 | // FPExtInst Class |
| 4872 | //===----------------------------------------------------------------------===// |
| 4873 | |
| 4874 | /// This class represents an extension of floating point types. |
| 4875 | class FPExtInst : public CastInst { |
| 4876 | protected: |
| 4877 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4878 | friend class Instruction; |
| 4879 | |
| 4880 | /// Clone an identical FPExtInst |
| 4881 | FPExtInst *cloneImpl() const; |
| 4882 | |
| 4883 | public: |
| 4884 | /// Constructor with insert-before-instruction semantics |
| 4885 | FPExtInst( |
| 4886 | Value *S, ///< The value to be extended |
| 4887 | Type *Ty, ///< The type to extend to |
| 4888 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4889 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4890 | ); |
| 4891 | |
| 4892 | /// Constructor with insert-at-end-of-block semantics |
| 4893 | FPExtInst( |
| 4894 | Value *S, ///< The value to be extended |
| 4895 | Type *Ty, ///< The type to extend to |
| 4896 | const Twine &NameStr, ///< A name for the new instruction |
| 4897 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4898 | ); |
| 4899 | |
| 4900 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4901 | static bool classof(const Instruction *I) { |
| 4902 | return I->getOpcode() == FPExt; |
| 4903 | } |
| 4904 | static bool classof(const Value *V) { |
| 4905 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4906 | } |
| 4907 | }; |
| 4908 | |
| 4909 | //===----------------------------------------------------------------------===// |
| 4910 | // UIToFPInst Class |
| 4911 | //===----------------------------------------------------------------------===// |
| 4912 | |
| 4913 | /// This class represents a cast unsigned integer to floating point. |
| 4914 | class UIToFPInst : public CastInst { |
| 4915 | protected: |
| 4916 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4917 | friend class Instruction; |
| 4918 | |
| 4919 | /// Clone an identical UIToFPInst |
| 4920 | UIToFPInst *cloneImpl() const; |
| 4921 | |
| 4922 | public: |
| 4923 | /// Constructor with insert-before-instruction semantics |
| 4924 | UIToFPInst( |
| 4925 | Value *S, ///< The value to be converted |
| 4926 | Type *Ty, ///< The type to convert to |
| 4927 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4928 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4929 | ); |
| 4930 | |
| 4931 | /// Constructor with insert-at-end-of-block semantics |
| 4932 | UIToFPInst( |
| 4933 | Value *S, ///< The value to be converted |
| 4934 | Type *Ty, ///< The type to convert to |
| 4935 | const Twine &NameStr, ///< A name for the new instruction |
| 4936 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4937 | ); |
| 4938 | |
| 4939 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4940 | static bool classof(const Instruction *I) { |
| 4941 | return I->getOpcode() == UIToFP; |
| 4942 | } |
| 4943 | static bool classof(const Value *V) { |
| 4944 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4945 | } |
| 4946 | }; |
| 4947 | |
| 4948 | //===----------------------------------------------------------------------===// |
| 4949 | // SIToFPInst Class |
| 4950 | //===----------------------------------------------------------------------===// |
| 4951 | |
| 4952 | /// This class represents a cast from signed integer to floating point. |
| 4953 | class SIToFPInst : public CastInst { |
| 4954 | protected: |
| 4955 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4956 | friend class Instruction; |
| 4957 | |
| 4958 | /// Clone an identical SIToFPInst |
| 4959 | SIToFPInst *cloneImpl() const; |
| 4960 | |
| 4961 | public: |
| 4962 | /// Constructor with insert-before-instruction semantics |
| 4963 | SIToFPInst( |
| 4964 | Value *S, ///< The value to be converted |
| 4965 | Type *Ty, ///< The type to convert to |
| 4966 | const Twine &NameStr = "", ///< A name for the new instruction |
| 4967 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 4968 | ); |
| 4969 | |
| 4970 | /// Constructor with insert-at-end-of-block semantics |
| 4971 | SIToFPInst( |
| 4972 | Value *S, ///< The value to be converted |
| 4973 | Type *Ty, ///< The type to convert to |
| 4974 | const Twine &NameStr, ///< A name for the new instruction |
| 4975 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 4976 | ); |
| 4977 | |
| 4978 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 4979 | static bool classof(const Instruction *I) { |
| 4980 | return I->getOpcode() == SIToFP; |
| 4981 | } |
| 4982 | static bool classof(const Value *V) { |
| 4983 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 4984 | } |
| 4985 | }; |
| 4986 | |
| 4987 | //===----------------------------------------------------------------------===// |
| 4988 | // FPToUIInst Class |
| 4989 | //===----------------------------------------------------------------------===// |
| 4990 | |
| 4991 | /// This class represents a cast from floating point to unsigned integer |
| 4992 | class FPToUIInst : public CastInst { |
| 4993 | protected: |
| 4994 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 4995 | friend class Instruction; |
| 4996 | |
| 4997 | /// Clone an identical FPToUIInst |
| 4998 | FPToUIInst *cloneImpl() const; |
| 4999 | |
| 5000 | public: |
| 5001 | /// Constructor with insert-before-instruction semantics |
| 5002 | FPToUIInst( |
| 5003 | Value *S, ///< The value to be converted |
| 5004 | Type *Ty, ///< The type to convert to |
| 5005 | const Twine &NameStr = "", ///< A name for the new instruction |
| 5006 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 5007 | ); |
| 5008 | |
| 5009 | /// Constructor with insert-at-end-of-block semantics |
| 5010 | FPToUIInst( |
| 5011 | Value *S, ///< The value to be converted |
| 5012 | Type *Ty, ///< The type to convert to |
| 5013 | const Twine &NameStr, ///< A name for the new instruction |
| 5014 | BasicBlock *InsertAtEnd ///< Where to insert the new instruction |
| 5015 | ); |
| 5016 | |
| 5017 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5018 | static bool classof(const Instruction *I) { |
| 5019 | return I->getOpcode() == FPToUI; |
| 5020 | } |
| 5021 | static bool classof(const Value *V) { |
| 5022 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5023 | } |
| 5024 | }; |
| 5025 | |
| 5026 | //===----------------------------------------------------------------------===// |
| 5027 | // FPToSIInst Class |
| 5028 | //===----------------------------------------------------------------------===// |
| 5029 | |
| 5030 | /// This class represents a cast from floating point to signed integer. |
| 5031 | class FPToSIInst : public CastInst { |
| 5032 | protected: |
| 5033 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 5034 | friend class Instruction; |
| 5035 | |
| 5036 | /// Clone an identical FPToSIInst |
| 5037 | FPToSIInst *cloneImpl() const; |
| 5038 | |
| 5039 | public: |
| 5040 | /// Constructor with insert-before-instruction semantics |
| 5041 | FPToSIInst( |
| 5042 | Value *S, ///< The value to be converted |
| 5043 | Type *Ty, ///< The type to convert to |
| 5044 | const Twine &NameStr = "", ///< A name for the new instruction |
| 5045 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 5046 | ); |
| 5047 | |
| 5048 | /// Constructor with insert-at-end-of-block semantics |
| 5049 | FPToSIInst( |
| 5050 | Value *S, ///< The value to be converted |
| 5051 | Type *Ty, ///< The type to convert to |
| 5052 | const Twine &NameStr, ///< A name for the new instruction |
| 5053 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 5054 | ); |
| 5055 | |
| 5056 | /// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5057 | static bool classof(const Instruction *I) { |
| 5058 | return I->getOpcode() == FPToSI; |
| 5059 | } |
| 5060 | static bool classof(const Value *V) { |
| 5061 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5062 | } |
| 5063 | }; |
| 5064 | |
| 5065 | //===----------------------------------------------------------------------===// |
| 5066 | // IntToPtrInst Class |
| 5067 | //===----------------------------------------------------------------------===// |
| 5068 | |
| 5069 | /// This class represents a cast from an integer to a pointer. |
| 5070 | class IntToPtrInst : public CastInst { |
| 5071 | public: |
| 5072 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 5073 | friend class Instruction; |
| 5074 | |
| 5075 | /// Constructor with insert-before-instruction semantics |
| 5076 | IntToPtrInst( |
| 5077 | Value *S, ///< The value to be converted |
| 5078 | Type *Ty, ///< The type to convert to |
| 5079 | const Twine &NameStr = "", ///< A name for the new instruction |
| 5080 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 5081 | ); |
| 5082 | |
| 5083 | /// Constructor with insert-at-end-of-block semantics |
| 5084 | IntToPtrInst( |
| 5085 | Value *S, ///< The value to be converted |
| 5086 | Type *Ty, ///< The type to convert to |
| 5087 | const Twine &NameStr, ///< A name for the new instruction |
| 5088 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 5089 | ); |
| 5090 | |
| 5091 | /// Clone an identical IntToPtrInst. |
| 5092 | IntToPtrInst *cloneImpl() const; |
| 5093 | |
| 5094 | /// Returns the address space of this instruction's pointer type. |
| 5095 | unsigned getAddressSpace() const { |
| 5096 | return getType()->getPointerAddressSpace(); |
| 5097 | } |
| 5098 | |
| 5099 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5100 | static bool classof(const Instruction *I) { |
| 5101 | return I->getOpcode() == IntToPtr; |
| 5102 | } |
| 5103 | static bool classof(const Value *V) { |
| 5104 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5105 | } |
| 5106 | }; |
| 5107 | |
| 5108 | //===----------------------------------------------------------------------===// |
| 5109 | // PtrToIntInst Class |
| 5110 | //===----------------------------------------------------------------------===// |
| 5111 | |
| 5112 | /// This class represents a cast from a pointer to an integer. |
| 5113 | class PtrToIntInst : public CastInst { |
| 5114 | protected: |
| 5115 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 5116 | friend class Instruction; |
| 5117 | |
| 5118 | /// Clone an identical PtrToIntInst. |
| 5119 | PtrToIntInst *cloneImpl() const; |
| 5120 | |
| 5121 | public: |
| 5122 | /// Constructor with insert-before-instruction semantics |
| 5123 | PtrToIntInst( |
| 5124 | Value *S, ///< The value to be converted |
| 5125 | Type *Ty, ///< The type to convert to |
| 5126 | const Twine &NameStr = "", ///< A name for the new instruction |
| 5127 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 5128 | ); |
| 5129 | |
| 5130 | /// Constructor with insert-at-end-of-block semantics |
| 5131 | PtrToIntInst( |
| 5132 | Value *S, ///< The value to be converted |
| 5133 | Type *Ty, ///< The type to convert to |
| 5134 | const Twine &NameStr, ///< A name for the new instruction |
| 5135 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 5136 | ); |
| 5137 | |
| 5138 | /// Gets the pointer operand. |
| 5139 | Value *getPointerOperand() { return getOperand(0); } |
| 5140 | /// Gets the pointer operand. |
| 5141 | const Value *getPointerOperand() const { return getOperand(0); } |
| 5142 | /// Gets the operand index of the pointer operand. |
| 5143 | static unsigned getPointerOperandIndex() { return 0U; } |
| 5144 | |
| 5145 | /// Returns the address space of the pointer operand. |
| 5146 | unsigned getPointerAddressSpace() const { |
| 5147 | return getPointerOperand()->getType()->getPointerAddressSpace(); |
| 5148 | } |
| 5149 | |
| 5150 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5151 | static bool classof(const Instruction *I) { |
| 5152 | return I->getOpcode() == PtrToInt; |
| 5153 | } |
| 5154 | static bool classof(const Value *V) { |
| 5155 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5156 | } |
| 5157 | }; |
| 5158 | |
| 5159 | //===----------------------------------------------------------------------===// |
| 5160 | // BitCastInst Class |
| 5161 | //===----------------------------------------------------------------------===// |
| 5162 | |
| 5163 | /// This class represents a no-op cast from one type to another. |
| 5164 | class BitCastInst : public CastInst { |
| 5165 | protected: |
| 5166 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 5167 | friend class Instruction; |
| 5168 | |
| 5169 | /// Clone an identical BitCastInst. |
| 5170 | BitCastInst *cloneImpl() const; |
| 5171 | |
| 5172 | public: |
| 5173 | /// Constructor with insert-before-instruction semantics |
| 5174 | BitCastInst( |
| 5175 | Value *S, ///< The value to be casted |
| 5176 | Type *Ty, ///< The type to casted to |
| 5177 | const Twine &NameStr = "", ///< A name for the new instruction |
| 5178 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 5179 | ); |
| 5180 | |
| 5181 | /// Constructor with insert-at-end-of-block semantics |
| 5182 | BitCastInst( |
| 5183 | Value *S, ///< The value to be casted |
| 5184 | Type *Ty, ///< The type to casted to |
| 5185 | const Twine &NameStr, ///< A name for the new instruction |
| 5186 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 5187 | ); |
| 5188 | |
| 5189 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5190 | static bool classof(const Instruction *I) { |
| 5191 | return I->getOpcode() == BitCast; |
| 5192 | } |
| 5193 | static bool classof(const Value *V) { |
| 5194 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5195 | } |
| 5196 | }; |
| 5197 | |
| 5198 | //===----------------------------------------------------------------------===// |
| 5199 | // AddrSpaceCastInst Class |
| 5200 | //===----------------------------------------------------------------------===// |
| 5201 | |
| 5202 | /// This class represents a conversion between pointers from one address space |
| 5203 | /// to another. |
| 5204 | class AddrSpaceCastInst : public CastInst { |
| 5205 | protected: |
| 5206 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 5207 | friend class Instruction; |
| 5208 | |
| 5209 | /// Clone an identical AddrSpaceCastInst. |
| 5210 | AddrSpaceCastInst *cloneImpl() const; |
| 5211 | |
| 5212 | public: |
| 5213 | /// Constructor with insert-before-instruction semantics |
| 5214 | AddrSpaceCastInst( |
| 5215 | Value *S, ///< The value to be casted |
| 5216 | Type *Ty, ///< The type to casted to |
| 5217 | const Twine &NameStr = "", ///< A name for the new instruction |
| 5218 | Instruction *InsertBefore = nullptr ///< Where to insert the new instruction |
| 5219 | ); |
| 5220 | |
| 5221 | /// Constructor with insert-at-end-of-block semantics |
| 5222 | AddrSpaceCastInst( |
| 5223 | Value *S, ///< The value to be casted |
| 5224 | Type *Ty, ///< The type to casted to |
| 5225 | const Twine &NameStr, ///< A name for the new instruction |
| 5226 | BasicBlock *InsertAtEnd ///< The block to insert the instruction into |
| 5227 | ); |
| 5228 | |
| 5229 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5230 | static bool classof(const Instruction *I) { |
| 5231 | return I->getOpcode() == AddrSpaceCast; |
| 5232 | } |
| 5233 | static bool classof(const Value *V) { |
| 5234 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5235 | } |
| 5236 | |
| 5237 | /// Gets the pointer operand. |
| 5238 | Value *getPointerOperand() { |
| 5239 | return getOperand(0); |
| 5240 | } |
| 5241 | |
| 5242 | /// Gets the pointer operand. |
| 5243 | const Value *getPointerOperand() const { |
| 5244 | return getOperand(0); |
| 5245 | } |
| 5246 | |
| 5247 | /// Gets the operand index of the pointer operand. |
| 5248 | static unsigned getPointerOperandIndex() { |
| 5249 | return 0U; |
| 5250 | } |
| 5251 | |
| 5252 | /// Returns the address space of the pointer operand. |
| 5253 | unsigned getSrcAddressSpace() const { |
| 5254 | return getPointerOperand()->getType()->getPointerAddressSpace(); |
| 5255 | } |
| 5256 | |
| 5257 | /// Returns the address space of the result. |
| 5258 | unsigned getDestAddressSpace() const { |
| 5259 | return getType()->getPointerAddressSpace(); |
| 5260 | } |
| 5261 | }; |
| 5262 | |
| 5263 | /// A helper function that returns the pointer operand of a load or store |
| 5264 | /// instruction. Returns nullptr if not load or store. |
| 5265 | inline const Value *getLoadStorePointerOperand(const Value *V) { |
| 5266 | if (auto *Load = dyn_cast<LoadInst>(V)) |
| 5267 | return Load->getPointerOperand(); |
| 5268 | if (auto *Store = dyn_cast<StoreInst>(V)) |
| 5269 | return Store->getPointerOperand(); |
| 5270 | return nullptr; |
| 5271 | } |
| 5272 | inline Value *getLoadStorePointerOperand(Value *V) { |
| 5273 | return const_cast<Value *>( |
| 5274 | getLoadStorePointerOperand(static_cast<const Value *>(V))); |
| 5275 | } |
| 5276 | |
| 5277 | /// A helper function that returns the pointer operand of a load, store |
| 5278 | /// or GEP instruction. Returns nullptr if not load, store, or GEP. |
| 5279 | inline const Value *getPointerOperand(const Value *V) { |
| 5280 | if (auto *Ptr = getLoadStorePointerOperand(V)) |
| 5281 | return Ptr; |
| 5282 | if (auto *Gep = dyn_cast<GetElementPtrInst>(V)) |
| 5283 | return Gep->getPointerOperand(); |
| 5284 | return nullptr; |
| 5285 | } |
| 5286 | inline Value *getPointerOperand(Value *V) { |
| 5287 | return const_cast<Value *>(getPointerOperand(static_cast<const Value *>(V))); |
| 5288 | } |
| 5289 | |
| 5290 | /// A helper function that returns the alignment of load or store instruction. |
| 5291 | inline Align getLoadStoreAlignment(Value *I) { |
| 5292 | assert((isa<LoadInst>(I) || isa<StoreInst>(I)) &&((void)0) |
| 5293 | "Expected Load or Store instruction")((void)0); |
| 5294 | if (auto *LI = dyn_cast<LoadInst>(I)) |
| 5295 | return LI->getAlign(); |
| 5296 | return cast<StoreInst>(I)->getAlign(); |
| 5297 | } |
| 5298 | |
| 5299 | /// A helper function that returns the address space of the pointer operand of |
| 5300 | /// load or store instruction. |
| 5301 | inline unsigned getLoadStoreAddressSpace(Value *I) { |
| 5302 | assert((isa<LoadInst>(I) || isa<StoreInst>(I)) &&((void)0) |
| 5303 | "Expected Load or Store instruction")((void)0); |
| 5304 | if (auto *LI = dyn_cast<LoadInst>(I)) |
| 5305 | return LI->getPointerAddressSpace(); |
| 5306 | return cast<StoreInst>(I)->getPointerAddressSpace(); |
| 5307 | } |
| 5308 | |
| 5309 | /// A helper function that returns the type of a load or store instruction. |
| 5310 | inline Type *getLoadStoreType(Value *I) { |
| 5311 | assert((isa<LoadInst>(I) || isa<StoreInst>(I)) &&((void)0) |
| 5312 | "Expected Load or Store instruction")((void)0); |
| 5313 | if (auto *LI = dyn_cast<LoadInst>(I)) |
| 5314 | return LI->getType(); |
| 5315 | return cast<StoreInst>(I)->getValueOperand()->getType(); |
| 5316 | } |
| 5317 | |
| 5318 | //===----------------------------------------------------------------------===// |
| 5319 | // FreezeInst Class |
| 5320 | //===----------------------------------------------------------------------===// |
| 5321 | |
| 5322 | /// This class represents a freeze function that returns random concrete |
| 5323 | /// value if an operand is either a poison value or an undef value |
| 5324 | class FreezeInst : public UnaryInstruction { |
| 5325 | protected: |
| 5326 | // Note: Instruction needs to be a friend here to call cloneImpl. |
| 5327 | friend class Instruction; |
| 5328 | |
| 5329 | /// Clone an identical FreezeInst |
| 5330 | FreezeInst *cloneImpl() const; |
| 5331 | |
| 5332 | public: |
| 5333 | explicit FreezeInst(Value *S, |
| 5334 | const Twine &NameStr = "", |
| 5335 | Instruction *InsertBefore = nullptr); |
| 5336 | FreezeInst(Value *S, const Twine &NameStr, BasicBlock *InsertAtEnd); |
| 5337 | |
| 5338 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
| 5339 | static inline bool classof(const Instruction *I) { |
| 5340 | return I->getOpcode() == Freeze; |
| 5341 | } |
| 5342 | static inline bool classof(const Value *V) { |
| 5343 | return isa<Instruction>(V) && classof(cast<Instruction>(V)); |
| 5344 | } |
| 5345 | }; |
| 5346 | |
| 5347 | } // end namespace llvm |
| 5348 | |
| 5349 | #endif // LLVM_IR_INSTRUCTIONS_H |
| 1 | //===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file defines the generic AliasAnalysis interface, which is used as the |
| 10 | // common interface used by all clients of alias analysis information, and |
| 11 | // implemented by all alias analysis implementations. Mod/Ref information is |
| 12 | // also captured by this interface. |
| 13 | // |
| 14 | // Implementations of this interface must implement the various virtual methods, |
| 15 | // which automatically provides functionality for the entire suite of client |
| 16 | // APIs. |
| 17 | // |
| 18 | // This API identifies memory regions with the MemoryLocation class. The pointer |
| 19 | // component specifies the base memory address of the region. The Size specifies |
| 20 | // the maximum size (in address units) of the memory region, or |
| 21 | // MemoryLocation::UnknownSize if the size is not known. The TBAA tag |
| 22 | // identifies the "type" of the memory reference; see the |
| 23 | // TypeBasedAliasAnalysis class for details. |
| 24 | // |
| 25 | // Some non-obvious details include: |
| 26 | // - Pointers that point to two completely different objects in memory never |
| 27 | // alias, regardless of the value of the Size component. |
| 28 | // - NoAlias doesn't imply inequal pointers. The most obvious example of this |
| 29 | // is two pointers to constant memory. Even if they are equal, constant |
| 30 | // memory is never stored to, so there will never be any dependencies. |
| 31 | // In this and other situations, the pointers may be both NoAlias and |
| 32 | // MustAlias at the same time. The current API can only return one result, |
| 33 | // though this is rarely a problem in practice. |
| 34 | // |
| 35 | //===----------------------------------------------------------------------===// |
| 36 | |
| 37 | #ifndef LLVM_ANALYSIS_ALIASANALYSIS_H |
| 38 | #define LLVM_ANALYSIS_ALIASANALYSIS_H |
| 39 | |
| 40 | #include "llvm/ADT/DenseMap.h" |
| 41 | #include "llvm/ADT/None.h" |
| 42 | #include "llvm/ADT/Optional.h" |
| 43 | #include "llvm/ADT/SmallVector.h" |
| 44 | #include "llvm/Analysis/MemoryLocation.h" |
| 45 | #include "llvm/IR/PassManager.h" |
| 46 | #include "llvm/Pass.h" |
| 47 | #include <cstdint> |
| 48 | #include <functional> |
| 49 | #include <memory> |
| 50 | #include <vector> |
| 51 | |
| 52 | namespace llvm { |
| 53 | |
| 54 | class AnalysisUsage; |
| 55 | class AtomicCmpXchgInst; |
| 56 | class BasicAAResult; |
| 57 | class BasicBlock; |
| 58 | class CatchPadInst; |
| 59 | class CatchReturnInst; |
| 60 | class DominatorTree; |
| 61 | class FenceInst; |
| 62 | class Function; |
| 63 | class InvokeInst; |
| 64 | class PreservedAnalyses; |
| 65 | class TargetLibraryInfo; |
| 66 | class Value; |
| 67 | |
| 68 | /// The possible results of an alias query. |
| 69 | /// |
| 70 | /// These results are always computed between two MemoryLocation objects as |
| 71 | /// a query to some alias analysis. |
| 72 | /// |
| 73 | /// Note that these are unscoped enumerations because we would like to support |
| 74 | /// implicitly testing a result for the existence of any possible aliasing with |
| 75 | /// a conversion to bool, but an "enum class" doesn't support this. The |
| 76 | /// canonical names from the literature are suffixed and unique anyways, and so |
| 77 | /// they serve as global constants in LLVM for these results. |
| 78 | /// |
| 79 | /// See docs/AliasAnalysis.html for more information on the specific meanings |
| 80 | /// of these values. |
| 81 | class AliasResult { |
| 82 | private: |
| 83 | static const int OffsetBits = 23; |
| 84 | static const int AliasBits = 8; |
| 85 | static_assert(AliasBits + 1 + OffsetBits <= 32, |
| 86 | "AliasResult size is intended to be 4 bytes!"); |
| 87 | |
| 88 | unsigned int Alias : AliasBits; |
| 89 | unsigned int HasOffset : 1; |
| 90 | signed int Offset : OffsetBits; |
| 91 | |
| 92 | public: |
| 93 | enum Kind : uint8_t { |
| 94 | /// The two locations do not alias at all. |
| 95 | /// |
| 96 | /// This value is arranged to convert to false, while all other values |
| 97 | /// convert to true. This allows a boolean context to convert the result to |
| 98 | /// a binary flag indicating whether there is the possibility of aliasing. |
| 99 | NoAlias = 0, |
| 100 | /// The two locations may or may not alias. This is the least precise |
| 101 | /// result. |
| 102 | MayAlias, |
| 103 | /// The two locations alias, but only due to a partial overlap. |
| 104 | PartialAlias, |
| 105 | /// The two locations precisely alias each other. |
| 106 | MustAlias, |
| 107 | }; |
| 108 | static_assert(MustAlias < (1 << AliasBits), |
| 109 | "Not enough bit field size for the enum!"); |
| 110 | |
| 111 | explicit AliasResult() = delete; |
| 112 | constexpr AliasResult(const Kind &Alias) |
| 113 | : Alias(Alias), HasOffset(false), Offset(0) {} |
| 114 | |
| 115 | operator Kind() const { return static_cast<Kind>(Alias); } |
| 116 | |
| 117 | constexpr bool hasOffset() const { return HasOffset; } |
| 118 | constexpr int32_t getOffset() const { |
| 119 | assert(HasOffset && "No offset!")((void)0); |
| 120 | return Offset; |
| 121 | } |
| 122 | void setOffset(int32_t NewOffset) { |
| 123 | if (isInt<OffsetBits>(NewOffset)) { |
| 124 | HasOffset = true; |
| 125 | Offset = NewOffset; |
| 126 | } |
| 127 | } |
| 128 | |
| 129 | /// Helper for processing AliasResult for swapped memory location pairs. |
| 130 | void swap(bool DoSwap = true) { |
| 131 | if (DoSwap && hasOffset()) |
| 132 | setOffset(-getOffset()); |
| 133 | } |
| 134 | }; |
| 135 | |
| 136 | static_assert(sizeof(AliasResult) == 4, |
| 137 | "AliasResult size is intended to be 4 bytes!"); |
| 138 | |
| 139 | /// << operator for AliasResult. |
| 140 | raw_ostream &operator<<(raw_ostream &OS, AliasResult AR); |
| 141 | |
| 142 | /// Flags indicating whether a memory access modifies or references memory. |
| 143 | /// |
| 144 | /// This is no access at all, a modification, a reference, or both |
| 145 | /// a modification and a reference. These are specifically structured such that |
| 146 | /// they form a three bit matrix and bit-tests for 'mod' or 'ref' or 'must' |
| 147 | /// work with any of the possible values. |
| 148 | enum class ModRefInfo : uint8_t { |
| 149 | /// Must is provided for completeness, but no routines will return only |
| 150 | /// Must today. See definition of Must below. |
| 151 | Must = 0, |
| 152 | /// The access may reference the value stored in memory, |
| 153 | /// a mustAlias relation was found, and no mayAlias or partialAlias found. |
| 154 | MustRef = 1, |
| 155 | /// The access may modify the value stored in memory, |
| 156 | /// a mustAlias relation was found, and no mayAlias or partialAlias found. |
| 157 | MustMod = 2, |
| 158 | /// The access may reference, modify or both the value stored in memory, |
| 159 | /// a mustAlias relation was found, and no mayAlias or partialAlias found. |
| 160 | MustModRef = MustRef | MustMod, |
| 161 | /// The access neither references nor modifies the value stored in memory. |
| 162 | NoModRef = 4, |
| 163 | /// The access may reference the value stored in memory. |
| 164 | Ref = NoModRef | MustRef, |
| 165 | /// The access may modify the value stored in memory. |
| 166 | Mod = NoModRef | MustMod, |
| 167 | /// The access may reference and may modify the value stored in memory. |
| 168 | ModRef = Ref | Mod, |
| 169 | |
| 170 | /// About Must: |
| 171 | /// Must is set in a best effort manner. |
| 172 | /// We usually do not try our best to infer Must, instead it is merely |
| 173 | /// another piece of "free" information that is presented when available. |
| 174 | /// Must set means there was certainly a MustAlias found. For calls, |
| 175 | /// where multiple arguments are checked (argmemonly), this translates to |
| 176 | /// only MustAlias or NoAlias was found. |
| 177 | /// Must is not set for RAR accesses, even if the two locations must |
| 178 | /// alias. The reason is that two read accesses translate to an early return |
| 179 | /// of NoModRef. An additional alias check to set Must may be |
| 180 | /// expensive. Other cases may also not set Must(e.g. callCapturesBefore). |
| 181 | /// We refer to Must being *set* when the most significant bit is *cleared*. |
| 182 | /// Conversely we *clear* Must information by *setting* the Must bit to 1. |
| 183 | }; |
| 184 | |
| 185 | LLVM_NODISCARD[[clang::warn_unused_result]] inline bool isNoModRef(const ModRefInfo MRI) { |
| 186 | return (static_cast<int>(MRI) & static_cast<int>(ModRefInfo::MustModRef)) == |
| 187 | static_cast<int>(ModRefInfo::Must); |
| 188 | } |
| 189 | LLVM_NODISCARD[[clang::warn_unused_result]] inline bool isModOrRefSet(const ModRefInfo MRI) { |
| 190 | return static_cast<int>(MRI) & static_cast<int>(ModRefInfo::MustModRef); |
| 191 | } |
| 192 | LLVM_NODISCARD[[clang::warn_unused_result]] inline bool isModAndRefSet(const ModRefInfo MRI) { |
| 193 | return (static_cast<int>(MRI) & static_cast<int>(ModRefInfo::MustModRef)) == |
| 194 | static_cast<int>(ModRefInfo::MustModRef); |
| 195 | } |
| 196 | LLVM_NODISCARD[[clang::warn_unused_result]] inline bool isModSet(const ModRefInfo MRI) { |
| 197 | return static_cast<int>(MRI) & static_cast<int>(ModRefInfo::MustMod); |
| 198 | } |
| 199 | LLVM_NODISCARD[[clang::warn_unused_result]] inline bool isRefSet(const ModRefInfo MRI) { |
| 200 | return static_cast<int>(MRI) & static_cast<int>(ModRefInfo::MustRef); |
| 201 | } |
| 202 | LLVM_NODISCARD[[clang::warn_unused_result]] inline bool isMustSet(const ModRefInfo MRI) { |
| 203 | return !(static_cast<int>(MRI) & static_cast<int>(ModRefInfo::NoModRef)); |
| 204 | } |
| 205 | |
| 206 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo setMod(const ModRefInfo MRI) { |
| 207 | return ModRefInfo(static_cast<int>(MRI) | |
| 208 | static_cast<int>(ModRefInfo::MustMod)); |
| 209 | } |
| 210 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo setRef(const ModRefInfo MRI) { |
| 211 | return ModRefInfo(static_cast<int>(MRI) | |
| 212 | static_cast<int>(ModRefInfo::MustRef)); |
| 213 | } |
| 214 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo setMust(const ModRefInfo MRI) { |
| 215 | return ModRefInfo(static_cast<int>(MRI) & |
| 216 | static_cast<int>(ModRefInfo::MustModRef)); |
| 217 | } |
| 218 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo setModAndRef(const ModRefInfo MRI) { |
| 219 | return ModRefInfo(static_cast<int>(MRI) | |
| 220 | static_cast<int>(ModRefInfo::MustModRef)); |
| 221 | } |
| 222 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo clearMod(const ModRefInfo MRI) { |
| 223 | return ModRefInfo(static_cast<int>(MRI) & static_cast<int>(ModRefInfo::Ref)); |
| 224 | } |
| 225 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo clearRef(const ModRefInfo MRI) { |
| 226 | return ModRefInfo(static_cast<int>(MRI) & static_cast<int>(ModRefInfo::Mod)); |
| 227 | } |
| 228 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo clearMust(const ModRefInfo MRI) { |
| 229 | return ModRefInfo(static_cast<int>(MRI) | |
| 230 | static_cast<int>(ModRefInfo::NoModRef)); |
| 231 | } |
| 232 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo unionModRef(const ModRefInfo MRI1, |
| 233 | const ModRefInfo MRI2) { |
| 234 | return ModRefInfo(static_cast<int>(MRI1) | static_cast<int>(MRI2)); |
| 235 | } |
| 236 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo intersectModRef(const ModRefInfo MRI1, |
| 237 | const ModRefInfo MRI2) { |
| 238 | return ModRefInfo(static_cast<int>(MRI1) & static_cast<int>(MRI2)); |
| 239 | } |
| 240 | |
| 241 | /// The locations at which a function might access memory. |
| 242 | /// |
| 243 | /// These are primarily used in conjunction with the \c AccessKind bits to |
| 244 | /// describe both the nature of access and the locations of access for a |
| 245 | /// function call. |
| 246 | enum FunctionModRefLocation { |
| 247 | /// Base case is no access to memory. |
| 248 | FMRL_Nowhere = 0, |
| 249 | /// Access to memory via argument pointers. |
| 250 | FMRL_ArgumentPointees = 8, |
| 251 | /// Memory that is inaccessible via LLVM IR. |
| 252 | FMRL_InaccessibleMem = 16, |
| 253 | /// Access to any memory. |
| 254 | FMRL_Anywhere = 32 | FMRL_InaccessibleMem | FMRL_ArgumentPointees |
| 255 | }; |
| 256 | |
| 257 | /// Summary of how a function affects memory in the program. |
| 258 | /// |
| 259 | /// Loads from constant globals are not considered memory accesses for this |
| 260 | /// interface. Also, functions may freely modify stack space local to their |
| 261 | /// invocation without having to report it through these interfaces. |
| 262 | enum FunctionModRefBehavior { |
| 263 | /// This function does not perform any non-local loads or stores to memory. |
| 264 | /// |
| 265 | /// This property corresponds to the GCC 'const' attribute. |
| 266 | /// This property corresponds to the LLVM IR 'readnone' attribute. |
| 267 | /// This property corresponds to the IntrNoMem LLVM intrinsic flag. |
| 268 | FMRB_DoesNotAccessMemory = |
| 269 | FMRL_Nowhere | static_cast<int>(ModRefInfo::NoModRef), |
| 270 | |
| 271 | /// The only memory references in this function (if it has any) are |
| 272 | /// non-volatile loads from objects pointed to by its pointer-typed |
| 273 | /// arguments, with arbitrary offsets. |
| 274 | /// |
| 275 | /// This property corresponds to the combination of the IntrReadMem |
| 276 | /// and IntrArgMemOnly LLVM intrinsic flags. |
| 277 | FMRB_OnlyReadsArgumentPointees = |
| 278 | FMRL_ArgumentPointees | static_cast<int>(ModRefInfo::Ref), |
| 279 | |
| 280 | /// The only memory references in this function (if it has any) are |
| 281 | /// non-volatile stores from objects pointed to by its pointer-typed |
| 282 | /// arguments, with arbitrary offsets. |
| 283 | /// |
| 284 | /// This property corresponds to the combination of the IntrWriteMem |
| 285 | /// and IntrArgMemOnly LLVM intrinsic flags. |
| 286 | FMRB_OnlyWritesArgumentPointees = |
| 287 | FMRL_ArgumentPointees | static_cast<int>(ModRefInfo::Mod), |
| 288 | |
| 289 | /// The only memory references in this function (if it has any) are |
| 290 | /// non-volatile loads and stores from objects pointed to by its |
| 291 | /// pointer-typed arguments, with arbitrary offsets. |
| 292 | /// |
| 293 | /// This property corresponds to the IntrArgMemOnly LLVM intrinsic flag. |
| 294 | FMRB_OnlyAccessesArgumentPointees = |
| 295 | FMRL_ArgumentPointees | static_cast<int>(ModRefInfo::ModRef), |
| 296 | |
| 297 | /// The only memory references in this function (if it has any) are |
| 298 | /// reads of memory that is otherwise inaccessible via LLVM IR. |
| 299 | /// |
| 300 | /// This property corresponds to the LLVM IR inaccessiblememonly attribute. |
| 301 | FMRB_OnlyReadsInaccessibleMem = |
| 302 | FMRL_InaccessibleMem | static_cast<int>(ModRefInfo::Ref), |
| 303 | |
| 304 | /// The only memory references in this function (if it has any) are |
| 305 | /// writes to memory that is otherwise inaccessible via LLVM IR. |
| 306 | /// |
| 307 | /// This property corresponds to the LLVM IR inaccessiblememonly attribute. |
| 308 | FMRB_OnlyWritesInaccessibleMem = |
| 309 | FMRL_InaccessibleMem | static_cast<int>(ModRefInfo::Mod), |
| 310 | |
| 311 | /// The only memory references in this function (if it has any) are |
| 312 | /// references of memory that is otherwise inaccessible via LLVM IR. |
| 313 | /// |
| 314 | /// This property corresponds to the LLVM IR inaccessiblememonly attribute. |
| 315 | FMRB_OnlyAccessesInaccessibleMem = |
| 316 | FMRL_InaccessibleMem | static_cast<int>(ModRefInfo::ModRef), |
| 317 | |
| 318 | /// The function may perform non-volatile loads from objects pointed |
| 319 | /// to by its pointer-typed arguments, with arbitrary offsets, and |
| 320 | /// it may also perform loads of memory that is otherwise |
| 321 | /// inaccessible via LLVM IR. |
| 322 | /// |
| 323 | /// This property corresponds to the LLVM IR |
| 324 | /// inaccessiblemem_or_argmemonly attribute. |
| 325 | FMRB_OnlyReadsInaccessibleOrArgMem = FMRL_InaccessibleMem | |
| 326 | FMRL_ArgumentPointees | |
| 327 | static_cast<int>(ModRefInfo::Ref), |
| 328 | |
| 329 | /// The function may perform non-volatile stores to objects pointed |
| 330 | /// to by its pointer-typed arguments, with arbitrary offsets, and |
| 331 | /// it may also perform stores of memory that is otherwise |
| 332 | /// inaccessible via LLVM IR. |
| 333 | /// |
| 334 | /// This property corresponds to the LLVM IR |
| 335 | /// inaccessiblemem_or_argmemonly attribute. |
| 336 | FMRB_OnlyWritesInaccessibleOrArgMem = FMRL_InaccessibleMem | |
| 337 | FMRL_ArgumentPointees | |
| 338 | static_cast<int>(ModRefInfo::Mod), |
| 339 | |
| 340 | /// The function may perform non-volatile loads and stores of objects |
| 341 | /// pointed to by its pointer-typed arguments, with arbitrary offsets, and |
| 342 | /// it may also perform loads and stores of memory that is otherwise |
| 343 | /// inaccessible via LLVM IR. |
| 344 | /// |
| 345 | /// This property corresponds to the LLVM IR |
| 346 | /// inaccessiblemem_or_argmemonly attribute. |
| 347 | FMRB_OnlyAccessesInaccessibleOrArgMem = FMRL_InaccessibleMem | |
| 348 | FMRL_ArgumentPointees | |
| 349 | static_cast<int>(ModRefInfo::ModRef), |
| 350 | |
| 351 | /// This function does not perform any non-local stores or volatile loads, |
| 352 | /// but may read from any memory location. |
| 353 | /// |
| 354 | /// This property corresponds to the GCC 'pure' attribute. |
| 355 | /// This property corresponds to the LLVM IR 'readonly' attribute. |
| 356 | /// This property corresponds to the IntrReadMem LLVM intrinsic flag. |
| 357 | FMRB_OnlyReadsMemory = FMRL_Anywhere | static_cast<int>(ModRefInfo::Ref), |
| 358 | |
| 359 | // This function does not read from memory anywhere, but may write to any |
| 360 | // memory location. |
| 361 | // |
| 362 | // This property corresponds to the LLVM IR 'writeonly' attribute. |
| 363 | // This property corresponds to the IntrWriteMem LLVM intrinsic flag. |
| 364 | FMRB_OnlyWritesMemory = FMRL_Anywhere | static_cast<int>(ModRefInfo::Mod), |
| 365 | |
| 366 | /// This indicates that the function could not be classified into one of the |
| 367 | /// behaviors above. |
| 368 | FMRB_UnknownModRefBehavior = |
| 369 | FMRL_Anywhere | static_cast<int>(ModRefInfo::ModRef) |
| 370 | }; |
| 371 | |
| 372 | // Wrapper method strips bits significant only in FunctionModRefBehavior, |
| 373 | // to obtain a valid ModRefInfo. The benefit of using the wrapper is that if |
| 374 | // ModRefInfo enum changes, the wrapper can be updated to & with the new enum |
| 375 | // entry with all bits set to 1. |
| 376 | LLVM_NODISCARD[[clang::warn_unused_result]] inline ModRefInfo |
| 377 | createModRefInfo(const FunctionModRefBehavior FMRB) { |
| 378 | return ModRefInfo(FMRB & static_cast<int>(ModRefInfo::ModRef)); |
| 379 | } |
| 380 | |
| 381 | /// Reduced version of MemoryLocation that only stores a pointer and size. |
| 382 | /// Used for caching AATags independent BasicAA results. |
| 383 | struct AACacheLoc { |
| 384 | const Value *Ptr; |
| 385 | LocationSize Size; |
| 386 | }; |
| 387 | |
| 388 | template <> struct DenseMapInfo<AACacheLoc> { |
| 389 | static inline AACacheLoc getEmptyKey() { |
| 390 | return {DenseMapInfo<const Value *>::getEmptyKey(), |
| 391 | DenseMapInfo<LocationSize>::getEmptyKey()}; |
| 392 | } |
| 393 | static inline AACacheLoc getTombstoneKey() { |
| 394 | return {DenseMapInfo<const Value *>::getTombstoneKey(), |
| 395 | DenseMapInfo<LocationSize>::getTombstoneKey()}; |
| 396 | } |
| 397 | static unsigned getHashValue(const AACacheLoc &Val) { |
| 398 | return DenseMapInfo<const Value *>::getHashValue(Val.Ptr) ^ |
| 399 | DenseMapInfo<LocationSize>::getHashValue(Val.Size); |
| 400 | } |
| 401 | static bool isEqual(const AACacheLoc &LHS, const AACacheLoc &RHS) { |
| 402 | return LHS.Ptr == RHS.Ptr && LHS.Size == RHS.Size; |
| 403 | } |
| 404 | }; |
| 405 | |
| 406 | /// This class stores info we want to provide to or retain within an alias |
| 407 | /// query. By default, the root query is stateless and starts with a freshly |
| 408 | /// constructed info object. Specific alias analyses can use this query info to |
| 409 | /// store per-query state that is important for recursive or nested queries to |
| 410 | /// avoid recomputing. To enable preserving this state across multiple queries |
| 411 | /// where safe (due to the IR not changing), use a `BatchAAResults` wrapper. |
| 412 | /// The information stored in an `AAQueryInfo` is currently limitted to the |
| 413 | /// caches used by BasicAA, but can further be extended to fit other AA needs. |
| 414 | class AAQueryInfo { |
| 415 | public: |
| 416 | using LocPair = std::pair<AACacheLoc, AACacheLoc>; |
| 417 | struct CacheEntry { |
| 418 | AliasResult Result; |
| 419 | /// Number of times a NoAlias assumption has been used. |
| 420 | /// 0 for assumptions that have not been used, -1 for definitive results. |
| 421 | int NumAssumptionUses; |
| 422 | /// Whether this is a definitive (non-assumption) result. |
| 423 | bool isDefinitive() const { return NumAssumptionUses < 0; } |
| 424 | }; |
| 425 | using AliasCacheT = SmallDenseMap<LocPair, CacheEntry, 8>; |
| 426 | AliasCacheT AliasCache; |
| 427 | |
| 428 | using IsCapturedCacheT = SmallDenseMap<const Value *, bool, 8>; |
| 429 | IsCapturedCacheT IsCapturedCache; |
| 430 | |
| 431 | /// Query depth used to distinguish recursive queries. |
| 432 | unsigned Depth = 0; |
| 433 | |
| 434 | /// How many active NoAlias assumption uses there are. |
| 435 | int NumAssumptionUses = 0; |
| 436 | |
| 437 | /// Location pairs for which an assumption based result is currently stored. |
| 438 | /// Used to remove all potentially incorrect results from the cache if an |
| 439 | /// assumption is disproven. |
| 440 | SmallVector<AAQueryInfo::LocPair, 4> AssumptionBasedResults; |
| 441 | |
| 442 | AAQueryInfo() : AliasCache(), IsCapturedCache() {} |
| 443 | |
| 444 | /// Create a new AAQueryInfo based on this one, but with the cache cleared. |
| 445 | /// This is used for recursive queries across phis, where cache results may |
| 446 | /// not be valid. |
| 447 | AAQueryInfo withEmptyCache() { |
| 448 | AAQueryInfo NewAAQI; |
| 449 | NewAAQI.Depth = Depth; |
| 450 | return NewAAQI; |
| 451 | } |
| 452 | }; |
| 453 | |
| 454 | class BatchAAResults; |
| 455 | |
| 456 | class AAResults { |
| 457 | public: |
| 458 | // Make these results default constructable and movable. We have to spell |
| 459 | // these out because MSVC won't synthesize them. |
| 460 | AAResults(const TargetLibraryInfo &TLI) : TLI(TLI) {} |
| 461 | AAResults(AAResults &&Arg); |
| 462 | ~AAResults(); |
| 463 | |
| 464 | /// Register a specific AA result. |
| 465 | template <typename AAResultT> void addAAResult(AAResultT &AAResult) { |
| 466 | // FIXME: We should use a much lighter weight system than the usual |
| 467 | // polymorphic pattern because we don't own AAResult. It should |
| 468 | // ideally involve two pointers and no separate allocation. |
| 469 | AAs.emplace_back(new Model<AAResultT>(AAResult, *this)); |
| 470 | } |
| 471 | |
| 472 | /// Register a function analysis ID that the results aggregation depends on. |
| 473 | /// |
| 474 | /// This is used in the new pass manager to implement the invalidation logic |
| 475 | /// where we must invalidate the results aggregation if any of our component |
| 476 | /// analyses become invalid. |
| 477 | void addAADependencyID(AnalysisKey *ID) { AADeps.push_back(ID); } |
| 478 | |
| 479 | /// Handle invalidation events in the new pass manager. |
| 480 | /// |
| 481 | /// The aggregation is invalidated if any of the underlying analyses is |
| 482 | /// invalidated. |
| 483 | bool invalidate(Function &F, const PreservedAnalyses &PA, |
| 484 | FunctionAnalysisManager::Invalidator &Inv); |
| 485 | |
| 486 | //===--------------------------------------------------------------------===// |
| 487 | /// \name Alias Queries |
| 488 | /// @{ |
| 489 | |
| 490 | /// The main low level interface to the alias analysis implementation. |
| 491 | /// Returns an AliasResult indicating whether the two pointers are aliased to |
| 492 | /// each other. This is the interface that must be implemented by specific |
| 493 | /// alias analysis implementations. |
| 494 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB); |
| 495 | |
| 496 | /// A convenience wrapper around the primary \c alias interface. |
| 497 | AliasResult alias(const Value *V1, LocationSize V1Size, const Value *V2, |
| 498 | LocationSize V2Size) { |
| 499 | return alias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size)); |
| 500 | } |
| 501 | |
| 502 | /// A convenience wrapper around the primary \c alias interface. |
| 503 | AliasResult alias(const Value *V1, const Value *V2) { |
| 504 | return alias(MemoryLocation::getBeforeOrAfter(V1), |
| 505 | MemoryLocation::getBeforeOrAfter(V2)); |
| 506 | } |
| 507 | |
| 508 | /// A trivial helper function to check to see if the specified pointers are |
| 509 | /// no-alias. |
| 510 | bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
| 511 | return alias(LocA, LocB) == AliasResult::NoAlias; |
| 512 | } |
| 513 | |
| 514 | /// A convenience wrapper around the \c isNoAlias helper interface. |
| 515 | bool isNoAlias(const Value *V1, LocationSize V1Size, const Value *V2, |
| 516 | LocationSize V2Size) { |
| 517 | return isNoAlias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size)); |
| 518 | } |
| 519 | |
| 520 | /// A convenience wrapper around the \c isNoAlias helper interface. |
| 521 | bool isNoAlias(const Value *V1, const Value *V2) { |
| 522 | return isNoAlias(MemoryLocation::getBeforeOrAfter(V1), |
| 523 | MemoryLocation::getBeforeOrAfter(V2)); |
| 524 | } |
| 525 | |
| 526 | /// A trivial helper function to check to see if the specified pointers are |
| 527 | /// must-alias. |
| 528 | bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
| 529 | return alias(LocA, LocB) == AliasResult::MustAlias; |
| 530 | } |
| 531 | |
| 532 | /// A convenience wrapper around the \c isMustAlias helper interface. |
| 533 | bool isMustAlias(const Value *V1, const Value *V2) { |
| 534 | return alias(V1, LocationSize::precise(1), V2, LocationSize::precise(1)) == |
| 535 | AliasResult::MustAlias; |
| 536 | } |
| 537 | |
| 538 | /// Checks whether the given location points to constant memory, or if |
| 539 | /// \p OrLocal is true whether it points to a local alloca. |
| 540 | bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal = false); |
| 541 | |
| 542 | /// A convenience wrapper around the primary \c pointsToConstantMemory |
| 543 | /// interface. |
| 544 | bool pointsToConstantMemory(const Value *P, bool OrLocal = false) { |
| 545 | return pointsToConstantMemory(MemoryLocation::getBeforeOrAfter(P), OrLocal); |
| 546 | } |
| 547 | |
| 548 | /// @} |
| 549 | //===--------------------------------------------------------------------===// |
| 550 | /// \name Simple mod/ref information |
| 551 | /// @{ |
| 552 | |
| 553 | /// Get the ModRef info associated with a pointer argument of a call. The |
| 554 | /// result's bits are set to indicate the allowed aliasing ModRef kinds. Note |
| 555 | /// that these bits do not necessarily account for the overall behavior of |
| 556 | /// the function, but rather only provide additional per-argument |
| 557 | /// information. This never sets ModRefInfo::Must. |
| 558 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx); |
| 559 | |
| 560 | /// Return the behavior of the given call site. |
| 561 | FunctionModRefBehavior getModRefBehavior(const CallBase *Call); |
| 562 | |
| 563 | /// Return the behavior when calling the given function. |
| 564 | FunctionModRefBehavior getModRefBehavior(const Function *F); |
| 565 | |
| 566 | /// Checks if the specified call is known to never read or write memory. |
| 567 | /// |
| 568 | /// Note that if the call only reads from known-constant memory, it is also |
| 569 | /// legal to return true. Also, calls that unwind the stack are legal for |
| 570 | /// this predicate. |
| 571 | /// |
| 572 | /// Many optimizations (such as CSE and LICM) can be performed on such calls |
| 573 | /// without worrying about aliasing properties, and many calls have this |
| 574 | /// property (e.g. calls to 'sin' and 'cos'). |
| 575 | /// |
| 576 | /// This property corresponds to the GCC 'const' attribute. |
| 577 | bool doesNotAccessMemory(const CallBase *Call) { |
| 578 | return getModRefBehavior(Call) == FMRB_DoesNotAccessMemory; |
| 579 | } |
| 580 | |
| 581 | /// Checks if the specified function is known to never read or write memory. |
| 582 | /// |
| 583 | /// Note that if the function only reads from known-constant memory, it is |
| 584 | /// also legal to return true. Also, function that unwind the stack are legal |
| 585 | /// for this predicate. |
| 586 | /// |
| 587 | /// Many optimizations (such as CSE and LICM) can be performed on such calls |
| 588 | /// to such functions without worrying about aliasing properties, and many |
| 589 | /// functions have this property (e.g. 'sin' and 'cos'). |
| 590 | /// |
| 591 | /// This property corresponds to the GCC 'const' attribute. |
| 592 | bool doesNotAccessMemory(const Function *F) { |
| 593 | return getModRefBehavior(F) == FMRB_DoesNotAccessMemory; |
| 594 | } |
| 595 | |
| 596 | /// Checks if the specified call is known to only read from non-volatile |
| 597 | /// memory (or not access memory at all). |
| 598 | /// |
| 599 | /// Calls that unwind the stack are legal for this predicate. |
| 600 | /// |
| 601 | /// This property allows many common optimizations to be performed in the |
| 602 | /// absence of interfering store instructions, such as CSE of strlen calls. |
| 603 | /// |
| 604 | /// This property corresponds to the GCC 'pure' attribute. |
| 605 | bool onlyReadsMemory(const CallBase *Call) { |
| 606 | return onlyReadsMemory(getModRefBehavior(Call)); |
| 607 | } |
| 608 | |
| 609 | /// Checks if the specified function is known to only read from non-volatile |
| 610 | /// memory (or not access memory at all). |
| 611 | /// |
| 612 | /// Functions that unwind the stack are legal for this predicate. |
| 613 | /// |
| 614 | /// This property allows many common optimizations to be performed in the |
| 615 | /// absence of interfering store instructions, such as CSE of strlen calls. |
| 616 | /// |
| 617 | /// This property corresponds to the GCC 'pure' attribute. |
| 618 | bool onlyReadsMemory(const Function *F) { |
| 619 | return onlyReadsMemory(getModRefBehavior(F)); |
| 620 | } |
| 621 | |
| 622 | /// Checks if functions with the specified behavior are known to only read |
| 623 | /// from non-volatile memory (or not access memory at all). |
| 624 | static bool onlyReadsMemory(FunctionModRefBehavior MRB) { |
| 625 | return !isModSet(createModRefInfo(MRB)); |
| 626 | } |
| 627 | |
| 628 | /// Checks if functions with the specified behavior are known to only write |
| 629 | /// memory (or not access memory at all). |
| 630 | static bool doesNotReadMemory(FunctionModRefBehavior MRB) { |
| 631 | return !isRefSet(createModRefInfo(MRB)); |
| 632 | } |
| 633 | |
| 634 | /// Checks if functions with the specified behavior are known to read and |
| 635 | /// write at most from objects pointed to by their pointer-typed arguments |
| 636 | /// (with arbitrary offsets). |
| 637 | static bool onlyAccessesArgPointees(FunctionModRefBehavior MRB) { |
| 638 | return !((unsigned)MRB & FMRL_Anywhere & ~FMRL_ArgumentPointees); |
| 639 | } |
| 640 | |
| 641 | /// Checks if functions with the specified behavior are known to potentially |
| 642 | /// read or write from objects pointed to be their pointer-typed arguments |
| 643 | /// (with arbitrary offsets). |
| 644 | static bool doesAccessArgPointees(FunctionModRefBehavior MRB) { |
| 645 | return isModOrRefSet(createModRefInfo(MRB)) && |
| 646 | ((unsigned)MRB & FMRL_ArgumentPointees); |
| 647 | } |
| 648 | |
| 649 | /// Checks if functions with the specified behavior are known to read and |
| 650 | /// write at most from memory that is inaccessible from LLVM IR. |
| 651 | static bool onlyAccessesInaccessibleMem(FunctionModRefBehavior MRB) { |
| 652 | return !((unsigned)MRB & FMRL_Anywhere & ~FMRL_InaccessibleMem); |
| 653 | } |
| 654 | |
| 655 | /// Checks if functions with the specified behavior are known to potentially |
| 656 | /// read or write from memory that is inaccessible from LLVM IR. |
| 657 | static bool doesAccessInaccessibleMem(FunctionModRefBehavior MRB) { |
| 658 | return isModOrRefSet(createModRefInfo(MRB)) && |
| 659 | ((unsigned)MRB & FMRL_InaccessibleMem); |
| 660 | } |
| 661 | |
| 662 | /// Checks if functions with the specified behavior are known to read and |
| 663 | /// write at most from memory that is inaccessible from LLVM IR or objects |
| 664 | /// pointed to by their pointer-typed arguments (with arbitrary offsets). |
| 665 | static bool onlyAccessesInaccessibleOrArgMem(FunctionModRefBehavior MRB) { |
| 666 | return !((unsigned)MRB & FMRL_Anywhere & |
| 667 | ~(FMRL_InaccessibleMem | FMRL_ArgumentPointees)); |
| 668 | } |
| 669 | |
| 670 | /// getModRefInfo (for call sites) - Return information about whether |
| 671 | /// a particular call site modifies or reads the specified memory location. |
| 672 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc); |
| 673 | |
| 674 | /// getModRefInfo (for call sites) - A convenience wrapper. |
| 675 | ModRefInfo getModRefInfo(const CallBase *Call, const Value *P, |
| 676 | LocationSize Size) { |
| 677 | return getModRefInfo(Call, MemoryLocation(P, Size)); |
| 678 | } |
| 679 | |
| 680 | /// getModRefInfo (for loads) - Return information about whether |
| 681 | /// a particular load modifies or reads the specified memory location. |
| 682 | ModRefInfo getModRefInfo(const LoadInst *L, const MemoryLocation &Loc); |
| 683 | |
| 684 | /// getModRefInfo (for loads) - A convenience wrapper. |
| 685 | ModRefInfo getModRefInfo(const LoadInst *L, const Value *P, |
| 686 | LocationSize Size) { |
| 687 | return getModRefInfo(L, MemoryLocation(P, Size)); |
| 688 | } |
| 689 | |
| 690 | /// getModRefInfo (for stores) - Return information about whether |
| 691 | /// a particular store modifies or reads the specified memory location. |
| 692 | ModRefInfo getModRefInfo(const StoreInst *S, const MemoryLocation &Loc); |
| 693 | |
| 694 | /// getModRefInfo (for stores) - A convenience wrapper. |
| 695 | ModRefInfo getModRefInfo(const StoreInst *S, const Value *P, |
| 696 | LocationSize Size) { |
| 697 | return getModRefInfo(S, MemoryLocation(P, Size)); |
| 698 | } |
| 699 | |
| 700 | /// getModRefInfo (for fences) - Return information about whether |
| 701 | /// a particular store modifies or reads the specified memory location. |
| 702 | ModRefInfo getModRefInfo(const FenceInst *S, const MemoryLocation &Loc); |
| 703 | |
| 704 | /// getModRefInfo (for fences) - A convenience wrapper. |
| 705 | ModRefInfo getModRefInfo(const FenceInst *S, const Value *P, |
| 706 | LocationSize Size) { |
| 707 | return getModRefInfo(S, MemoryLocation(P, Size)); |
| 708 | } |
| 709 | |
| 710 | /// getModRefInfo (for cmpxchges) - Return information about whether |
| 711 | /// a particular cmpxchg modifies or reads the specified memory location. |
| 712 | ModRefInfo getModRefInfo(const AtomicCmpXchgInst *CX, |
| 713 | const MemoryLocation &Loc); |
| 714 | |
| 715 | /// getModRefInfo (for cmpxchges) - A convenience wrapper. |
| 716 | ModRefInfo getModRefInfo(const AtomicCmpXchgInst *CX, const Value *P, |
| 717 | LocationSize Size) { |
| 718 | return getModRefInfo(CX, MemoryLocation(P, Size)); |
| 719 | } |
| 720 | |
| 721 | /// getModRefInfo (for atomicrmws) - Return information about whether |
| 722 | /// a particular atomicrmw modifies or reads the specified memory location. |
| 723 | ModRefInfo getModRefInfo(const AtomicRMWInst *RMW, const MemoryLocation &Loc); |
| 724 | |
| 725 | /// getModRefInfo (for atomicrmws) - A convenience wrapper. |
| 726 | ModRefInfo getModRefInfo(const AtomicRMWInst *RMW, const Value *P, |
| 727 | LocationSize Size) { |
| 728 | return getModRefInfo(RMW, MemoryLocation(P, Size)); |
| 729 | } |
| 730 | |
| 731 | /// getModRefInfo (for va_args) - Return information about whether |
| 732 | /// a particular va_arg modifies or reads the specified memory location. |
| 733 | ModRefInfo getModRefInfo(const VAArgInst *I, const MemoryLocation &Loc); |
| 734 | |
| 735 | /// getModRefInfo (for va_args) - A convenience wrapper. |
| 736 | ModRefInfo getModRefInfo(const VAArgInst *I, const Value *P, |
| 737 | LocationSize Size) { |
| 738 | return getModRefInfo(I, MemoryLocation(P, Size)); |
| 739 | } |
| 740 | |
| 741 | /// getModRefInfo (for catchpads) - Return information about whether |
| 742 | /// a particular catchpad modifies or reads the specified memory location. |
| 743 | ModRefInfo getModRefInfo(const CatchPadInst *I, const MemoryLocation &Loc); |
| 744 | |
| 745 | /// getModRefInfo (for catchpads) - A convenience wrapper. |
| 746 | ModRefInfo getModRefInfo(const CatchPadInst *I, const Value *P, |
| 747 | LocationSize Size) { |
| 748 | return getModRefInfo(I, MemoryLocation(P, Size)); |
| 749 | } |
| 750 | |
| 751 | /// getModRefInfo (for catchrets) - Return information about whether |
| 752 | /// a particular catchret modifies or reads the specified memory location. |
| 753 | ModRefInfo getModRefInfo(const CatchReturnInst *I, const MemoryLocation &Loc); |
| 754 | |
| 755 | /// getModRefInfo (for catchrets) - A convenience wrapper. |
| 756 | ModRefInfo getModRefInfo(const CatchReturnInst *I, const Value *P, |
| 757 | LocationSize Size) { |
| 758 | return getModRefInfo(I, MemoryLocation(P, Size)); |
| 759 | } |
| 760 | |
| 761 | /// Check whether or not an instruction may read or write the optionally |
| 762 | /// specified memory location. |
| 763 | /// |
| 764 | /// |
| 765 | /// An instruction that doesn't read or write memory may be trivially LICM'd |
| 766 | /// for example. |
| 767 | /// |
| 768 | /// For function calls, this delegates to the alias-analysis specific |
| 769 | /// call-site mod-ref behavior queries. Otherwise it delegates to the specific |
| 770 | /// helpers above. |
| 771 | ModRefInfo getModRefInfo(const Instruction *I, |
| 772 | const Optional<MemoryLocation> &OptLoc) { |
| 773 | AAQueryInfo AAQIP; |
| 774 | return getModRefInfo(I, OptLoc, AAQIP); |
| 775 | } |
| 776 | |
| 777 | /// A convenience wrapper for constructing the memory location. |
| 778 | ModRefInfo getModRefInfo(const Instruction *I, const Value *P, |
| 779 | LocationSize Size) { |
| 780 | return getModRefInfo(I, MemoryLocation(P, Size)); |
| 781 | } |
| 782 | |
| 783 | /// Return information about whether a call and an instruction may refer to |
| 784 | /// the same memory locations. |
| 785 | ModRefInfo getModRefInfo(Instruction *I, const CallBase *Call); |
| 786 | |
| 787 | /// Return information about whether two call sites may refer to the same set |
| 788 | /// of memory locations. See the AA documentation for details: |
| 789 | /// http://llvm.org/docs/AliasAnalysis.html#ModRefInfo |
| 790 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2); |
| 791 | |
| 792 | /// Return information about whether a particular call site modifies |
| 793 | /// or reads the specified memory location \p MemLoc before instruction \p I |
| 794 | /// in a BasicBlock. |
| 795 | /// Early exits in callCapturesBefore may lead to ModRefInfo::Must not being |
| 796 | /// set. |
| 797 | ModRefInfo callCapturesBefore(const Instruction *I, |
| 798 | const MemoryLocation &MemLoc, |
| 799 | DominatorTree *DT) { |
| 800 | AAQueryInfo AAQIP; |
| 801 | return callCapturesBefore(I, MemLoc, DT, AAQIP); |
| 802 | } |
| 803 | |
| 804 | /// A convenience wrapper to synthesize a memory location. |
| 805 | ModRefInfo callCapturesBefore(const Instruction *I, const Value *P, |
| 806 | LocationSize Size, DominatorTree *DT) { |
| 807 | return callCapturesBefore(I, MemoryLocation(P, Size), DT); |
| 808 | } |
| 809 | |
| 810 | /// @} |
| 811 | //===--------------------------------------------------------------------===// |
| 812 | /// \name Higher level methods for querying mod/ref information. |
| 813 | /// @{ |
| 814 | |
| 815 | /// Check if it is possible for execution of the specified basic block to |
| 816 | /// modify the location Loc. |
| 817 | bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc); |
| 818 | |
| 819 | /// A convenience wrapper synthesizing a memory location. |
| 820 | bool canBasicBlockModify(const BasicBlock &BB, const Value *P, |
| 821 | LocationSize Size) { |
| 822 | return canBasicBlockModify(BB, MemoryLocation(P, Size)); |
| 823 | } |
| 824 | |
| 825 | /// Check if it is possible for the execution of the specified instructions |
| 826 | /// to mod\ref (according to the mode) the location Loc. |
| 827 | /// |
| 828 | /// The instructions to consider are all of the instructions in the range of |
| 829 | /// [I1,I2] INCLUSIVE. I1 and I2 must be in the same basic block. |
| 830 | bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, |
| 831 | const MemoryLocation &Loc, |
| 832 | const ModRefInfo Mode); |
| 833 | |
| 834 | /// A convenience wrapper synthesizing a memory location. |
| 835 | bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, |
| 836 | const Value *Ptr, LocationSize Size, |
| 837 | const ModRefInfo Mode) { |
| 838 | return canInstructionRangeModRef(I1, I2, MemoryLocation(Ptr, Size), Mode); |
| 839 | } |
| 840 | |
| 841 | private: |
| 842 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
| 843 | AAQueryInfo &AAQI); |
| 844 | bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
| 845 | bool OrLocal = false); |
| 846 | ModRefInfo getModRefInfo(Instruction *I, const CallBase *Call2, |
| 847 | AAQueryInfo &AAQIP); |
| 848 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
| 849 | AAQueryInfo &AAQI); |
| 850 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
| 851 | AAQueryInfo &AAQI); |
| 852 | ModRefInfo getModRefInfo(const VAArgInst *V, const MemoryLocation &Loc, |
| 853 | AAQueryInfo &AAQI); |
| 854 | ModRefInfo getModRefInfo(const LoadInst *L, const MemoryLocation &Loc, |
| 855 | AAQueryInfo &AAQI); |
| 856 | ModRefInfo getModRefInfo(const StoreInst *S, const MemoryLocation &Loc, |
| 857 | AAQueryInfo &AAQI); |
| 858 | ModRefInfo getModRefInfo(const FenceInst *S, const MemoryLocation &Loc, |
| 859 | AAQueryInfo &AAQI); |
| 860 | ModRefInfo getModRefInfo(const AtomicCmpXchgInst *CX, |
| 861 | const MemoryLocation &Loc, AAQueryInfo &AAQI); |
| 862 | ModRefInfo getModRefInfo(const AtomicRMWInst *RMW, const MemoryLocation &Loc, |
| 863 | AAQueryInfo &AAQI); |
| 864 | ModRefInfo getModRefInfo(const CatchPadInst *I, const MemoryLocation &Loc, |
| 865 | AAQueryInfo &AAQI); |
| 866 | ModRefInfo getModRefInfo(const CatchReturnInst *I, const MemoryLocation &Loc, |
| 867 | AAQueryInfo &AAQI); |
| 868 | ModRefInfo getModRefInfo(const Instruction *I, |
| 869 | const Optional<MemoryLocation> &OptLoc, |
| 870 | AAQueryInfo &AAQIP); |
| 871 | ModRefInfo callCapturesBefore(const Instruction *I, |
| 872 | const MemoryLocation &MemLoc, DominatorTree *DT, |
| 873 | AAQueryInfo &AAQIP); |
| 874 | |
| 875 | class Concept; |
| 876 | |
| 877 | template <typename T> class Model; |
| 878 | |
| 879 | template <typename T> friend class AAResultBase; |
| 880 | |
| 881 | const TargetLibraryInfo &TLI; |
| 882 | |
| 883 | std::vector<std::unique_ptr<Concept>> AAs; |
| 884 | |
| 885 | std::vector<AnalysisKey *> AADeps; |
| 886 | |
| 887 | friend class BatchAAResults; |
| 888 | }; |
| 889 | |
| 890 | /// This class is a wrapper over an AAResults, and it is intended to be used |
| 891 | /// only when there are no IR changes inbetween queries. BatchAAResults is |
| 892 | /// reusing the same `AAQueryInfo` to preserve the state across queries, |
| 893 | /// esentially making AA work in "batch mode". The internal state cannot be |
| 894 | /// cleared, so to go "out-of-batch-mode", the user must either use AAResults, |
| 895 | /// or create a new BatchAAResults. |
| 896 | class BatchAAResults { |
| 897 | AAResults &AA; |
| 898 | AAQueryInfo AAQI; |
| 899 | |
| 900 | public: |
| 901 | BatchAAResults(AAResults &AAR) : AA(AAR), AAQI() {} |
| 902 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
| 903 | return AA.alias(LocA, LocB, AAQI); |
| 904 | } |
| 905 | bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal = false) { |
| 906 | return AA.pointsToConstantMemory(Loc, AAQI, OrLocal); |
| 907 | } |
| 908 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc) { |
| 909 | return AA.getModRefInfo(Call, Loc, AAQI); |
| 910 | } |
| 911 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2) { |
| 912 | return AA.getModRefInfo(Call1, Call2, AAQI); |
| 913 | } |
| 914 | ModRefInfo getModRefInfo(const Instruction *I, |
| 915 | const Optional<MemoryLocation> &OptLoc) { |
| 916 | return AA.getModRefInfo(I, OptLoc, AAQI); |
| 917 | } |
| 918 | ModRefInfo getModRefInfo(Instruction *I, const CallBase *Call2) { |
| 919 | return AA.getModRefInfo(I, Call2, AAQI); |
| 920 | } |
| 921 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) { |
| 922 | return AA.getArgModRefInfo(Call, ArgIdx); |
| 923 | } |
| 924 | FunctionModRefBehavior getModRefBehavior(const CallBase *Call) { |
| 925 | return AA.getModRefBehavior(Call); |
| 926 | } |
| 927 | bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
| 928 | return alias(LocA, LocB) == AliasResult::MustAlias; |
| 929 | } |
| 930 | bool isMustAlias(const Value *V1, const Value *V2) { |
| 931 | return alias(MemoryLocation(V1, LocationSize::precise(1)), |
| 932 | MemoryLocation(V2, LocationSize::precise(1))) == |
| 933 | AliasResult::MustAlias; |
| 934 | } |
| 935 | ModRefInfo callCapturesBefore(const Instruction *I, |
| 936 | const MemoryLocation &MemLoc, |
| 937 | DominatorTree *DT) { |
| 938 | return AA.callCapturesBefore(I, MemLoc, DT, AAQI); |
| 939 | } |
| 940 | }; |
| 941 | |
| 942 | /// Temporary typedef for legacy code that uses a generic \c AliasAnalysis |
| 943 | /// pointer or reference. |
| 944 | using AliasAnalysis = AAResults; |
| 945 | |
| 946 | /// A private abstract base class describing the concept of an individual alias |
| 947 | /// analysis implementation. |
| 948 | /// |
| 949 | /// This interface is implemented by any \c Model instantiation. It is also the |
| 950 | /// interface which a type used to instantiate the model must provide. |
| 951 | /// |
| 952 | /// All of these methods model methods by the same name in the \c |
| 953 | /// AAResults class. Only differences and specifics to how the |
| 954 | /// implementations are called are documented here. |
| 955 | class AAResults::Concept { |
| 956 | public: |
| 957 | virtual ~Concept() = 0; |
| 958 | |
| 959 | /// An update API used internally by the AAResults to provide |
| 960 | /// a handle back to the top level aggregation. |
| 961 | virtual void setAAResults(AAResults *NewAAR) = 0; |
| 962 | |
| 963 | //===--------------------------------------------------------------------===// |
| 964 | /// \name Alias Queries |
| 965 | /// @{ |
| 966 | |
| 967 | /// The main low level interface to the alias analysis implementation. |
| 968 | /// Returns an AliasResult indicating whether the two pointers are aliased to |
| 969 | /// each other. This is the interface that must be implemented by specific |
| 970 | /// alias analysis implementations. |
| 971 | virtual AliasResult alias(const MemoryLocation &LocA, |
| 972 | const MemoryLocation &LocB, AAQueryInfo &AAQI) = 0; |
| 973 | |
| 974 | /// Checks whether the given location points to constant memory, or if |
| 975 | /// \p OrLocal is true whether it points to a local alloca. |
| 976 | virtual bool pointsToConstantMemory(const MemoryLocation &Loc, |
| 977 | AAQueryInfo &AAQI, bool OrLocal) = 0; |
| 978 | |
| 979 | /// @} |
| 980 | //===--------------------------------------------------------------------===// |
| 981 | /// \name Simple mod/ref information |
| 982 | /// @{ |
| 983 | |
| 984 | /// Get the ModRef info associated with a pointer argument of a callsite. The |
| 985 | /// result's bits are set to indicate the allowed aliasing ModRef kinds. Note |
| 986 | /// that these bits do not necessarily account for the overall behavior of |
| 987 | /// the function, but rather only provide additional per-argument |
| 988 | /// information. |
| 989 | virtual ModRefInfo getArgModRefInfo(const CallBase *Call, |
| 990 | unsigned ArgIdx) = 0; |
| 991 | |
| 992 | /// Return the behavior of the given call site. |
| 993 | virtual FunctionModRefBehavior getModRefBehavior(const CallBase *Call) = 0; |
| 994 | |
| 995 | /// Return the behavior when calling the given function. |
| 996 | virtual FunctionModRefBehavior getModRefBehavior(const Function *F) = 0; |
| 997 | |
| 998 | /// getModRefInfo (for call sites) - Return information about whether |
| 999 | /// a particular call site modifies or reads the specified memory location. |
| 1000 | virtual ModRefInfo getModRefInfo(const CallBase *Call, |
| 1001 | const MemoryLocation &Loc, |
| 1002 | AAQueryInfo &AAQI) = 0; |
| 1003 | |
| 1004 | /// Return information about whether two call sites may refer to the same set |
| 1005 | /// of memory locations. See the AA documentation for details: |
| 1006 | /// http://llvm.org/docs/AliasAnalysis.html#ModRefInfo |
| 1007 | virtual ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
| 1008 | AAQueryInfo &AAQI) = 0; |
| 1009 | |
| 1010 | /// @} |
| 1011 | }; |
| 1012 | |
| 1013 | /// A private class template which derives from \c Concept and wraps some other |
| 1014 | /// type. |
| 1015 | /// |
| 1016 | /// This models the concept by directly forwarding each interface point to the |
| 1017 | /// wrapped type which must implement a compatible interface. This provides |
| 1018 | /// a type erased binding. |
| 1019 | template <typename AAResultT> class AAResults::Model final : public Concept { |
| 1020 | AAResultT &Result; |
| 1021 | |
| 1022 | public: |
| 1023 | explicit Model(AAResultT &Result, AAResults &AAR) : Result(Result) { |
| 1024 | Result.setAAResults(&AAR); |
| 1025 | } |
| 1026 | ~Model() override = default; |
| 1027 | |
| 1028 | void setAAResults(AAResults *NewAAR) override { Result.setAAResults(NewAAR); } |
| 1029 | |
| 1030 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
| 1031 | AAQueryInfo &AAQI) override { |
| 1032 | return Result.alias(LocA, LocB, AAQI); |
| 1033 | } |
| 1034 | |
| 1035 | bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
| 1036 | bool OrLocal) override { |
| 1037 | return Result.pointsToConstantMemory(Loc, AAQI, OrLocal); |
| 1038 | } |
| 1039 | |
| 1040 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) override { |
| 1041 | return Result.getArgModRefInfo(Call, ArgIdx); |
| 1042 | } |
| 1043 | |
| 1044 | FunctionModRefBehavior getModRefBehavior(const CallBase *Call) override { |
| 1045 | return Result.getModRefBehavior(Call); |
| 1046 | } |
| 1047 | |
| 1048 | FunctionModRefBehavior getModRefBehavior(const Function *F) override { |
| 1049 | return Result.getModRefBehavior(F); |
| 1050 | } |
| 1051 | |
| 1052 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
| 1053 | AAQueryInfo &AAQI) override { |
| 1054 | return Result.getModRefInfo(Call, Loc, AAQI); |
| 1055 | } |
| 1056 | |
| 1057 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
| 1058 | AAQueryInfo &AAQI) override { |
| 1059 | return Result.getModRefInfo(Call1, Call2, AAQI); |
| 1060 | } |
| 1061 | }; |
| 1062 | |
| 1063 | /// A CRTP-driven "mixin" base class to help implement the function alias |
| 1064 | /// analysis results concept. |
| 1065 | /// |
| 1066 | /// Because of the nature of many alias analysis implementations, they often |
| 1067 | /// only implement a subset of the interface. This base class will attempt to |
| 1068 | /// implement the remaining portions of the interface in terms of simpler forms |
| 1069 | /// of the interface where possible, and otherwise provide conservatively |
| 1070 | /// correct fallback implementations. |
| 1071 | /// |
| 1072 | /// Implementors of an alias analysis should derive from this CRTP, and then |
| 1073 | /// override specific methods that they wish to customize. There is no need to |
| 1074 | /// use virtual anywhere, the CRTP base class does static dispatch to the |
| 1075 | /// derived type passed into it. |
| 1076 | template <typename DerivedT> class AAResultBase { |
| 1077 | // Expose some parts of the interface only to the AAResults::Model |
| 1078 | // for wrapping. Specifically, this allows the model to call our |
| 1079 | // setAAResults method without exposing it as a fully public API. |
| 1080 | friend class AAResults::Model<DerivedT>; |
| 1081 | |
| 1082 | /// A pointer to the AAResults object that this AAResult is |
| 1083 | /// aggregated within. May be null if not aggregated. |
| 1084 | AAResults *AAR = nullptr; |
| 1085 | |
| 1086 | /// Helper to dispatch calls back through the derived type. |
| 1087 | DerivedT &derived() { return static_cast<DerivedT &>(*this); } |
| 1088 | |
| 1089 | /// A setter for the AAResults pointer, which is used to satisfy the |
| 1090 | /// AAResults::Model contract. |
| 1091 | void setAAResults(AAResults *NewAAR) { AAR = NewAAR; } |
| 1092 | |
| 1093 | protected: |
| 1094 | /// This proxy class models a common pattern where we delegate to either the |
| 1095 | /// top-level \c AAResults aggregation if one is registered, or to the |
| 1096 | /// current result if none are registered. |
| 1097 | class AAResultsProxy { |
| 1098 | AAResults *AAR; |
| 1099 | DerivedT &CurrentResult; |
| 1100 | |
| 1101 | public: |
| 1102 | AAResultsProxy(AAResults *AAR, DerivedT &CurrentResult) |
| 1103 | : AAR(AAR), CurrentResult(CurrentResult) {} |
| 1104 | |
| 1105 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
| 1106 | AAQueryInfo &AAQI) { |
| 1107 | return AAR ? AAR->alias(LocA, LocB, AAQI) |
| 1108 | : CurrentResult.alias(LocA, LocB, AAQI); |
| 1109 | } |
| 1110 | |
| 1111 | bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
| 1112 | bool OrLocal) { |
| 1113 | return AAR ? AAR->pointsToConstantMemory(Loc, AAQI, OrLocal) |
| 1114 | : CurrentResult.pointsToConstantMemory(Loc, AAQI, OrLocal); |
| 1115 | } |
| 1116 | |
| 1117 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) { |
| 1118 | return AAR ? AAR->getArgModRefInfo(Call, ArgIdx) |
| 1119 | : CurrentResult.getArgModRefInfo(Call, ArgIdx); |
| 1120 | } |
| 1121 | |
| 1122 | FunctionModRefBehavior getModRefBehavior(const CallBase *Call) { |
| 1123 | return AAR ? AAR->getModRefBehavior(Call) |
| 1124 | : CurrentResult.getModRefBehavior(Call); |
| 1125 | } |
| 1126 | |
| 1127 | FunctionModRefBehavior getModRefBehavior(const Function *F) { |
| 1128 | return AAR ? AAR->getModRefBehavior(F) : CurrentResult.getModRefBehavior(F); |
| 1129 | } |
| 1130 | |
| 1131 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
| 1132 | AAQueryInfo &AAQI) { |
| 1133 | return AAR ? AAR->getModRefInfo(Call, Loc, AAQI) |
| 1134 | : CurrentResult.getModRefInfo(Call, Loc, AAQI); |
| 1135 | } |
| 1136 | |
| 1137 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
| 1138 | AAQueryInfo &AAQI) { |
| 1139 | return AAR ? AAR->getModRefInfo(Call1, Call2, AAQI) |
| 1140 | : CurrentResult.getModRefInfo(Call1, Call2, AAQI); |
| 1141 | } |
| 1142 | }; |
| 1143 | |
| 1144 | explicit AAResultBase() = default; |
| 1145 | |
| 1146 | // Provide all the copy and move constructors so that derived types aren't |
| 1147 | // constrained. |
| 1148 | AAResultBase(const AAResultBase &Arg) {} |
| 1149 | AAResultBase(AAResultBase &&Arg) {} |
| 1150 | |
| 1151 | /// Get a proxy for the best AA result set to query at this time. |
| 1152 | /// |
| 1153 | /// When this result is part of a larger aggregation, this will proxy to that |
| 1154 | /// aggregation. When this result is used in isolation, it will just delegate |
| 1155 | /// back to the derived class's implementation. |
| 1156 | /// |
| 1157 | /// Note that callers of this need to take considerable care to not cause |
| 1158 | /// performance problems when they use this routine, in the case of a large |
| 1159 | /// number of alias analyses being aggregated, it can be expensive to walk |
| 1160 | /// back across the chain. |
| 1161 | AAResultsProxy getBestAAResults() { return AAResultsProxy(AAR, derived()); } |
| 1162 | |
| 1163 | public: |
| 1164 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
| 1165 | AAQueryInfo &AAQI) { |
| 1166 | return AliasResult::MayAlias; |
| 1167 | } |
| 1168 | |
| 1169 | bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
| 1170 | bool OrLocal) { |
| 1171 | return false; |
| 1172 | } |
| 1173 | |
| 1174 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) { |
| 1175 | return ModRefInfo::ModRef; |
| 1176 | } |
| 1177 | |
| 1178 | FunctionModRefBehavior getModRefBehavior(const CallBase *Call) { |
| 1179 | return FMRB_UnknownModRefBehavior; |
| 1180 | } |
| 1181 | |
| 1182 | FunctionModRefBehavior getModRefBehavior(const Function *F) { |
| 1183 | return FMRB_UnknownModRefBehavior; |
| 1184 | } |
| 1185 | |
| 1186 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
| 1187 | AAQueryInfo &AAQI) { |
| 1188 | return ModRefInfo::ModRef; |
| 1189 | } |
| 1190 | |
| 1191 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
| 1192 | AAQueryInfo &AAQI) { |
| 1193 | return ModRefInfo::ModRef; |
| 1194 | } |
| 1195 | }; |
| 1196 | |
| 1197 | /// Return true if this pointer is returned by a noalias function. |
| 1198 | bool isNoAliasCall(const Value *V); |
| 1199 | |
| 1200 | /// Return true if this pointer refers to a distinct and identifiable object. |
| 1201 | /// This returns true for: |
| 1202 | /// Global Variables and Functions (but not Global Aliases) |
| 1203 | /// Allocas |
| 1204 | /// ByVal and NoAlias Arguments |
| 1205 | /// NoAlias returns (e.g. calls to malloc) |
| 1206 | /// |
| 1207 | bool isIdentifiedObject(const Value *V); |
| 1208 | |
| 1209 | /// Return true if V is umabigously identified at the function-level. |
| 1210 | /// Different IdentifiedFunctionLocals can't alias. |
| 1211 | /// Further, an IdentifiedFunctionLocal can not alias with any function |
| 1212 | /// arguments other than itself, which is not necessarily true for |
| 1213 | /// IdentifiedObjects. |
| 1214 | bool isIdentifiedFunctionLocal(const Value *V); |
| 1215 | |
| 1216 | /// A manager for alias analyses. |
| 1217 | /// |
| 1218 | /// This class can have analyses registered with it and when run, it will run |
| 1219 | /// all of them and aggregate their results into single AA results interface |
| 1220 | /// that dispatches across all of the alias analysis results available. |
| 1221 | /// |
| 1222 | /// Note that the order in which analyses are registered is very significant. |
| 1223 | /// That is the order in which the results will be aggregated and queried. |
| 1224 | /// |
| 1225 | /// This manager effectively wraps the AnalysisManager for registering alias |
| 1226 | /// analyses. When you register your alias analysis with this manager, it will |
| 1227 | /// ensure the analysis itself is registered with its AnalysisManager. |
| 1228 | /// |
| 1229 | /// The result of this analysis is only invalidated if one of the particular |
| 1230 | /// aggregated AA results end up being invalidated. This removes the need to |
| 1231 | /// explicitly preserve the results of `AAManager`. Note that analyses should no |
| 1232 | /// longer be registered once the `AAManager` is run. |
| 1233 | class AAManager : public AnalysisInfoMixin<AAManager> { |
| 1234 | public: |
| 1235 | using Result = AAResults; |
| 1236 | |
| 1237 | /// Register a specific AA result. |
| 1238 | template <typename AnalysisT> void registerFunctionAnalysis() { |
| 1239 | ResultGetters.push_back(&getFunctionAAResultImpl<AnalysisT>); |
| 1240 | } |
| 1241 | |
| 1242 | /// Register a specific AA result. |
| 1243 | template <typename AnalysisT> void registerModuleAnalysis() { |
| 1244 | ResultGetters.push_back(&getModuleAAResultImpl<AnalysisT>); |
| 1245 | } |
| 1246 | |
| 1247 | Result run(Function &F, FunctionAnalysisManager &AM); |
| 1248 | |
| 1249 | private: |
| 1250 | friend AnalysisInfoMixin<AAManager>; |
| 1251 | |
| 1252 | static AnalysisKey Key; |
| 1253 | |
| 1254 | SmallVector<void (*)(Function &F, FunctionAnalysisManager &AM, |
| 1255 | AAResults &AAResults), |
| 1256 | 4> ResultGetters; |
| 1257 | |
| 1258 | template <typename AnalysisT> |
| 1259 | static void getFunctionAAResultImpl(Function &F, |
| 1260 | FunctionAnalysisManager &AM, |
| 1261 | AAResults &AAResults) { |
| 1262 | AAResults.addAAResult(AM.template getResult<AnalysisT>(F)); |
| 1263 | AAResults.addAADependencyID(AnalysisT::ID()); |
| 1264 | } |
| 1265 | |
| 1266 | template <typename AnalysisT> |
| 1267 | static void getModuleAAResultImpl(Function &F, FunctionAnalysisManager &AM, |
| 1268 | AAResults &AAResults) { |
| 1269 | auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F); |
| 1270 | if (auto *R = |
| 1271 | MAMProxy.template getCachedResult<AnalysisT>(*F.getParent())) { |
| 1272 | AAResults.addAAResult(*R); |
| 1273 | MAMProxy |
| 1274 | .template registerOuterAnalysisInvalidation<AnalysisT, AAManager>(); |
| 1275 | } |
| 1276 | } |
| 1277 | }; |
| 1278 | |
| 1279 | /// A wrapper pass to provide the legacy pass manager access to a suitably |
| 1280 | /// prepared AAResults object. |
| 1281 | class AAResultsWrapperPass : public FunctionPass { |
| 1282 | std::unique_ptr<AAResults> AAR; |
| 1283 | |
| 1284 | public: |
| 1285 | static char ID; |
| 1286 | |
| 1287 | AAResultsWrapperPass(); |
| 1288 | |
| 1289 | AAResults &getAAResults() { return *AAR; } |
| 1290 | const AAResults &getAAResults() const { return *AAR; } |
| 1291 | |
| 1292 | bool runOnFunction(Function &F) override; |
| 1293 | |
| 1294 | void getAnalysisUsage(AnalysisUsage &AU) const override; |
| 1295 | }; |
| 1296 | |
| 1297 | /// A wrapper pass for external alias analyses. This just squirrels away the |
| 1298 | /// callback used to run any analyses and register their results. |
| 1299 | struct ExternalAAWrapperPass : ImmutablePass { |
| 1300 | using CallbackT = std::function<void(Pass &, Function &, AAResults &)>; |
| 1301 | |
| 1302 | CallbackT CB; |
| 1303 | |
| 1304 | static char ID; |
| 1305 | |
| 1306 | ExternalAAWrapperPass(); |
| 1307 | |
| 1308 | explicit ExternalAAWrapperPass(CallbackT CB); |
| 1309 | |
| 1310 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
| 1311 | AU.setPreservesAll(); |
| 1312 | } |
| 1313 | }; |
| 1314 | |
| 1315 | FunctionPass *createAAResultsWrapperPass(); |
| 1316 | |
| 1317 | /// A wrapper pass around a callback which can be used to populate the |
| 1318 | /// AAResults in the AAResultsWrapperPass from an external AA. |
| 1319 | /// |
| 1320 | /// The callback provided here will be used each time we prepare an AAResults |
| 1321 | /// object, and will receive a reference to the function wrapper pass, the |
| 1322 | /// function, and the AAResults object to populate. This should be used when |
| 1323 | /// setting up a custom pass pipeline to inject a hook into the AA results. |
| 1324 | ImmutablePass *createExternalAAWrapperPass( |
| 1325 | std::function<void(Pass &, Function &, AAResults &)> Callback); |
| 1326 | |
| 1327 | /// A helper for the legacy pass manager to create a \c AAResults |
| 1328 | /// object populated to the best of our ability for a particular function when |
| 1329 | /// inside of a \c ModulePass or a \c CallGraphSCCPass. |
| 1330 | /// |
| 1331 | /// If a \c ModulePass or a \c CallGraphSCCPass calls \p |
| 1332 | /// createLegacyPMAAResults, it also needs to call \p addUsedAAAnalyses in \p |
| 1333 | /// getAnalysisUsage. |
| 1334 | AAResults createLegacyPMAAResults(Pass &P, Function &F, BasicAAResult &BAR); |
| 1335 | |
| 1336 | /// A helper for the legacy pass manager to populate \p AU to add uses to make |
| 1337 | /// sure the analyses required by \p createLegacyPMAAResults are available. |
| 1338 | void getAAResultsAnalysisUsage(AnalysisUsage &AU); |
| 1339 | |
| 1340 | } // end namespace llvm |
| 1341 | |
| 1342 | #endif // LLVM_ANALYSIS_ALIASANALYSIS_H |
| 1 | //===- llvm/ADT/SmallBitVector.h - 'Normally small' bit vectors -*- C++ -*-===// | |||
| 2 | // | |||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | |||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |||
| 6 | // | |||
| 7 | //===----------------------------------------------------------------------===// | |||
| 8 | // | |||
| 9 | // This file implements the SmallBitVector class. | |||
| 10 | // | |||
| 11 | //===----------------------------------------------------------------------===// | |||
| 12 | ||||
| 13 | #ifndef LLVM_ADT_SMALLBITVECTOR_H | |||
| 14 | #define LLVM_ADT_SMALLBITVECTOR_H | |||
| 15 | ||||
| 16 | #include "llvm/ADT/BitVector.h" | |||
| 17 | #include "llvm/ADT/iterator_range.h" | |||
| 18 | #include "llvm/Support/MathExtras.h" | |||
| 19 | #include <algorithm> | |||
| 20 | #include <cassert> | |||
| 21 | #include <climits> | |||
| 22 | #include <cstddef> | |||
| 23 | #include <cstdint> | |||
| 24 | #include <limits> | |||
| 25 | #include <utility> | |||
| 26 | ||||
| 27 | namespace llvm { | |||
| 28 | ||||
| 29 | /// This is a 'bitvector' (really, a variable-sized bit array), optimized for | |||
| 30 | /// the case when the array is small. It contains one pointer-sized field, which | |||
| 31 | /// is directly used as a plain collection of bits when possible, or as a | |||
| 32 | /// pointer to a larger heap-allocated array when necessary. This allows normal | |||
| 33 | /// "small" cases to be fast without losing generality for large inputs. | |||
| 34 | class SmallBitVector { | |||
| 35 | // TODO: In "large" mode, a pointer to a BitVector is used, leading to an | |||
| 36 | // unnecessary level of indirection. It would be more efficient to use a | |||
| 37 | // pointer to memory containing size, allocation size, and the array of bits. | |||
| 38 | uintptr_t X = 1; | |||
| 39 | ||||
| 40 | enum { | |||
| 41 | // The number of bits in this class. | |||
| 42 | NumBaseBits = sizeof(uintptr_t) * CHAR_BIT8, | |||
| 43 | ||||
| 44 | // One bit is used to discriminate between small and large mode. The | |||
| 45 | // remaining bits are used for the small-mode representation. | |||
| 46 | SmallNumRawBits = NumBaseBits - 1, | |||
| 47 | ||||
| 48 | // A few more bits are used to store the size of the bit set in small mode. | |||
| 49 | // Theoretically this is a ceil-log2. These bits are encoded in the most | |||
| 50 | // significant bits of the raw bits. | |||
| 51 | SmallNumSizeBits = (NumBaseBits == 32 ? 5 : | |||
| 52 | NumBaseBits == 64 ? 6 : | |||
| 53 | SmallNumRawBits), | |||
| 54 | ||||
| 55 | // The remaining bits are used to store the actual set in small mode. | |||
| 56 | SmallNumDataBits = SmallNumRawBits - SmallNumSizeBits | |||
| 57 | }; | |||
| 58 | ||||
| 59 | static_assert(NumBaseBits == 64 || NumBaseBits == 32, | |||
| 60 | "Unsupported word size"); | |||
| 61 | ||||
| 62 | public: | |||
| 63 | using size_type = unsigned; | |||
| 64 | ||||
| 65 | // Encapsulation of a single bit. | |||
| 66 | class reference { | |||
| 67 | SmallBitVector &TheVector; | |||
| 68 | unsigned BitPos; | |||
| 69 | ||||
| 70 | public: | |||
| 71 | reference(SmallBitVector &b, unsigned Idx) : TheVector(b), BitPos(Idx) {} | |||
| 72 | ||||
| 73 | reference(const reference&) = default; | |||
| 74 | ||||
| 75 | reference& operator=(reference t) { | |||
| 76 | *this = bool(t); | |||
| 77 | return *this; | |||
| 78 | } | |||
| 79 | ||||
| 80 | reference& operator=(bool t) { | |||
| 81 | if (t) | |||
| 82 | TheVector.set(BitPos); | |||
| 83 | else | |||
| 84 | TheVector.reset(BitPos); | |||
| 85 | return *this; | |||
| 86 | } | |||
| 87 | ||||
| 88 | operator bool() const { | |||
| 89 | return const_cast<const SmallBitVector &>(TheVector).operator[](BitPos); | |||
| 90 | } | |||
| 91 | }; | |||
| 92 | ||||
| 93 | private: | |||
| 94 | BitVector *getPointer() const { | |||
| 95 | assert(!isSmall())((void)0); | |||
| 96 | return reinterpret_cast<BitVector *>(X); | |||
| 97 | } | |||
| 98 | ||||
| 99 | void switchToSmall(uintptr_t NewSmallBits, size_t NewSize) { | |||
| 100 | X = 1; | |||
| 101 | setSmallSize(NewSize); | |||
| 102 | setSmallBits(NewSmallBits); | |||
| 103 | } | |||
| 104 | ||||
| 105 | void switchToLarge(BitVector *BV) { | |||
| 106 | X = reinterpret_cast<uintptr_t>(BV); | |||
| 107 | assert(!isSmall() && "Tried to use an unaligned pointer")((void)0); | |||
| 108 | } | |||
| 109 | ||||
| 110 | // Return all the bits used for the "small" representation; this includes | |||
| 111 | // bits for the size as well as the element bits. | |||
| 112 | uintptr_t getSmallRawBits() const { | |||
| 113 | assert(isSmall())((void)0); | |||
| 114 | return X >> 1; | |||
| 115 | } | |||
| 116 | ||||
| 117 | void setSmallRawBits(uintptr_t NewRawBits) { | |||
| 118 | assert(isSmall())((void)0); | |||
| 119 | X = (NewRawBits << 1) | uintptr_t(1); | |||
| 120 | } | |||
| 121 | ||||
| 122 | // Return the size. | |||
| 123 | size_t getSmallSize() const { return getSmallRawBits() >> SmallNumDataBits; } | |||
| 124 | ||||
| 125 | void setSmallSize(size_t Size) { | |||
| 126 | setSmallRawBits(getSmallBits() | (Size << SmallNumDataBits)); | |||
| 127 | } | |||
| 128 | ||||
| 129 | // Return the element bits. | |||
| 130 | uintptr_t getSmallBits() const { | |||
| 131 | return getSmallRawBits() & ~(~uintptr_t(0) << getSmallSize()); | |||
| 132 | } | |||
| 133 | ||||
| 134 | void setSmallBits(uintptr_t NewBits) { | |||
| 135 | setSmallRawBits((NewBits & ~(~uintptr_t(0) << getSmallSize())) | | |||
| 136 | (getSmallSize() << SmallNumDataBits)); | |||
| 137 | } | |||
| 138 | ||||
| 139 | public: | |||
| 140 | /// Creates an empty bitvector. | |||
| 141 | SmallBitVector() = default; | |||
| 142 | ||||
| 143 | /// Creates a bitvector of specified number of bits. All bits are initialized | |||
| 144 | /// to the specified value. | |||
| 145 | explicit SmallBitVector(unsigned s, bool t = false) { | |||
| 146 | if (s <= SmallNumDataBits) | |||
| 147 | switchToSmall(t ? ~uintptr_t(0) : 0, s); | |||
| 148 | else | |||
| 149 | switchToLarge(new BitVector(s, t)); | |||
| 150 | } | |||
| 151 | ||||
| 152 | /// SmallBitVector copy ctor. | |||
| 153 | SmallBitVector(const SmallBitVector &RHS) { | |||
| 154 | if (RHS.isSmall()) | |||
| 155 | X = RHS.X; | |||
| 156 | else | |||
| 157 | switchToLarge(new BitVector(*RHS.getPointer())); | |||
| 158 | } | |||
| 159 | ||||
| 160 | SmallBitVector(SmallBitVector &&RHS) : X(RHS.X) { | |||
| 161 | RHS.X = 1; | |||
| 162 | } | |||
| 163 | ||||
| 164 | ~SmallBitVector() { | |||
| 165 | if (!isSmall()) | |||
| 166 | delete getPointer(); | |||
| 167 | } | |||
| 168 | ||||
| 169 | using const_set_bits_iterator = const_set_bits_iterator_impl<SmallBitVector>; | |||
| 170 | using set_iterator = const_set_bits_iterator; | |||
| 171 | ||||
| 172 | const_set_bits_iterator set_bits_begin() const { | |||
| 173 | return const_set_bits_iterator(*this); | |||
| 174 | } | |||
| 175 | ||||
| 176 | const_set_bits_iterator set_bits_end() const { | |||
| 177 | return const_set_bits_iterator(*this, -1); | |||
| 178 | } | |||
| 179 | ||||
| 180 | iterator_range<const_set_bits_iterator> set_bits() const { | |||
| 181 | return make_range(set_bits_begin(), set_bits_end()); | |||
| 182 | } | |||
| 183 | ||||
| 184 | bool isSmall() const { return X & uintptr_t(1); } | |||
| 185 | ||||
| 186 | /// Tests whether there are no bits in this bitvector. | |||
| 187 | bool empty() const { | |||
| 188 | return isSmall() ? getSmallSize() == 0 : getPointer()->empty(); | |||
| 189 | } | |||
| 190 | ||||
| 191 | /// Returns the number of bits in this bitvector. | |||
| 192 | size_t size() const { | |||
| 193 | return isSmall() ? getSmallSize() : getPointer()->size(); | |||
| 194 | } | |||
| 195 | ||||
| 196 | /// Returns the number of bits which are set. | |||
| 197 | size_type count() const { | |||
| 198 | if (isSmall()) { | |||
| 199 | uintptr_t Bits = getSmallBits(); | |||
| 200 | return countPopulation(Bits); | |||
| 201 | } | |||
| 202 | return getPointer()->count(); | |||
| 203 | } | |||
| 204 | ||||
| 205 | /// Returns true if any bit is set. | |||
| 206 | bool any() const { | |||
| 207 | if (isSmall()) | |||
| 208 | return getSmallBits() != 0; | |||
| 209 | return getPointer()->any(); | |||
| 210 | } | |||
| 211 | ||||
| 212 | /// Returns true if all bits are set. | |||
| 213 | bool all() const { | |||
| 214 | if (isSmall()) | |||
| 215 | return getSmallBits() == (uintptr_t(1) << getSmallSize()) - 1; | |||
| 216 | return getPointer()->all(); | |||
| 217 | } | |||
| 218 | ||||
| 219 | /// Returns true if none of the bits are set. | |||
| 220 | bool none() const { | |||
| 221 | if (isSmall()) | |||
| 222 | return getSmallBits() == 0; | |||
| 223 | return getPointer()->none(); | |||
| 224 | } | |||
| 225 | ||||
| 226 | /// Returns the index of the first set bit, -1 if none of the bits are set. | |||
| 227 | int find_first() const { | |||
| 228 | if (isSmall()) { | |||
| 229 | uintptr_t Bits = getSmallBits(); | |||
| 230 | if (Bits == 0) | |||
| 231 | return -1; | |||
| 232 | return countTrailingZeros(Bits); | |||
| 233 | } | |||
| 234 | return getPointer()->find_first(); | |||
| 235 | } | |||
| 236 | ||||
| 237 | int find_last() const { | |||
| 238 | if (isSmall()) { | |||
| 239 | uintptr_t Bits = getSmallBits(); | |||
| 240 | if (Bits == 0) | |||
| 241 | return -1; | |||
| 242 | return NumBaseBits - countLeadingZeros(Bits) - 1; | |||
| 243 | } | |||
| 244 | return getPointer()->find_last(); | |||
| 245 | } | |||
| 246 | ||||
| 247 | /// Returns the index of the first unset bit, -1 if all of the bits are set. | |||
| 248 | int find_first_unset() const { | |||
| 249 | if (isSmall()) { | |||
| 250 | if (count() == getSmallSize()) | |||
| 251 | return -1; | |||
| 252 | ||||
| 253 | uintptr_t Bits = getSmallBits(); | |||
| 254 | return countTrailingOnes(Bits); | |||
| 255 | } | |||
| 256 | return getPointer()->find_first_unset(); | |||
| 257 | } | |||
| 258 | ||||
| 259 | int find_last_unset() const { | |||
| 260 | if (isSmall()) { | |||
| 261 | if (count() == getSmallSize()) | |||
| 262 | return -1; | |||
| 263 | ||||
| 264 | uintptr_t Bits = getSmallBits(); | |||
| 265 | // Set unused bits. | |||
| 266 | Bits |= ~uintptr_t(0) << getSmallSize(); | |||
| 267 | return NumBaseBits - countLeadingOnes(Bits) - 1; | |||
| 268 | } | |||
| 269 | return getPointer()->find_last_unset(); | |||
| 270 | } | |||
| 271 | ||||
| 272 | /// Returns the index of the next set bit following the "Prev" bit. | |||
| 273 | /// Returns -1 if the next set bit is not found. | |||
| 274 | int find_next(unsigned Prev) const { | |||
| 275 | if (isSmall()) { | |||
| 276 | uintptr_t Bits = getSmallBits(); | |||
| 277 | // Mask off previous bits. | |||
| 278 | Bits &= ~uintptr_t(0) << (Prev + 1); | |||
| 279 | if (Bits == 0 || Prev + 1 >= getSmallSize()) | |||
| 280 | return -1; | |||
| 281 | return countTrailingZeros(Bits); | |||
| 282 | } | |||
| 283 | return getPointer()->find_next(Prev); | |||
| 284 | } | |||
| 285 | ||||
| 286 | /// Returns the index of the next unset bit following the "Prev" bit. | |||
| 287 | /// Returns -1 if the next unset bit is not found. | |||
| 288 | int find_next_unset(unsigned Prev) const { | |||
| 289 | if (isSmall()) { | |||
| 290 | uintptr_t Bits = getSmallBits(); | |||
| 291 | // Mask in previous bits. | |||
| 292 | Bits |= (uintptr_t(1) << (Prev + 1)) - 1; | |||
| 293 | // Mask in unused bits. | |||
| 294 | Bits |= ~uintptr_t(0) << getSmallSize(); | |||
| 295 | ||||
| 296 | if (Bits == ~uintptr_t(0) || Prev + 1 >= getSmallSize()) | |||
| 297 | return -1; | |||
| 298 | return countTrailingOnes(Bits); | |||
| 299 | } | |||
| 300 | return getPointer()->find_next_unset(Prev); | |||
| 301 | } | |||
| 302 | ||||
| 303 | /// find_prev - Returns the index of the first set bit that precedes the | |||
| 304 | /// the bit at \p PriorTo. Returns -1 if all previous bits are unset. | |||
| 305 | int find_prev(unsigned PriorTo) const { | |||
| 306 | if (isSmall()) { | |||
| 307 | if (PriorTo == 0) | |||
| 308 | return -1; | |||
| 309 | ||||
| 310 | --PriorTo; | |||
| 311 | uintptr_t Bits = getSmallBits(); | |||
| 312 | Bits &= maskTrailingOnes<uintptr_t>(PriorTo + 1); | |||
| 313 | if (Bits == 0) | |||
| 314 | return -1; | |||
| 315 | ||||
| 316 | return NumBaseBits - countLeadingZeros(Bits) - 1; | |||
| 317 | } | |||
| 318 | return getPointer()->find_prev(PriorTo); | |||
| 319 | } | |||
| 320 | ||||
| 321 | /// Clear all bits. | |||
| 322 | void clear() { | |||
| 323 | if (!isSmall()) | |||
| 324 | delete getPointer(); | |||
| 325 | switchToSmall(0, 0); | |||
| 326 | } | |||
| 327 | ||||
| 328 | /// Grow or shrink the bitvector. | |||
| 329 | void resize(unsigned N, bool t = false) { | |||
| 330 | if (!isSmall()) { | |||
| 331 | getPointer()->resize(N, t); | |||
| 332 | } else if (SmallNumDataBits >= N) { | |||
| 333 | uintptr_t NewBits = t ? ~uintptr_t(0) << getSmallSize() : 0; | |||
| 334 | setSmallSize(N); | |||
| 335 | setSmallBits(NewBits | getSmallBits()); | |||
| 336 | } else { | |||
| 337 | BitVector *BV = new BitVector(N, t); | |||
| 338 | uintptr_t OldBits = getSmallBits(); | |||
| 339 | for (size_t i = 0, e = getSmallSize(); i != e; ++i) | |||
| 340 | (*BV)[i] = (OldBits >> i) & 1; | |||
| 341 | switchToLarge(BV); | |||
| 342 | } | |||
| 343 | } | |||
| 344 | ||||
| 345 | void reserve(unsigned N) { | |||
| 346 | if (isSmall()) { | |||
| 347 | if (N > SmallNumDataBits) { | |||
| 348 | uintptr_t OldBits = getSmallRawBits(); | |||
| 349 | size_t SmallSize = getSmallSize(); | |||
| 350 | BitVector *BV = new BitVector(SmallSize); | |||
| 351 | for (size_t i = 0; i < SmallSize; ++i) | |||
| 352 | if ((OldBits >> i) & 1) | |||
| 353 | BV->set(i); | |||
| 354 | BV->reserve(N); | |||
| 355 | switchToLarge(BV); | |||
| 356 | } | |||
| 357 | } else { | |||
| 358 | getPointer()->reserve(N); | |||
| 359 | } | |||
| 360 | } | |||
| 361 | ||||
| 362 | // Set, reset, flip | |||
| 363 | SmallBitVector &set() { | |||
| 364 | if (isSmall()) | |||
| 365 | setSmallBits(~uintptr_t(0)); | |||
| 366 | else | |||
| 367 | getPointer()->set(); | |||
| 368 | return *this; | |||
| 369 | } | |||
| 370 | ||||
| 371 | SmallBitVector &set(unsigned Idx) { | |||
| 372 | if (isSmall()) { | |||
| 373 | assert(Idx <= static_cast<unsigned>(((void)0) | |||
| 374 | std::numeric_limits<uintptr_t>::digits) &&((void)0) | |||
| 375 | "undefined behavior")((void)0); | |||
| 376 | setSmallBits(getSmallBits() | (uintptr_t(1) << Idx)); | |||
| ||||
| 377 | } | |||
| 378 | else | |||
| 379 | getPointer()->set(Idx); | |||
| 380 | return *this; | |||
| 381 | } | |||
| 382 | ||||
| 383 | /// Efficiently set a range of bits in [I, E) | |||
| 384 | SmallBitVector &set(unsigned I, unsigned E) { | |||
| 385 | assert(I <= E && "Attempted to set backwards range!")((void)0); | |||
| 386 | assert(E <= size() && "Attempted to set out-of-bounds range!")((void)0); | |||
| 387 | if (I == E) return *this; | |||
| 388 | if (isSmall()) { | |||
| 389 | uintptr_t EMask = ((uintptr_t)1) << E; | |||
| 390 | uintptr_t IMask = ((uintptr_t)1) << I; | |||
| 391 | uintptr_t Mask = EMask - IMask; | |||
| 392 | setSmallBits(getSmallBits() | Mask); | |||
| 393 | } else | |||
| 394 | getPointer()->set(I, E); | |||
| 395 | return *this; | |||
| 396 | } | |||
| 397 | ||||
| 398 | SmallBitVector &reset() { | |||
| 399 | if (isSmall()) | |||
| 400 | setSmallBits(0); | |||
| 401 | else | |||
| 402 | getPointer()->reset(); | |||
| 403 | return *this; | |||
| 404 | } | |||
| 405 | ||||
| 406 | SmallBitVector &reset(unsigned Idx) { | |||
| 407 | if (isSmall()) | |||
| 408 | setSmallBits(getSmallBits() & ~(uintptr_t(1) << Idx)); | |||
| 409 | else | |||
| 410 | getPointer()->reset(Idx); | |||
| 411 | return *this; | |||
| 412 | } | |||
| 413 | ||||
| 414 | /// Efficiently reset a range of bits in [I, E) | |||
| 415 | SmallBitVector &reset(unsigned I, unsigned E) { | |||
| 416 | assert(I <= E && "Attempted to reset backwards range!")((void)0); | |||
| 417 | assert(E <= size() && "Attempted to reset out-of-bounds range!")((void)0); | |||
| 418 | if (I == E) return *this; | |||
| 419 | if (isSmall()) { | |||
| 420 | uintptr_t EMask = ((uintptr_t)1) << E; | |||
| 421 | uintptr_t IMask = ((uintptr_t)1) << I; | |||
| 422 | uintptr_t Mask = EMask - IMask; | |||
| 423 | setSmallBits(getSmallBits() & ~Mask); | |||
| 424 | } else | |||
| 425 | getPointer()->reset(I, E); | |||
| 426 | return *this; | |||
| 427 | } | |||
| 428 | ||||
| 429 | SmallBitVector &flip() { | |||
| 430 | if (isSmall()) | |||
| 431 | setSmallBits(~getSmallBits()); | |||
| 432 | else | |||
| 433 | getPointer()->flip(); | |||
| 434 | return *this; | |||
| 435 | } | |||
| 436 | ||||
| 437 | SmallBitVector &flip(unsigned Idx) { | |||
| 438 | if (isSmall()) | |||
| 439 | setSmallBits(getSmallBits() ^ (uintptr_t(1) << Idx)); | |||
| 440 | else | |||
| 441 | getPointer()->flip(Idx); | |||
| 442 | return *this; | |||
| 443 | } | |||
| 444 | ||||
| 445 | // No argument flip. | |||
| 446 | SmallBitVector operator~() const { | |||
| 447 | return SmallBitVector(*this).flip(); | |||
| 448 | } | |||
| 449 | ||||
| 450 | // Indexing. | |||
| 451 | reference operator[](unsigned Idx) { | |||
| 452 | assert(Idx < size() && "Out-of-bounds Bit access.")((void)0); | |||
| 453 | return reference(*this, Idx); | |||
| 454 | } | |||
| 455 | ||||
| 456 | bool operator[](unsigned Idx) const { | |||
| 457 | assert(Idx < size() && "Out-of-bounds Bit access.")((void)0); | |||
| 458 | if (isSmall()) | |||
| 459 | return ((getSmallBits() >> Idx) & 1) != 0; | |||
| 460 | return getPointer()->operator[](Idx); | |||
| 461 | } | |||
| 462 | ||||
| 463 | bool test(unsigned Idx) const { | |||
| 464 | return (*this)[Idx]; | |||
| 465 | } | |||
| 466 | ||||
| 467 | // Push single bit to end of vector. | |||
| 468 | void push_back(bool Val) { | |||
| 469 | resize(size() + 1, Val); | |||
| 470 | } | |||
| 471 | ||||
| 472 | /// Test if any common bits are set. | |||
| 473 | bool anyCommon(const SmallBitVector &RHS) const { | |||
| 474 | if (isSmall() && RHS.isSmall()) | |||
| 475 | return (getSmallBits() & RHS.getSmallBits()) != 0; | |||
| 476 | if (!isSmall() && !RHS.isSmall()) | |||
| 477 | return getPointer()->anyCommon(*RHS.getPointer()); | |||
| 478 | ||||
| 479 | for (unsigned i = 0, e = std::min(size(), RHS.size()); i != e; ++i) | |||
| 480 | if (test(i) && RHS.test(i)) | |||
| 481 | return true; | |||
| 482 | return false; | |||
| 483 | } | |||
| 484 | ||||
| 485 | // Comparison operators. | |||
| 486 | bool operator==(const SmallBitVector &RHS) const { | |||
| 487 | if (size() != RHS.size()) | |||
| 488 | return false; | |||
| 489 | if (isSmall() && RHS.isSmall()) | |||
| 490 | return getSmallBits() == RHS.getSmallBits(); | |||
| 491 | else if (!isSmall() && !RHS.isSmall()) | |||
| 492 | return *getPointer() == *RHS.getPointer(); | |||
| 493 | else { | |||
| 494 | for (size_t i = 0, e = size(); i != e; ++i) { | |||
| 495 | if ((*this)[i] != RHS[i]) | |||
| 496 | return false; | |||
| 497 | } | |||
| 498 | return true; | |||
| 499 | } | |||
| 500 | } | |||
| 501 | ||||
| 502 | bool operator!=(const SmallBitVector &RHS) const { | |||
| 503 | return !(*this == RHS); | |||
| 504 | } | |||
| 505 | ||||
| 506 | // Intersection, union, disjoint union. | |||
| 507 | // FIXME BitVector::operator&= does not resize the LHS but this does | |||
| 508 | SmallBitVector &operator&=(const SmallBitVector &RHS) { | |||
| 509 | resize(std::max(size(), RHS.size())); | |||
| 510 | if (isSmall() && RHS.isSmall()) | |||
| 511 | setSmallBits(getSmallBits() & RHS.getSmallBits()); | |||
| 512 | else if (!isSmall() && !RHS.isSmall()) | |||
| 513 | getPointer()->operator&=(*RHS.getPointer()); | |||
| 514 | else { | |||
| 515 | size_t i, e; | |||
| 516 | for (i = 0, e = std::min(size(), RHS.size()); i != e; ++i) | |||
| 517 | (*this)[i] = test(i) && RHS.test(i); | |||
| 518 | for (e = size(); i != e; ++i) | |||
| 519 | reset(i); | |||
| 520 | } | |||
| 521 | return *this; | |||
| 522 | } | |||
| 523 | ||||
| 524 | /// Reset bits that are set in RHS. Same as *this &= ~RHS. | |||
| 525 | SmallBitVector &reset(const SmallBitVector &RHS) { | |||
| 526 | if (isSmall() && RHS.isSmall()) | |||
| 527 | setSmallBits(getSmallBits() & ~RHS.getSmallBits()); | |||
| 528 | else if (!isSmall() && !RHS.isSmall()) | |||
| 529 | getPointer()->reset(*RHS.getPointer()); | |||
| 530 | else | |||
| 531 | for (unsigned i = 0, e = std::min(size(), RHS.size()); i != e; ++i) | |||
| 532 | if (RHS.test(i)) | |||
| 533 | reset(i); | |||
| 534 | ||||
| 535 | return *this; | |||
| 536 | } | |||
| 537 | ||||
| 538 | /// Check if (This - RHS) is zero. This is the same as reset(RHS) and any(). | |||
| 539 | bool test(const SmallBitVector &RHS) const { | |||
| 540 | if (isSmall() && RHS.isSmall()) | |||
| 541 | return (getSmallBits() & ~RHS.getSmallBits()) != 0; | |||
| 542 | if (!isSmall() && !RHS.isSmall()) | |||
| 543 | return getPointer()->test(*RHS.getPointer()); | |||
| 544 | ||||
| 545 | unsigned i, e; | |||
| 546 | for (i = 0, e = std::min(size(), RHS.size()); i != e; ++i) | |||
| 547 | if (test(i) && !RHS.test(i)) | |||
| 548 | return true; | |||
| 549 | ||||
| 550 | for (e = size(); i != e; ++i) | |||
| 551 | if (test(i)) | |||
| 552 | return true; | |||
| 553 | ||||
| 554 | return false; | |||
| 555 | } | |||
| 556 | ||||
| 557 | SmallBitVector &operator|=(const SmallBitVector &RHS) { | |||
| 558 | resize(std::max(size(), RHS.size())); | |||
| 559 | if (isSmall() && RHS.isSmall()) | |||
| 560 | setSmallBits(getSmallBits() | RHS.getSmallBits()); | |||
| 561 | else if (!isSmall() && !RHS.isSmall()) | |||
| 562 | getPointer()->operator|=(*RHS.getPointer()); | |||
| 563 | else { | |||
| 564 | for (size_t i = 0, e = RHS.size(); i != e; ++i) | |||
| 565 | (*this)[i] = test(i) || RHS.test(i); | |||
| 566 | } | |||
| 567 | return *this; | |||
| 568 | } | |||
| 569 | ||||
| 570 | SmallBitVector &operator^=(const SmallBitVector &RHS) { | |||
| 571 | resize(std::max(size(), RHS.size())); | |||
| 572 | if (isSmall() && RHS.isSmall()) | |||
| 573 | setSmallBits(getSmallBits() ^ RHS.getSmallBits()); | |||
| 574 | else if (!isSmall() && !RHS.isSmall()) | |||
| 575 | getPointer()->operator^=(*RHS.getPointer()); | |||
| 576 | else { | |||
| 577 | for (size_t i = 0, e = RHS.size(); i != e; ++i) | |||
| 578 | (*this)[i] = test(i) != RHS.test(i); | |||
| 579 | } | |||
| 580 | return *this; | |||
| 581 | } | |||
| 582 | ||||
| 583 | SmallBitVector &operator<<=(unsigned N) { | |||
| 584 | if (isSmall()) | |||
| 585 | setSmallBits(getSmallBits() << N); | |||
| 586 | else | |||
| 587 | getPointer()->operator<<=(N); | |||
| 588 | return *this; | |||
| 589 | } | |||
| 590 | ||||
| 591 | SmallBitVector &operator>>=(unsigned N) { | |||
| 592 | if (isSmall()) | |||
| 593 | setSmallBits(getSmallBits() >> N); | |||
| 594 | else | |||
| 595 | getPointer()->operator>>=(N); | |||
| 596 | return *this; | |||
| 597 | } | |||
| 598 | ||||
| 599 | // Assignment operator. | |||
| 600 | const SmallBitVector &operator=(const SmallBitVector &RHS) { | |||
| 601 | if (isSmall()) { | |||
| 602 | if (RHS.isSmall()) | |||
| 603 | X = RHS.X; | |||
| 604 | else | |||
| 605 | switchToLarge(new BitVector(*RHS.getPointer())); | |||
| 606 | } else { | |||
| 607 | if (!RHS.isSmall()) | |||
| 608 | *getPointer() = *RHS.getPointer(); | |||
| 609 | else { | |||
| 610 | delete getPointer(); | |||
| 611 | X = RHS.X; | |||
| 612 | } | |||
| 613 | } | |||
| 614 | return *this; | |||
| 615 | } | |||
| 616 | ||||
| 617 | const SmallBitVector &operator=(SmallBitVector &&RHS) { | |||
| 618 | if (this != &RHS) { | |||
| 619 | clear(); | |||
| 620 | swap(RHS); | |||
| 621 | } | |||
| 622 | return *this; | |||
| 623 | } | |||
| 624 | ||||
| 625 | void swap(SmallBitVector &RHS) { | |||
| 626 | std::swap(X, RHS.X); | |||
| 627 | } | |||
| 628 | ||||
| 629 | /// Add '1' bits from Mask to this vector. Don't resize. | |||
| 630 | /// This computes "*this |= Mask". | |||
| 631 | void setBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | |||
| 632 | if (isSmall()) | |||
| 633 | applyMask<true, false>(Mask, MaskWords); | |||
| 634 | else | |||
| 635 | getPointer()->setBitsInMask(Mask, MaskWords); | |||
| 636 | } | |||
| 637 | ||||
| 638 | /// Clear any bits in this vector that are set in Mask. Don't resize. | |||
| 639 | /// This computes "*this &= ~Mask". | |||
| 640 | void clearBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | |||
| 641 | if (isSmall()) | |||
| 642 | applyMask<false, false>(Mask, MaskWords); | |||
| 643 | else | |||
| 644 | getPointer()->clearBitsInMask(Mask, MaskWords); | |||
| 645 | } | |||
| 646 | ||||
| 647 | /// Add a bit to this vector for every '0' bit in Mask. Don't resize. | |||
| 648 | /// This computes "*this |= ~Mask". | |||
| 649 | void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | |||
| 650 | if (isSmall()) | |||
| 651 | applyMask<true, true>(Mask, MaskWords); | |||
| 652 | else | |||
| 653 | getPointer()->setBitsNotInMask(Mask, MaskWords); | |||
| 654 | } | |||
| 655 | ||||
| 656 | /// Clear a bit in this vector for every '0' bit in Mask. Don't resize. | |||
| 657 | /// This computes "*this &= Mask". | |||
| 658 | void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | |||
| 659 | if (isSmall()) | |||
| 660 | applyMask<false, true>(Mask, MaskWords); | |||
| 661 | else | |||
| 662 | getPointer()->clearBitsNotInMask(Mask, MaskWords); | |||
| 663 | } | |||
| 664 | ||||
| 665 | void invalid() { | |||
| 666 | assert(empty())((void)0); | |||
| 667 | X = (uintptr_t)-1; | |||
| 668 | } | |||
| 669 | bool isInvalid() const { return X == (uintptr_t)-1; } | |||
| 670 | ||||
| 671 | ArrayRef<uintptr_t> getData(uintptr_t &Store) const { | |||
| 672 | if (!isSmall()) | |||
| 673 | return getPointer()->getData(); | |||
| 674 | Store = getSmallBits(); | |||
| 675 | return makeArrayRef(Store); | |||
| 676 | } | |||
| 677 | ||||
| 678 | private: | |||
| 679 | template <bool AddBits, bool InvertMask> | |||
| 680 | void applyMask(const uint32_t *Mask, unsigned MaskWords) { | |||
| 681 | assert(MaskWords <= sizeof(uintptr_t) && "Mask is larger than base!")((void)0); | |||
| 682 | uintptr_t M = Mask[0]; | |||
| 683 | if (NumBaseBits == 64) | |||
| 684 | M |= uint64_t(Mask[1]) << 32; | |||
| 685 | if (InvertMask) | |||
| 686 | M = ~M; | |||
| 687 | if (AddBits) | |||
| 688 | setSmallBits(getSmallBits() | M); | |||
| 689 | else | |||
| 690 | setSmallBits(getSmallBits() & ~M); | |||
| 691 | } | |||
| 692 | }; | |||
| 693 | ||||
| 694 | inline SmallBitVector | |||
| 695 | operator&(const SmallBitVector &LHS, const SmallBitVector &RHS) { | |||
| 696 | SmallBitVector Result(LHS); | |||
| 697 | Result &= RHS; | |||
| 698 | return Result; | |||
| 699 | } | |||
| 700 | ||||
| 701 | inline SmallBitVector | |||
| 702 | operator|(const SmallBitVector &LHS, const SmallBitVector &RHS) { | |||
| 703 | SmallBitVector Result(LHS); | |||
| 704 | Result |= RHS; | |||
| 705 | return Result; | |||
| 706 | } | |||
| 707 | ||||
| 708 | inline SmallBitVector | |||
| 709 | operator^(const SmallBitVector &LHS, const SmallBitVector &RHS) { | |||
| 710 | SmallBitVector Result(LHS); | |||
| 711 | Result ^= RHS; | |||
| 712 | return Result; | |||
| 713 | } | |||
| 714 | ||||
| 715 | template <> struct DenseMapInfo<SmallBitVector> { | |||
| 716 | static inline SmallBitVector getEmptyKey() { return SmallBitVector(); } | |||
| 717 | static inline SmallBitVector getTombstoneKey() { | |||
| 718 | SmallBitVector V; | |||
| 719 | V.invalid(); | |||
| 720 | return V; | |||
| 721 | } | |||
| 722 | static unsigned getHashValue(const SmallBitVector &V) { | |||
| 723 | uintptr_t Store; | |||
| 724 | return DenseMapInfo<std::pair<unsigned, ArrayRef<uintptr_t>>>::getHashValue( | |||
| 725 | std::make_pair(V.size(), V.getData(Store))); | |||
| 726 | } | |||
| 727 | static bool isEqual(const SmallBitVector &LHS, const SmallBitVector &RHS) { | |||
| 728 | if (LHS.isInvalid() || RHS.isInvalid()) | |||
| 729 | return LHS.isInvalid() == RHS.isInvalid(); | |||
| 730 | return LHS == RHS; | |||
| 731 | } | |||
| 732 | }; | |||
| 733 | } // end namespace llvm | |||
| 734 | ||||
| 735 | namespace std { | |||
| 736 | ||||
| 737 | /// Implement std::swap in terms of BitVector swap. | |||
| 738 | inline void | |||
| 739 | swap(llvm::SmallBitVector &LHS, llvm::SmallBitVector &RHS) { | |||
| 740 | LHS.swap(RHS); | |||
| 741 | } | |||
| 742 | ||||
| 743 | } // end namespace std | |||
| 744 | ||||
| 745 | #endif // LLVM_ADT_SMALLBITVECTOR_H |
| 1 | //===- llvm/ADT/BitVector.h - Bit vectors -----------------------*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file implements the BitVector class. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #ifndef LLVM_ADT_BITVECTOR_H |
| 14 | #define LLVM_ADT_BITVECTOR_H |
| 15 | |
| 16 | #include "llvm/ADT/ArrayRef.h" |
| 17 | #include "llvm/ADT/DenseMapInfo.h" |
| 18 | #include "llvm/ADT/iterator_range.h" |
| 19 | #include "llvm/Support/MathExtras.h" |
| 20 | #include <algorithm> |
| 21 | #include <cassert> |
| 22 | #include <climits> |
| 23 | #include <cstdint> |
| 24 | #include <cstdlib> |
| 25 | #include <cstring> |
| 26 | #include <utility> |
| 27 | |
| 28 | namespace llvm { |
| 29 | |
| 30 | /// ForwardIterator for the bits that are set. |
| 31 | /// Iterators get invalidated when resize / reserve is called. |
| 32 | template <typename BitVectorT> class const_set_bits_iterator_impl { |
| 33 | const BitVectorT &Parent; |
| 34 | int Current = 0; |
| 35 | |
| 36 | void advance() { |
| 37 | assert(Current != -1 && "Trying to advance past end.")((void)0); |
| 38 | Current = Parent.find_next(Current); |
| 39 | } |
| 40 | |
| 41 | public: |
| 42 | const_set_bits_iterator_impl(const BitVectorT &Parent, int Current) |
| 43 | : Parent(Parent), Current(Current) {} |
| 44 | explicit const_set_bits_iterator_impl(const BitVectorT &Parent) |
| 45 | : const_set_bits_iterator_impl(Parent, Parent.find_first()) {} |
| 46 | const_set_bits_iterator_impl(const const_set_bits_iterator_impl &) = default; |
| 47 | |
| 48 | const_set_bits_iterator_impl operator++(int) { |
| 49 | auto Prev = *this; |
| 50 | advance(); |
| 51 | return Prev; |
| 52 | } |
| 53 | |
| 54 | const_set_bits_iterator_impl &operator++() { |
| 55 | advance(); |
| 56 | return *this; |
| 57 | } |
| 58 | |
| 59 | unsigned operator*() const { return Current; } |
| 60 | |
| 61 | bool operator==(const const_set_bits_iterator_impl &Other) const { |
| 62 | assert(&Parent == &Other.Parent &&((void)0) |
| 63 | "Comparing iterators from different BitVectors")((void)0); |
| 64 | return Current == Other.Current; |
| 65 | } |
| 66 | |
| 67 | bool operator!=(const const_set_bits_iterator_impl &Other) const { |
| 68 | assert(&Parent == &Other.Parent &&((void)0) |
| 69 | "Comparing iterators from different BitVectors")((void)0); |
| 70 | return Current != Other.Current; |
| 71 | } |
| 72 | }; |
| 73 | |
| 74 | class BitVector { |
| 75 | typedef uintptr_t BitWord; |
| 76 | |
| 77 | enum { BITWORD_SIZE = (unsigned)sizeof(BitWord) * CHAR_BIT8 }; |
| 78 | |
| 79 | static_assert(BITWORD_SIZE == 64 || BITWORD_SIZE == 32, |
| 80 | "Unsupported word size"); |
| 81 | |
| 82 | using Storage = SmallVector<BitWord>; |
| 83 | |
| 84 | Storage Bits; // Actual bits. |
| 85 | unsigned Size; // Size of bitvector in bits. |
| 86 | |
| 87 | public: |
| 88 | typedef unsigned size_type; |
| 89 | |
| 90 | // Encapsulation of a single bit. |
| 91 | class reference { |
| 92 | |
| 93 | BitWord *WordRef; |
| 94 | unsigned BitPos; |
| 95 | |
| 96 | public: |
| 97 | reference(BitVector &b, unsigned Idx) { |
| 98 | WordRef = &b.Bits[Idx / BITWORD_SIZE]; |
| 99 | BitPos = Idx % BITWORD_SIZE; |
| 100 | } |
| 101 | |
| 102 | reference() = delete; |
| 103 | reference(const reference&) = default; |
| 104 | |
| 105 | reference &operator=(reference t) { |
| 106 | *this = bool(t); |
| 107 | return *this; |
| 108 | } |
| 109 | |
| 110 | reference& operator=(bool t) { |
| 111 | if (t) |
| 112 | *WordRef |= BitWord(1) << BitPos; |
| 113 | else |
| 114 | *WordRef &= ~(BitWord(1) << BitPos); |
| 115 | return *this; |
| 116 | } |
| 117 | |
| 118 | operator bool() const { |
| 119 | return ((*WordRef) & (BitWord(1) << BitPos)) != 0; |
| 120 | } |
| 121 | }; |
| 122 | |
| 123 | typedef const_set_bits_iterator_impl<BitVector> const_set_bits_iterator; |
| 124 | typedef const_set_bits_iterator set_iterator; |
| 125 | |
| 126 | const_set_bits_iterator set_bits_begin() const { |
| 127 | return const_set_bits_iterator(*this); |
| 128 | } |
| 129 | const_set_bits_iterator set_bits_end() const { |
| 130 | return const_set_bits_iterator(*this, -1); |
| 131 | } |
| 132 | iterator_range<const_set_bits_iterator> set_bits() const { |
| 133 | return make_range(set_bits_begin(), set_bits_end()); |
| 134 | } |
| 135 | |
| 136 | /// BitVector default ctor - Creates an empty bitvector. |
| 137 | BitVector() : Size(0) {} |
| 138 | |
| 139 | /// BitVector ctor - Creates a bitvector of specified number of bits. All |
| 140 | /// bits are initialized to the specified value. |
| 141 | explicit BitVector(unsigned s, bool t = false) |
| 142 | : Bits(NumBitWords(s), 0 - (BitWord)t), Size(s) { |
| 143 | if (t) |
| 144 | clear_unused_bits(); |
| 145 | } |
| 146 | |
| 147 | /// empty - Tests whether there are no bits in this bitvector. |
| 148 | bool empty() const { return Size == 0; } |
| 149 | |
| 150 | /// size - Returns the number of bits in this bitvector. |
| 151 | size_type size() const { return Size; } |
| 152 | |
| 153 | /// count - Returns the number of bits which are set. |
| 154 | size_type count() const { |
| 155 | unsigned NumBits = 0; |
| 156 | for (auto Bit : Bits) |
| 157 | NumBits += countPopulation(Bit); |
| 158 | return NumBits; |
| 159 | } |
| 160 | |
| 161 | /// any - Returns true if any bit is set. |
| 162 | bool any() const { |
| 163 | return any_of(Bits, [](BitWord Bit) { return Bit != 0; }); |
| 164 | } |
| 165 | |
| 166 | /// all - Returns true if all bits are set. |
| 167 | bool all() const { |
| 168 | for (unsigned i = 0; i < Size / BITWORD_SIZE; ++i) |
| 169 | if (Bits[i] != ~BitWord(0)) |
| 170 | return false; |
| 171 | |
| 172 | // If bits remain check that they are ones. The unused bits are always zero. |
| 173 | if (unsigned Remainder = Size % BITWORD_SIZE) |
| 174 | return Bits[Size / BITWORD_SIZE] == (BitWord(1) << Remainder) - 1; |
| 175 | |
| 176 | return true; |
| 177 | } |
| 178 | |
| 179 | /// none - Returns true if none of the bits are set. |
| 180 | bool none() const { |
| 181 | return !any(); |
| 182 | } |
| 183 | |
| 184 | /// find_first_in - Returns the index of the first set / unset bit, |
| 185 | /// depending on \p Set, in the range [Begin, End). |
| 186 | /// Returns -1 if all bits in the range are unset / set. |
| 187 | int find_first_in(unsigned Begin, unsigned End, bool Set = true) const { |
| 188 | assert(Begin <= End && End <= Size)((void)0); |
| 189 | if (Begin == End) |
| 190 | return -1; |
| 191 | |
| 192 | unsigned FirstWord = Begin / BITWORD_SIZE; |
| 193 | unsigned LastWord = (End - 1) / BITWORD_SIZE; |
| 194 | |
| 195 | // Check subsequent words. |
| 196 | // The code below is based on search for the first _set_ bit. If |
| 197 | // we're searching for the first _unset_, we just take the |
| 198 | // complement of each word before we use it and apply |
| 199 | // the same method. |
| 200 | for (unsigned i = FirstWord; i <= LastWord; ++i) { |
| 201 | BitWord Copy = Bits[i]; |
| 202 | if (!Set) |
| 203 | Copy = ~Copy; |
| 204 | |
| 205 | if (i == FirstWord) { |
| 206 | unsigned FirstBit = Begin % BITWORD_SIZE; |
| 207 | Copy &= maskTrailingZeros<BitWord>(FirstBit); |
| 208 | } |
| 209 | |
| 210 | if (i == LastWord) { |
| 211 | unsigned LastBit = (End - 1) % BITWORD_SIZE; |
| 212 | Copy &= maskTrailingOnes<BitWord>(LastBit + 1); |
| 213 | } |
| 214 | if (Copy != 0) |
| 215 | return i * BITWORD_SIZE + countTrailingZeros(Copy); |
| 216 | } |
| 217 | return -1; |
| 218 | } |
| 219 | |
| 220 | /// find_last_in - Returns the index of the last set bit in the range |
| 221 | /// [Begin, End). Returns -1 if all bits in the range are unset. |
| 222 | int find_last_in(unsigned Begin, unsigned End) const { |
| 223 | assert(Begin <= End && End <= Size)((void)0); |
| 224 | if (Begin == End) |
| 225 | return -1; |
| 226 | |
| 227 | unsigned LastWord = (End - 1) / BITWORD_SIZE; |
| 228 | unsigned FirstWord = Begin / BITWORD_SIZE; |
| 229 | |
| 230 | for (unsigned i = LastWord + 1; i >= FirstWord + 1; --i) { |
| 231 | unsigned CurrentWord = i - 1; |
| 232 | |
| 233 | BitWord Copy = Bits[CurrentWord]; |
| 234 | if (CurrentWord == LastWord) { |
| 235 | unsigned LastBit = (End - 1) % BITWORD_SIZE; |
| 236 | Copy &= maskTrailingOnes<BitWord>(LastBit + 1); |
| 237 | } |
| 238 | |
| 239 | if (CurrentWord == FirstWord) { |
| 240 | unsigned FirstBit = Begin % BITWORD_SIZE; |
| 241 | Copy &= maskTrailingZeros<BitWord>(FirstBit); |
| 242 | } |
| 243 | |
| 244 | if (Copy != 0) |
| 245 | return (CurrentWord + 1) * BITWORD_SIZE - countLeadingZeros(Copy) - 1; |
| 246 | } |
| 247 | |
| 248 | return -1; |
| 249 | } |
| 250 | |
| 251 | /// find_first_unset_in - Returns the index of the first unset bit in the |
| 252 | /// range [Begin, End). Returns -1 if all bits in the range are set. |
| 253 | int find_first_unset_in(unsigned Begin, unsigned End) const { |
| 254 | return find_first_in(Begin, End, /* Set = */ false); |
| 255 | } |
| 256 | |
| 257 | /// find_last_unset_in - Returns the index of the last unset bit in the |
| 258 | /// range [Begin, End). Returns -1 if all bits in the range are set. |
| 259 | int find_last_unset_in(unsigned Begin, unsigned End) const { |
| 260 | assert(Begin <= End && End <= Size)((void)0); |
| 261 | if (Begin == End) |
| 262 | return -1; |
| 263 | |
| 264 | unsigned LastWord = (End - 1) / BITWORD_SIZE; |
| 265 | unsigned FirstWord = Begin / BITWORD_SIZE; |
| 266 | |
| 267 | for (unsigned i = LastWord + 1; i >= FirstWord + 1; --i) { |
| 268 | unsigned CurrentWord = i - 1; |
| 269 | |
| 270 | BitWord Copy = Bits[CurrentWord]; |
| 271 | if (CurrentWord == LastWord) { |
| 272 | unsigned LastBit = (End - 1) % BITWORD_SIZE; |
| 273 | Copy |= maskTrailingZeros<BitWord>(LastBit + 1); |
| 274 | } |
| 275 | |
| 276 | if (CurrentWord == FirstWord) { |
| 277 | unsigned FirstBit = Begin % BITWORD_SIZE; |
| 278 | Copy |= maskTrailingOnes<BitWord>(FirstBit); |
| 279 | } |
| 280 | |
| 281 | if (Copy != ~BitWord(0)) { |
| 282 | unsigned Result = |
| 283 | (CurrentWord + 1) * BITWORD_SIZE - countLeadingOnes(Copy) - 1; |
| 284 | return Result < Size ? Result : -1; |
| 285 | } |
| 286 | } |
| 287 | return -1; |
| 288 | } |
| 289 | |
| 290 | /// find_first - Returns the index of the first set bit, -1 if none |
| 291 | /// of the bits are set. |
| 292 | int find_first() const { return find_first_in(0, Size); } |
| 293 | |
| 294 | /// find_last - Returns the index of the last set bit, -1 if none of the bits |
| 295 | /// are set. |
| 296 | int find_last() const { return find_last_in(0, Size); } |
| 297 | |
| 298 | /// find_next - Returns the index of the next set bit following the |
| 299 | /// "Prev" bit. Returns -1 if the next set bit is not found. |
| 300 | int find_next(unsigned Prev) const { return find_first_in(Prev + 1, Size); } |
| 301 | |
| 302 | /// find_prev - Returns the index of the first set bit that precedes the |
| 303 | /// the bit at \p PriorTo. Returns -1 if all previous bits are unset. |
| 304 | int find_prev(unsigned PriorTo) const { return find_last_in(0, PriorTo); } |
| 305 | |
| 306 | /// find_first_unset - Returns the index of the first unset bit, -1 if all |
| 307 | /// of the bits are set. |
| 308 | int find_first_unset() const { return find_first_unset_in(0, Size); } |
| 309 | |
| 310 | /// find_next_unset - Returns the index of the next unset bit following the |
| 311 | /// "Prev" bit. Returns -1 if all remaining bits are set. |
| 312 | int find_next_unset(unsigned Prev) const { |
| 313 | return find_first_unset_in(Prev + 1, Size); |
| 314 | } |
| 315 | |
| 316 | /// find_last_unset - Returns the index of the last unset bit, -1 if all of |
| 317 | /// the bits are set. |
| 318 | int find_last_unset() const { return find_last_unset_in(0, Size); } |
| 319 | |
| 320 | /// find_prev_unset - Returns the index of the first unset bit that precedes |
| 321 | /// the bit at \p PriorTo. Returns -1 if all previous bits are set. |
| 322 | int find_prev_unset(unsigned PriorTo) { |
| 323 | return find_last_unset_in(0, PriorTo); |
| 324 | } |
| 325 | |
| 326 | /// clear - Removes all bits from the bitvector. |
| 327 | void clear() { |
| 328 | Size = 0; |
| 329 | Bits.clear(); |
| 330 | } |
| 331 | |
| 332 | /// resize - Grow or shrink the bitvector. |
| 333 | void resize(unsigned N, bool t = false) { |
| 334 | set_unused_bits(t); |
| 335 | Size = N; |
| 336 | Bits.resize(NumBitWords(N), 0 - BitWord(t)); |
| 337 | clear_unused_bits(); |
| 338 | } |
| 339 | |
| 340 | void reserve(unsigned N) { Bits.reserve(NumBitWords(N)); } |
| 341 | |
| 342 | // Set, reset, flip |
| 343 | BitVector &set() { |
| 344 | init_words(true); |
| 345 | clear_unused_bits(); |
| 346 | return *this; |
| 347 | } |
| 348 | |
| 349 | BitVector &set(unsigned Idx) { |
| 350 | assert(Idx < Size && "access in bound")((void)0); |
| 351 | Bits[Idx / BITWORD_SIZE] |= BitWord(1) << (Idx % BITWORD_SIZE); |
| 352 | return *this; |
| 353 | } |
| 354 | |
| 355 | /// set - Efficiently set a range of bits in [I, E) |
| 356 | BitVector &set(unsigned I, unsigned E) { |
| 357 | assert(I <= E && "Attempted to set backwards range!")((void)0); |
| 358 | assert(E <= size() && "Attempted to set out-of-bounds range!")((void)0); |
| 359 | |
| 360 | if (I == E) return *this; |
| 361 | |
| 362 | if (I / BITWORD_SIZE == E / BITWORD_SIZE) { |
| 363 | BitWord EMask = BitWord(1) << (E % BITWORD_SIZE); |
| 364 | BitWord IMask = BitWord(1) << (I % BITWORD_SIZE); |
| 365 | BitWord Mask = EMask - IMask; |
| 366 | Bits[I / BITWORD_SIZE] |= Mask; |
| 367 | return *this; |
| 368 | } |
| 369 | |
| 370 | BitWord PrefixMask = ~BitWord(0) << (I % BITWORD_SIZE); |
| 371 | Bits[I / BITWORD_SIZE] |= PrefixMask; |
| 372 | I = alignTo(I, BITWORD_SIZE); |
| 373 | |
| 374 | for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE) |
| 375 | Bits[I / BITWORD_SIZE] = ~BitWord(0); |
| 376 | |
| 377 | BitWord PostfixMask = (BitWord(1) << (E % BITWORD_SIZE)) - 1; |
| 378 | if (I < E) |
| 379 | Bits[I / BITWORD_SIZE] |= PostfixMask; |
| 380 | |
| 381 | return *this; |
| 382 | } |
| 383 | |
| 384 | BitVector &reset() { |
| 385 | init_words(false); |
| 386 | return *this; |
| 387 | } |
| 388 | |
| 389 | BitVector &reset(unsigned Idx) { |
| 390 | Bits[Idx / BITWORD_SIZE] &= ~(BitWord(1) << (Idx % BITWORD_SIZE)); |
| 391 | return *this; |
| 392 | } |
| 393 | |
| 394 | /// reset - Efficiently reset a range of bits in [I, E) |
| 395 | BitVector &reset(unsigned I, unsigned E) { |
| 396 | assert(I <= E && "Attempted to reset backwards range!")((void)0); |
| 397 | assert(E <= size() && "Attempted to reset out-of-bounds range!")((void)0); |
| 398 | |
| 399 | if (I == E) return *this; |
| 400 | |
| 401 | if (I / BITWORD_SIZE == E / BITWORD_SIZE) { |
| 402 | BitWord EMask = BitWord(1) << (E % BITWORD_SIZE); |
| 403 | BitWord IMask = BitWord(1) << (I % BITWORD_SIZE); |
| 404 | BitWord Mask = EMask - IMask; |
| 405 | Bits[I / BITWORD_SIZE] &= ~Mask; |
| 406 | return *this; |
| 407 | } |
| 408 | |
| 409 | BitWord PrefixMask = ~BitWord(0) << (I % BITWORD_SIZE); |
| 410 | Bits[I / BITWORD_SIZE] &= ~PrefixMask; |
| 411 | I = alignTo(I, BITWORD_SIZE); |
| 412 | |
| 413 | for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE) |
| 414 | Bits[I / BITWORD_SIZE] = BitWord(0); |
| 415 | |
| 416 | BitWord PostfixMask = (BitWord(1) << (E % BITWORD_SIZE)) - 1; |
| 417 | if (I < E) |
| 418 | Bits[I / BITWORD_SIZE] &= ~PostfixMask; |
| 419 | |
| 420 | return *this; |
| 421 | } |
| 422 | |
| 423 | BitVector &flip() { |
| 424 | for (auto &Bit : Bits) |
| 425 | Bit = ~Bit; |
| 426 | clear_unused_bits(); |
| 427 | return *this; |
| 428 | } |
| 429 | |
| 430 | BitVector &flip(unsigned Idx) { |
| 431 | Bits[Idx / BITWORD_SIZE] ^= BitWord(1) << (Idx % BITWORD_SIZE); |
| 432 | return *this; |
| 433 | } |
| 434 | |
| 435 | // Indexing. |
| 436 | reference operator[](unsigned Idx) { |
| 437 | assert (Idx < Size && "Out-of-bounds Bit access.")((void)0); |
| 438 | return reference(*this, Idx); |
| 439 | } |
| 440 | |
| 441 | bool operator[](unsigned Idx) const { |
| 442 | assert (Idx < Size && "Out-of-bounds Bit access.")((void)0); |
| 443 | BitWord Mask = BitWord(1) << (Idx % BITWORD_SIZE); |
| 444 | return (Bits[Idx / BITWORD_SIZE] & Mask) != 0; |
| 445 | } |
| 446 | |
| 447 | bool test(unsigned Idx) const { |
| 448 | return (*this)[Idx]; |
| 449 | } |
| 450 | |
| 451 | // Push single bit to end of vector. |
| 452 | void push_back(bool Val) { |
| 453 | unsigned OldSize = Size; |
| 454 | unsigned NewSize = Size + 1; |
| 455 | |
| 456 | // Resize, which will insert zeros. |
| 457 | // If we already fit then the unused bits will be already zero. |
| 458 | if (NewSize > getBitCapacity()) |
| 459 | resize(NewSize, false); |
| 460 | else |
| 461 | Size = NewSize; |
| 462 | |
| 463 | // If true, set single bit. |
| 464 | if (Val) |
| 465 | set(OldSize); |
| 466 | } |
| 467 | |
| 468 | /// Test if any common bits are set. |
| 469 | bool anyCommon(const BitVector &RHS) const { |
| 470 | unsigned ThisWords = Bits.size(); |
| 471 | unsigned RHSWords = RHS.Bits.size(); |
| 472 | for (unsigned i = 0, e = std::min(ThisWords, RHSWords); i != e; ++i) |
| 473 | if (Bits[i] & RHS.Bits[i]) |
| 474 | return true; |
| 475 | return false; |
| 476 | } |
| 477 | |
| 478 | // Comparison operators. |
| 479 | bool operator==(const BitVector &RHS) const { |
| 480 | if (size() != RHS.size()) |
| 481 | return false; |
| 482 | unsigned NumWords = Bits.size(); |
| 483 | return std::equal(Bits.begin(), Bits.begin() + NumWords, RHS.Bits.begin()); |
| 484 | } |
| 485 | |
| 486 | bool operator!=(const BitVector &RHS) const { return !(*this == RHS); } |
| 487 | |
| 488 | /// Intersection, union, disjoint union. |
| 489 | BitVector &operator&=(const BitVector &RHS) { |
| 490 | unsigned ThisWords = Bits.size(); |
| 491 | unsigned RHSWords = RHS.Bits.size(); |
| 492 | unsigned i; |
| 493 | for (i = 0; i != std::min(ThisWords, RHSWords); ++i) |
| 494 | Bits[i] &= RHS.Bits[i]; |
| 495 | |
| 496 | // Any bits that are just in this bitvector become zero, because they aren't |
| 497 | // in the RHS bit vector. Any words only in RHS are ignored because they |
| 498 | // are already zero in the LHS. |
| 499 | for (; i != ThisWords; ++i) |
| 500 | Bits[i] = 0; |
| 501 | |
| 502 | return *this; |
| 503 | } |
| 504 | |
| 505 | /// reset - Reset bits that are set in RHS. Same as *this &= ~RHS. |
| 506 | BitVector &reset(const BitVector &RHS) { |
| 507 | unsigned ThisWords = Bits.size(); |
| 508 | unsigned RHSWords = RHS.Bits.size(); |
| 509 | for (unsigned i = 0; i != std::min(ThisWords, RHSWords); ++i) |
| 510 | Bits[i] &= ~RHS.Bits[i]; |
| 511 | return *this; |
| 512 | } |
| 513 | |
| 514 | /// test - Check if (This - RHS) is zero. |
| 515 | /// This is the same as reset(RHS) and any(). |
| 516 | bool test(const BitVector &RHS) const { |
| 517 | unsigned ThisWords = Bits.size(); |
| 518 | unsigned RHSWords = RHS.Bits.size(); |
| 519 | unsigned i; |
| 520 | for (i = 0; i != std::min(ThisWords, RHSWords); ++i) |
| 521 | if ((Bits[i] & ~RHS.Bits[i]) != 0) |
| 522 | return true; |
| 523 | |
| 524 | for (; i != ThisWords ; ++i) |
| 525 | if (Bits[i] != 0) |
| 526 | return true; |
| 527 | |
| 528 | return false; |
| 529 | } |
| 530 | |
| 531 | template <class F, class... ArgTys> |
| 532 | static BitVector &apply(F &&f, BitVector &Out, BitVector const &Arg, |
| 533 | ArgTys const &...Args) { |
| 534 | assert(llvm::all_of(((void)0) |
| 535 | std::initializer_list<unsigned>{Args.size()...},((void)0) |
| 536 | [&Arg](auto const &BV) { return Arg.size() == BV; }) &&((void)0) |
| 537 | "consistent sizes")((void)0); |
| 538 | Out.resize(Arg.size()); |
| 539 | for (size_t i = 0, e = Arg.Bits.size(); i != e; ++i) |
| 540 | Out.Bits[i] = f(Arg.Bits[i], Args.Bits[i]...); |
| 541 | Out.clear_unused_bits(); |
| 542 | return Out; |
| 543 | } |
| 544 | |
| 545 | BitVector &operator|=(const BitVector &RHS) { |
| 546 | if (size() < RHS.size()) |
| 547 | resize(RHS.size()); |
| 548 | for (size_t i = 0, e = RHS.Bits.size(); i != e; ++i) |
| 549 | Bits[i] |= RHS.Bits[i]; |
| 550 | return *this; |
| 551 | } |
| 552 | |
| 553 | BitVector &operator^=(const BitVector &RHS) { |
| 554 | if (size() < RHS.size()) |
| 555 | resize(RHS.size()); |
| 556 | for (size_t i = 0, e = RHS.Bits.size(); i != e; ++i) |
| 557 | Bits[i] ^= RHS.Bits[i]; |
| 558 | return *this; |
| 559 | } |
| 560 | |
| 561 | BitVector &operator>>=(unsigned N) { |
| 562 | assert(N <= Size)((void)0); |
| 563 | if (LLVM_UNLIKELY(empty() || N == 0)__builtin_expect((bool)(empty() || N == 0), false)) |
| 564 | return *this; |
| 565 | |
| 566 | unsigned NumWords = Bits.size(); |
| 567 | assert(NumWords >= 1)((void)0); |
| 568 | |
| 569 | wordShr(N / BITWORD_SIZE); |
| 570 | |
| 571 | unsigned BitDistance = N % BITWORD_SIZE; |
| 572 | if (BitDistance == 0) |
| 573 | return *this; |
| 574 | |
| 575 | // When the shift size is not a multiple of the word size, then we have |
| 576 | // a tricky situation where each word in succession needs to extract some |
| 577 | // of the bits from the next word and or them into this word while |
| 578 | // shifting this word to make room for the new bits. This has to be done |
| 579 | // for every word in the array. |
| 580 | |
| 581 | // Since we're shifting each word right, some bits will fall off the end |
| 582 | // of each word to the right, and empty space will be created on the left. |
| 583 | // The final word in the array will lose bits permanently, so starting at |
| 584 | // the beginning, work forwards shifting each word to the right, and |
| 585 | // OR'ing in the bits from the end of the next word to the beginning of |
| 586 | // the current word. |
| 587 | |
| 588 | // Example: |
| 589 | // Starting with {0xAABBCCDD, 0xEEFF0011, 0x22334455} and shifting right |
| 590 | // by 4 bits. |
| 591 | // Step 1: Word[0] >>= 4 ; 0x0ABBCCDD |
| 592 | // Step 2: Word[0] |= 0x10000000 ; 0x1ABBCCDD |
| 593 | // Step 3: Word[1] >>= 4 ; 0x0EEFF001 |
| 594 | // Step 4: Word[1] |= 0x50000000 ; 0x5EEFF001 |
| 595 | // Step 5: Word[2] >>= 4 ; 0x02334455 |
| 596 | // Result: { 0x1ABBCCDD, 0x5EEFF001, 0x02334455 } |
| 597 | const BitWord Mask = maskTrailingOnes<BitWord>(BitDistance); |
| 598 | const unsigned LSH = BITWORD_SIZE - BitDistance; |
| 599 | |
| 600 | for (unsigned I = 0; I < NumWords - 1; ++I) { |
| 601 | Bits[I] >>= BitDistance; |
| 602 | Bits[I] |= (Bits[I + 1] & Mask) << LSH; |
| 603 | } |
| 604 | |
| 605 | Bits[NumWords - 1] >>= BitDistance; |
| 606 | |
| 607 | return *this; |
| 608 | } |
| 609 | |
| 610 | BitVector &operator<<=(unsigned N) { |
| 611 | assert(N <= Size)((void)0); |
| 612 | if (LLVM_UNLIKELY(empty() || N == 0)__builtin_expect((bool)(empty() || N == 0), false)) |
| 613 | return *this; |
| 614 | |
| 615 | unsigned NumWords = Bits.size(); |
| 616 | assert(NumWords >= 1)((void)0); |
| 617 | |
| 618 | wordShl(N / BITWORD_SIZE); |
| 619 | |
| 620 | unsigned BitDistance = N % BITWORD_SIZE; |
| 621 | if (BitDistance == 0) |
| 622 | return *this; |
| 623 | |
| 624 | // When the shift size is not a multiple of the word size, then we have |
| 625 | // a tricky situation where each word in succession needs to extract some |
| 626 | // of the bits from the previous word and or them into this word while |
| 627 | // shifting this word to make room for the new bits. This has to be done |
| 628 | // for every word in the array. This is similar to the algorithm outlined |
| 629 | // in operator>>=, but backwards. |
| 630 | |
| 631 | // Since we're shifting each word left, some bits will fall off the end |
| 632 | // of each word to the left, and empty space will be created on the right. |
| 633 | // The first word in the array will lose bits permanently, so starting at |
| 634 | // the end, work backwards shifting each word to the left, and OR'ing |
| 635 | // in the bits from the end of the next word to the beginning of the |
| 636 | // current word. |
| 637 | |
| 638 | // Example: |
| 639 | // Starting with {0xAABBCCDD, 0xEEFF0011, 0x22334455} and shifting left |
| 640 | // by 4 bits. |
| 641 | // Step 1: Word[2] <<= 4 ; 0x23344550 |
| 642 | // Step 2: Word[2] |= 0x0000000E ; 0x2334455E |
| 643 | // Step 3: Word[1] <<= 4 ; 0xEFF00110 |
| 644 | // Step 4: Word[1] |= 0x0000000A ; 0xEFF0011A |
| 645 | // Step 5: Word[0] <<= 4 ; 0xABBCCDD0 |
| 646 | // Result: { 0xABBCCDD0, 0xEFF0011A, 0x2334455E } |
| 647 | const BitWord Mask = maskLeadingOnes<BitWord>(BitDistance); |
| 648 | const unsigned RSH = BITWORD_SIZE - BitDistance; |
| 649 | |
| 650 | for (int I = NumWords - 1; I > 0; --I) { |
| 651 | Bits[I] <<= BitDistance; |
| 652 | Bits[I] |= (Bits[I - 1] & Mask) >> RSH; |
| 653 | } |
| 654 | Bits[0] <<= BitDistance; |
| 655 | clear_unused_bits(); |
| 656 | |
| 657 | return *this; |
| 658 | } |
| 659 | |
| 660 | void swap(BitVector &RHS) { |
| 661 | std::swap(Bits, RHS.Bits); |
| 662 | std::swap(Size, RHS.Size); |
| 663 | } |
| 664 | |
| 665 | void invalid() { |
| 666 | assert(!Size && Bits.empty())((void)0); |
| 667 | Size = (unsigned)-1; |
| 668 | } |
| 669 | bool isInvalid() const { return Size == (unsigned)-1; } |
| 670 | |
| 671 | ArrayRef<BitWord> getData() const { return {&Bits[0], Bits.size()}; } |
| 672 | |
| 673 | //===--------------------------------------------------------------------===// |
| 674 | // Portable bit mask operations. |
| 675 | //===--------------------------------------------------------------------===// |
| 676 | // |
| 677 | // These methods all operate on arrays of uint32_t, each holding 32 bits. The |
| 678 | // fixed word size makes it easier to work with literal bit vector constants |
| 679 | // in portable code. |
| 680 | // |
| 681 | // The LSB in each word is the lowest numbered bit. The size of a portable |
| 682 | // bit mask is always a whole multiple of 32 bits. If no bit mask size is |
| 683 | // given, the bit mask is assumed to cover the entire BitVector. |
| 684 | |
| 685 | /// setBitsInMask - Add '1' bits from Mask to this vector. Don't resize. |
| 686 | /// This computes "*this |= Mask". |
| 687 | void setBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { |
| 688 | applyMask<true, false>(Mask, MaskWords); |
| 689 | } |
| 690 | |
| 691 | /// clearBitsInMask - Clear any bits in this vector that are set in Mask. |
| 692 | /// Don't resize. This computes "*this &= ~Mask". |
| 693 | void clearBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { |
| 694 | applyMask<false, false>(Mask, MaskWords); |
| 695 | } |
| 696 | |
| 697 | /// setBitsNotInMask - Add a bit to this vector for every '0' bit in Mask. |
| 698 | /// Don't resize. This computes "*this |= ~Mask". |
| 699 | void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { |
| 700 | applyMask<true, true>(Mask, MaskWords); |
| 701 | } |
| 702 | |
| 703 | /// clearBitsNotInMask - Clear a bit in this vector for every '0' bit in Mask. |
| 704 | /// Don't resize. This computes "*this &= Mask". |
| 705 | void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { |
| 706 | applyMask<false, true>(Mask, MaskWords); |
| 707 | } |
| 708 | |
| 709 | private: |
| 710 | /// Perform a logical left shift of \p Count words by moving everything |
| 711 | /// \p Count words to the right in memory. |
| 712 | /// |
| 713 | /// While confusing, words are stored from least significant at Bits[0] to |
| 714 | /// most significant at Bits[NumWords-1]. A logical shift left, however, |
| 715 | /// moves the current least significant bit to a higher logical index, and |
| 716 | /// fills the previous least significant bits with 0. Thus, we actually |
| 717 | /// need to move the bytes of the memory to the right, not to the left. |
| 718 | /// Example: |
| 719 | /// Words = [0xBBBBAAAA, 0xDDDDFFFF, 0x00000000, 0xDDDD0000] |
| 720 | /// represents a BitVector where 0xBBBBAAAA contain the least significant |
| 721 | /// bits. So if we want to shift the BitVector left by 2 words, we need |
| 722 | /// to turn this into 0x00000000 0x00000000 0xBBBBAAAA 0xDDDDFFFF by using a |
| 723 | /// memmove which moves right, not left. |
| 724 | void wordShl(uint32_t Count) { |
| 725 | if (Count == 0) |
| 726 | return; |
| 727 | |
| 728 | uint32_t NumWords = Bits.size(); |
| 729 | |
| 730 | // Since we always move Word-sized chunks of data with src and dest both |
| 731 | // aligned to a word-boundary, we don't need to worry about endianness |
| 732 | // here. |
| 733 | std::copy(Bits.begin(), Bits.begin() + NumWords - Count, |
| 734 | Bits.begin() + Count); |
| 735 | std::fill(Bits.begin(), Bits.begin() + Count, 0); |
| 736 | clear_unused_bits(); |
| 737 | } |
| 738 | |
| 739 | /// Perform a logical right shift of \p Count words by moving those |
| 740 | /// words to the left in memory. See wordShl for more information. |
| 741 | /// |
| 742 | void wordShr(uint32_t Count) { |
| 743 | if (Count == 0) |
| 744 | return; |
| 745 | |
| 746 | uint32_t NumWords = Bits.size(); |
| 747 | |
| 748 | std::copy(Bits.begin() + Count, Bits.begin() + NumWords, Bits.begin()); |
| 749 | std::fill(Bits.begin() + NumWords - Count, Bits.begin() + NumWords, 0); |
| 750 | } |
| 751 | |
| 752 | int next_unset_in_word(int WordIndex, BitWord Word) const { |
| 753 | unsigned Result = WordIndex * BITWORD_SIZE + countTrailingOnes(Word); |
| 754 | return Result < size() ? Result : -1; |
| 755 | } |
| 756 | |
| 757 | unsigned NumBitWords(unsigned S) const { |
| 758 | return (S + BITWORD_SIZE-1) / BITWORD_SIZE; |
| 759 | } |
| 760 | |
| 761 | // Set the unused bits in the high words. |
| 762 | void set_unused_bits(bool t = true) { |
| 763 | // Then set any stray high bits of the last used word. |
| 764 | if (unsigned ExtraBits = Size % BITWORD_SIZE) { |
| 765 | BitWord ExtraBitMask = ~BitWord(0) << ExtraBits; |
| 766 | if (t) |
| 767 | Bits.back() |= ExtraBitMask; |
| 768 | else |
| 769 | Bits.back() &= ~ExtraBitMask; |
| 770 | } |
| 771 | } |
| 772 | |
| 773 | // Clear the unused bits in the high words. |
| 774 | void clear_unused_bits() { |
| 775 | set_unused_bits(false); |
| 776 | } |
| 777 | |
| 778 | void init_words(bool t) { |
| 779 | std::fill(Bits.begin(), Bits.end(), 0 - (BitWord)t); |
| 780 | } |
| 781 | |
| 782 | template<bool AddBits, bool InvertMask> |
| 783 | void applyMask(const uint32_t *Mask, unsigned MaskWords) { |
| 784 | static_assert(BITWORD_SIZE % 32 == 0, "Unsupported BitWord size."); |
| 785 | MaskWords = std::min(MaskWords, (size() + 31) / 32); |
| 786 | const unsigned Scale = BITWORD_SIZE / 32; |
| 787 | unsigned i; |
| 788 | for (i = 0; MaskWords >= Scale; ++i, MaskWords -= Scale) { |
| 789 | BitWord BW = Bits[i]; |
| 790 | // This inner loop should unroll completely when BITWORD_SIZE > 32. |
| 791 | for (unsigned b = 0; b != BITWORD_SIZE; b += 32) { |
| 792 | uint32_t M = *Mask++; |
| 793 | if (InvertMask) M = ~M; |
| 794 | if (AddBits) BW |= BitWord(M) << b; |
| 795 | else BW &= ~(BitWord(M) << b); |
| 796 | } |
| 797 | Bits[i] = BW; |
| 798 | } |
| 799 | for (unsigned b = 0; MaskWords; b += 32, --MaskWords) { |
| 800 | uint32_t M = *Mask++; |
| 801 | if (InvertMask) M = ~M; |
| 802 | if (AddBits) Bits[i] |= BitWord(M) << b; |
| 803 | else Bits[i] &= ~(BitWord(M) << b); |
| 804 | } |
| 805 | if (AddBits) |
| 806 | clear_unused_bits(); |
| 807 | } |
| 808 | |
| 809 | public: |
| 810 | /// Return the size (in bytes) of the bit vector. |
| 811 | size_t getMemorySize() const { return Bits.size() * sizeof(BitWord); } |
| 812 | size_t getBitCapacity() const { return Bits.size() * BITWORD_SIZE; } |
| 813 | }; |
| 814 | |
| 815 | inline size_t capacity_in_bytes(const BitVector &X) { |
| 816 | return X.getMemorySize(); |
| 817 | } |
| 818 | |
| 819 | template <> struct DenseMapInfo<BitVector> { |
| 820 | static inline BitVector getEmptyKey() { return {}; } |
| 821 | static inline BitVector getTombstoneKey() { |
| 822 | BitVector V; |
| 823 | V.invalid(); |
| 824 | return V; |
| 825 | } |
| 826 | static unsigned getHashValue(const BitVector &V) { |
| 827 | return DenseMapInfo<std::pair<unsigned, ArrayRef<uintptr_t>>>::getHashValue( |
| 828 | std::make_pair(V.size(), V.getData())); |
| 829 | } |
| 830 | static bool isEqual(const BitVector &LHS, const BitVector &RHS) { |
| 831 | if (LHS.isInvalid() || RHS.isInvalid()) |
| 832 | return LHS.isInvalid() == RHS.isInvalid(); |
| 833 | return LHS == RHS; |
| 834 | } |
| 835 | }; |
| 836 | } // end namespace llvm |
| 837 | |
| 838 | namespace std { |
| 839 | /// Implement std::swap in terms of BitVector swap. |
| 840 | inline void swap(llvm::BitVector &LHS, llvm::BitVector &RHS) { LHS.swap(RHS); } |
| 841 | } // end namespace std |
| 842 | |
| 843 | #endif // LLVM_ADT_BITVECTOR_H |