/// getLocForWrite - Return a Location stored to by the specified instruction. /// If isRemovable returns true, this function and getLocForRead completely /// describe the memory operations for this instruction. static AliasAnalysis::Location getLocForWrite(Instruction *Inst, AliasAnalysis &AA) { const DataLayout *DL = AA.getDataLayout(); if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) return AA.getLocation(SI); if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(Inst)) { // memcpy/memmove/memset. AliasAnalysis::Location Loc = AA.getLocationForDest(MI); // If we don't have target data around, an unknown size in Location means // that we should use the size of the pointee type. This isn't valid for // memset/memcpy, which writes more than an i8. if (Loc.Size == AliasAnalysis::UnknownSize && DL == nullptr) return AliasAnalysis::Location(); return Loc; } IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst); if (!II) return AliasAnalysis::Location(); switch (II->getIntrinsicID()) { default: return AliasAnalysis::Location(); // Unhandled intrinsic. case Intrinsic::init_trampoline: // If we don't have target data around, an unknown size in Location means // that we should use the size of the pointee type. This isn't valid for // init.trampoline, which writes more than an i8. if (!DL) return AliasAnalysis::Location(); // FIXME: We don't know the size of the trampoline, so we can't really // handle it here. return AliasAnalysis::Location(II->getArgOperand(0)); case Intrinsic::lifetime_end: { uint64_t Len = cast<ConstantInt>(II->getArgOperand(0))->getZExtValue(); return AliasAnalysis::Location(II->getArgOperand(1), Len); } } }
void DataDependence::processDepResult(Instruction *inst, MemoryDependenceAnalysis &MDA, AliasAnalysis &AA) { // TODO: This is probably a good place to check of the dependency // information is calculated on-demand MemDepResult Res = MDA.getDependency(inst); if (!Res.isNonLocal()) { // local results (not-non-local) can be simply handled. They are just // a pair of insturctions and a dependency type // Get dependency information DepInfo newInfo; newInfo = getDepInfo(Res); #ifdef MK_DEBUG //errs() << "[DEBUG] newInfo depInst == " << Res.getInst() << '\n'; if (Res.getInst() == NULL) { errs() << "[DEBUG] NULL dependency found, dep type: " << depTypeToString(newInfo.Type_) << '\n'; } #endif // Save into map assert(newInfo.valid()); LocalDeps_[inst] = newInfo; } else { // Handle NonLocal dependencies. The function call // getNonLocalPointerDependency() assumes that a result of NonLocal // has already been encountered // Get dependency information DepInfo newInfo; newInfo = getDepInfo(Res); assert(newInfo.Type_ == NonLocal); assert(Res.isNonLocal()); SmallVector<NonLocalDepResult, 4> NLDep; if (LoadInst *LI = dyn_cast<LoadInst>(inst)) { if (!LI->isUnordered()) { // FIXME: Handle atomic/volatile loads. errs() << "[WARNING] atomic/volatile loads are not handled\n"; assert(false && "atomic/volatile loads not handled"); //Deps[Inst].insert(std::make_pair(getInstTypePair(0, Unknown), //static_cast<BasicBlock *>(0))); return; } AliasAnalysis::Location Loc = AA.getLocation(LI); MDA.getNonLocalPointerDependency(Loc, true, LI->getParent(), NLDep); } else if (StoreInst *SI = dyn_cast<StoreInst>(inst)) { if (!SI->isUnordered()) { // FIXME: Handle atomic/volatile stores. errs() << "[WARNING] atomic/volatile stores are not handled\n"; assert(false && "atomic/volatile stores not handled"); //Deps[Inst].insert(std::make_pair(getInstTypePair(0, Unknown), //static_cast<BasicBlock *>(0))); return; } AliasAnalysis::Location Loc = AA.getLocation(SI); MDA.getNonLocalPointerDependency(Loc, false, SI->getParent(), NLDep); } else if (VAArgInst *VI = dyn_cast<VAArgInst>(inst)) { AliasAnalysis::Location Loc = AA.getLocation(VI); MDA.getNonLocalPointerDependency(Loc, false, VI->getParent(), NLDep); } else { llvm_unreachable("Unknown memory instruction!"); } #ifdef MK_DEBUG errs() << "[DEBUG] NLDep.size() == " << NLDep.size() << '\n'; #endif for (auto I = NLDep.begin(), E = NLDep.end(); I != E; ++I) { NonLocalDeps_[inst].push_back(*I); } } // end else }