10b57cec5SDimitry Andric //===- ProvenanceAnalysisEvaluator.cpp - ObjC ARC Optimization ------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "ProvenanceAnalysis.h" 10bdd1243dSDimitry Andric #include "llvm/Transforms/ObjCARC.h" 110b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h" 120b57cec5SDimitry Andric #include "llvm/Analysis/AliasAnalysis.h" 130b57cec5SDimitry Andric #include "llvm/IR/Function.h" 140b57cec5SDimitry Andric #include "llvm/IR/InstIterator.h" 150b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric using namespace llvm; 180b57cec5SDimitry Andric using namespace llvm::objcarc; 190b57cec5SDimitry Andric getName(Value * V)200b57cec5SDimitry Andricstatic StringRef getName(Value *V) { 210b57cec5SDimitry Andric StringRef Name = V->getName(); 22*5f757f3fSDimitry Andric if (Name.starts_with("\1")) 230b57cec5SDimitry Andric return Name.substr(1); 240b57cec5SDimitry Andric return Name; 250b57cec5SDimitry Andric } 260b57cec5SDimitry Andric insertIfNamed(SetVector<Value * > & Values,Value * V)270b57cec5SDimitry Andricstatic void insertIfNamed(SetVector<Value *> &Values, Value *V) { 280b57cec5SDimitry Andric if (!V->hasName()) 290b57cec5SDimitry Andric return; 300b57cec5SDimitry Andric Values.insert(V); 310b57cec5SDimitry Andric } 320b57cec5SDimitry Andric run(Function & F,FunctionAnalysisManager & AM)33bdd1243dSDimitry AndricPreservedAnalyses PAEvalPass::run(Function &F, FunctionAnalysisManager &AM) { 340b57cec5SDimitry Andric SetVector<Value *> Values; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric for (auto &Arg : F.args()) 370b57cec5SDimitry Andric insertIfNamed(Values, &Arg); 380b57cec5SDimitry Andric 39349cc55cSDimitry Andric for (Instruction &I : instructions(F)) { 40349cc55cSDimitry Andric insertIfNamed(Values, &I); 410b57cec5SDimitry Andric 42349cc55cSDimitry Andric for (auto &Op : I.operands()) 430b57cec5SDimitry Andric insertIfNamed(Values, Op); 440b57cec5SDimitry Andric } 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric ProvenanceAnalysis PA; 47bdd1243dSDimitry Andric PA.setAA(&AM.getResult<AAManager>(F)); 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric for (Value *V1 : Values) { 500b57cec5SDimitry Andric StringRef NameV1 = getName(V1); 510b57cec5SDimitry Andric for (Value *V2 : Values) { 520b57cec5SDimitry Andric StringRef NameV2 = getName(V2); 530b57cec5SDimitry Andric if (NameV1 >= NameV2) 540b57cec5SDimitry Andric continue; 550b57cec5SDimitry Andric errs() << NameV1 << " and " << NameV2; 56e8d8bef9SDimitry Andric if (PA.related(V1, V2)) 570b57cec5SDimitry Andric errs() << " are related.\n"; 580b57cec5SDimitry Andric else 590b57cec5SDimitry Andric errs() << " are not related.\n"; 600b57cec5SDimitry Andric } 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric 63bdd1243dSDimitry Andric return PreservedAnalyses::all(); 640b57cec5SDimitry Andric } 65