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