Question

I'm attempting to do some alias analysis & other memory inspection. I've written a pointless AliasAnalysis pass (that says everything must alias) to attempt to verify that my pass is getting picked up & run by opt.

I run opt with: opt -load ~/Applications/llvm/lib/MustAA.so -must-aa -aa-eval -debug < trace0.ll -debug-pass=Structure

I see my pass being initialized, but never being called (I see only may alias results).

Any ideas as to what to do to debug this? Or what I'm missing? I've read through http://llvm.org/docs/AliasAnalysis.html and don't see anything that I'm missing.

Here's the full source code of my pass:

#define DEBUG_TYPE "must-aa"
#include "llvm/Pass.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Debug.h"
using namespace llvm;

namespace {
struct EverythingMustAlias : public ImmutablePass, public AliasAnalysis {
  static char ID;
  EverythingMustAlias() : ImmutablePass(ID) {}

  virtual void *getAdjustedAnalysisPointer(AnalysisID ID) {
    errs() << "called getAdjustedAnalysisPointer with " << ID << "\n";
    if (ID == &AliasAnalysis::ID)
      return (AliasAnalysis*)this;
    return this;
  }

  virtual void initializePass() {
    DEBUG(dbgs() << "Initializing everything-must-alias\n");
    InitializeAliasAnalysis(this);
  }

  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
    AliasAnalysis::getAnalysisUsage(AU);
    AU.setPreservesAll();
  }

  virtual AliasResult alias(const Location &LocA, const Location &LocB) {
    DEBUG(dbgs() << "Everything must alias!\n");
    return AliasAnalysis::MustAlias;
  }
};
}

namespace llvm {
void initializeEverythingMustAliasPass(PassRegistry &Registry);
}

char EverythingMustAlias::ID = 0;
static RegisterPass<EverythingMustAlias> A("must-aa", "Everything must alias");
INITIALIZE_AG_PASS(EverythingMustAlias, AliasAnalysis, "must-aa",
                   "Everything must alias", false, true, false)

Running opt as above produces:

Args: opt -load /home/moconnor/Applications/llvm/lib/MustAA.so -must-aa -aa-eval -debug -debug-pass=Structure 
WARNING: You're attempting to print out a bitcode file.
This is inadvisable as it may cause display problems. If
you REALLY want to taste LLVM bitcode first-hand, you
can force output with the `-f' option.

Subtarget features: SSELevel 8, 3DNowLevel 0, 64bit 1
Initializing everything-must-alias
Pass Arguments:  -targetlibinfo -datalayout -notti -basictti -x86tti -no-aa -must-aa -aa-eval -preverify -domtree -verify
Target Library Information
Data Layout
No target information
Target independent code generator's TTI
X86 Target Transform Info
No Alias Analysis (always returns 'may' alias)
Everything must alias
  ModulePass Manager
    FunctionPass Manager
      Exhaustive Alias Analysis Precision Evaluator
      Preliminary module verification
      Dominator Tree Construction
      Module Verifier
===== Alias Analysis Evaluator Report =====
  163 Total Alias Queries Performed
  0 no alias responses (0.0%)
  163 may alias responses (100.0%)
  0 partial alias responses (0.0%)
  0 must alias responses (0.0%)
  Alias Analysis Evaluator Pointer Alias Summary: 0%/100%/0%/0%
  168 Total ModRef Queries Performed
  0 no mod/ref responses (0.0%)
  0 mod responses (0.0%)
  0 ref responses (0.0%)
  168 mod & ref responses (100.0%)
  Alias Analysis Evaluator Mod/Ref Summary: 0%/0%/0%/100%

Note the 163 may alias responses when my pass is returning MustAlias.

Edit: On a suggestion on the mailing list, I added the following member function since my pass uses multiple inheritance. It doesn't seem to change anything or get called.

virtual void *getAdjustedAnalysisPointer(AnalysisID ID) {
  errs() << "called getAdjustedAnalysisPointer with " << ID << "\n";
  if (ID == &AliasAnalysis::ID)
    return (AliasAnalysis*)this;
  return this;
}
Was it helpful?

Solution

I changed:

static RegisterPass<EverythingMustAlias> A("must-aa", "Everything must alias");
INITIALIZE_AG_PASS(EverythingMustAlias, AliasAnalysis, "must-aa",
                   "Everything must alias", false, true, false)

to

static RegisterPass<EverythingMustAlias> X("must-aa", "Everything must alias", false, true);
static RegisterAnalysisGroup<AliasAnalysis> Y(X);

Apparently INITIALIZE_AG_PASS only defines the registration function & so is only useful for a pass that is statically linked into an LLVM executable (or something). RegisterAnalysisGroup is run when this module is dynamically linked in so it is then registered.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top