Something about the andersens pass

I may have found a bug in the andersends pass, but before I try to strip the code down to something reasonable I'd like to make sure I'm not misunderstanding anything. This is against the current SVN head, on my Mac OS 10.5 box.

1) I'm compiling a bunch of C++ code with llvm-g++ (4.0.1). The compiled code includes the gcc 4.0.1 implementation for dynamic_cast (so it can be inlined).
2) I load the library as a module, and generate some functions that call the llvm-g++ compiled code.
3) I aggressively inline my generated code with a function pass manager, and end up with a monster function.
4) I run the following pass:

  {
     PassManager PM;
     PM.add(new TargetData(*EE->getTargetData()));
     PM.add(createInstructionCombiningPass());
     PM.run(*qModule);
   }

I then run another pass:
   PassManager PM;
   PM.add(new TargetData(*EE->getTargetData()));
   PM.add(createVerifierPass());
   //PM.add(createAndersensPass()); // Seems to break dynamic casts in combo with load value numbering
   PM.add(createLoadValueNumberingPass());
   PM.add(createGCSEPass());
   PM.add(createAggressiveDCEPass());
   PM.add(createDeadInstEliminationPass());
   PM.run(*qModule);

Next, I call my monster function and it works as expected.

But if I uncomment the call to createAndersendsPass() my code fails (because something goes wrong with the dynamic cast).

Is what I'm doing supposed to work? I have I missed something with the pass manager?

Thanks,
Robert Zeh

I then run another pass:
  PassManager PM;
  PM.add(new TargetData(*EE->getTargetData()));
  PM.add(createVerifierPass());
  //PM.add(createAndersensPass()); // Seems to break dynamic casts
in combo with load value numbering
  PM.add(createLoadValueNumberingPass());
  PM.add(createGCSEPass());
  PM.add(createAggressiveDCEPass());
  PM.add(createDeadInstEliminationPass());
  PM.run(*qModule);

Next, I call my monster function and it works as expected.

But if I uncomment the call to createAndersendsPass() my code fails
(because something goes wrong with the dynamic cast).

I don't know if andersen's is considered to be production quality. DannyB, can you comment?

Is what I'm doing supposed to work? I have I missed something with
the pass manager?

Nope, this should work. You might consider using the GVN pass instead of loadvn+gcse though, it is much faster and should be at least as effective.

-Chris