ProvenanceAnalysisEvaluator.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //===- ProvenanceAnalysisEvaluator.cpp - ObjC ARC Optimization ------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "ProvenanceAnalysis.h"
  10. #include "llvm/Pass.h"
  11. #include "llvm/ADT/SetVector.h"
  12. #include "llvm/Analysis/AliasAnalysis.h"
  13. #include "llvm/Analysis/Passes.h"
  14. #include "llvm/IR/InstIterator.h"
  15. #include "llvm/IR/Function.h"
  16. #include "llvm/IR/Module.h"
  17. #include "llvm/Support/raw_ostream.h"
  18. using namespace llvm;
  19. using namespace llvm::objcarc;
  20. namespace {
  21. class PAEval : public FunctionPass {
  22. public:
  23. static char ID;
  24. PAEval();
  25. void getAnalysisUsage(AnalysisUsage &AU) const override;
  26. bool runOnFunction(Function &F) override;
  27. };
  28. }
  29. char PAEval::ID = 0;
  30. PAEval::PAEval() : FunctionPass(ID) {}
  31. void PAEval::getAnalysisUsage(AnalysisUsage &AU) const {
  32. AU.addRequired<AliasAnalysis>();
  33. }
  34. static StringRef getName(Value *V) {
  35. StringRef Name = V->getName();
  36. if (Name.startswith("\1"))
  37. return Name.substr(1);
  38. return Name;
  39. }
  40. static void insertIfNamed(SetVector<Value *> &Values, Value *V) {
  41. if (!V->hasName())
  42. return;
  43. Values.insert(V);
  44. }
  45. bool PAEval::runOnFunction(Function &F) {
  46. SetVector<Value *> Values;
  47. for (auto &Arg : F.args())
  48. insertIfNamed(Values, &Arg);
  49. for (auto I = inst_begin(F), E = inst_end(F); I != E; ++I) {
  50. insertIfNamed(Values, &*I);
  51. for (auto &Op : I->operands())
  52. insertIfNamed(Values, Op);
  53. }
  54. ProvenanceAnalysis PA;
  55. PA.setAA(&getAnalysis<AliasAnalysis>());
  56. const DataLayout &DL = F.getParent()->getDataLayout();
  57. for (Value *V1 : Values) {
  58. StringRef NameV1 = getName(V1);
  59. for (Value *V2 : Values) {
  60. StringRef NameV2 = getName(V2);
  61. if (NameV1 >= NameV2)
  62. continue;
  63. errs() << NameV1 << " and " << NameV2;
  64. if (PA.related(V1, V2, DL))
  65. errs() << " are related.\n";
  66. else
  67. errs() << " are not related.\n";
  68. }
  69. }
  70. return false;
  71. }
  72. FunctionPass *llvm::createPAEvalPass() { return new PAEval(); }
  73. INITIALIZE_PASS_BEGIN(PAEval, "pa-eval",
  74. "Evaluate ProvenanceAnalysis on all pairs", false, true)
  75. INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
  76. INITIALIZE_PASS_END(PAEval, "pa-eval",
  77. "Evaluate ProvenanceAnalysis on all pairs", false, true)