[llvm-commits] SSI patch
Andre Tavares
andrelct at dcc.ufmg.br
Fri Jun 26 06:34:43 PDT 2009
Hey Nick, Thanks for your response, my comments are below.
Nick Lewycky wrote:
> I haven't looked closely at the algorithm yet. What jumped out were a
> number of stylistic concerns, first of all. We have a number of ADTs
> in LLVM that we like more than C++ STL ones (see
> http://llvm.org/docs/ProgrammersManual.html for why). You should use
> SmallVector instead of std::vector&. For example,
> "SSI::createSSI(SmallVectorImpl<Instruction *> value) {", or possibly
> make it take an Instruction** and a size. Similarly, std::set is
> horrible in general, you should make SSI::created be a
> SmallPtrSet<Instruction*, 16>. (Or remove SSI::created entirely in
> favour of making createSSI take a set and tell the caller they're not
> allowed to call createSSI on the same value twice.)
>
Changed them all from <vector> to SmallVector, and so on. I need
SSI::created to have a record of what variables I have transformed to
SSI, and if another pass asks to transform it, I will be able to not do
anything because I already know it was transformed before. Without this
I would have to try to transform it and see that it is not possible.
> You declare some global constants which should at least also be
> static. You shouldn't evaluate X->size() on every iteration of a loop;
> for example the "for" statement in isUsedInTerminator should be
> written like "for (unsigned i = 0, e = TI->getNumOperands(); i != e;
> ++i) {". This is done in a few other places as well.
>
Totally agree. Fixed them all.
> Some of your comments (SSI::insertPhiFunctions) are missing a space
> after // and before the text. Please add it where missing.
>
Fixed.
> // TODO: We do modify the programs code, but we do not know which
> // Passes we break.
> void SSI::getAnalysisUsage(AnalysisUsage &AU) const {
> AU.addRequired<DominanceFrontier> ();
> AU.addRequired<DominatorTree> ();
> AU.setPreservesAll();
> }
>
> If you don't know what you preserve, don't preserve anything. I think
> your pass preserves the CFG (you don't modify any TerminatorInsts) so
> you can mark it AU.setPreservesCFG().
>
> bool SSI::runOnFunction(Function &F) {
> DT_ = &getAnalysis<DominatorTree> ();
> return false;
> }
>
> This runOnFunction doesn't transform anything. That means that if I
> run "opt -ssi_and_pass" over a .bc then no transform or analysis will
> happen. That's okay -- opt -scalar-evolution does the same thing --
> but if you do this you should also supply a print() method where the
> pass dumps out what it would have done (the results of its analysis on
> every variable, in scalar-evolutions case). You can then read it with
> "opt -analyze -ssi_and_pass".
>
> /// Test if the BasicBlock BB dominates any use or definition of value.
> ///
> bool SSI::dominateAny(BasicBlock * BB, Instruction * value) {
> Value::use_iterator begin = value->use_begin();
> Value::use_iterator end = value->use_end();
> for (; begin != end; ++begin) {
> Instruction * I = dyn_cast<Instruction> (*begin);
>
> Use cast<Instruction> instead of dyn_cast<Instruction> since we know
> in advance that it must be an Instruction.
>
> BasicBlock * BB_father = I->getParent();
> if (DT_->dominates(BB, BB_father)) {
> return true;
> }
> }
> return false;
> }
Fixed dyn_cast.
>
> So overall this looks like a good start. I think we may want to move
> createSSI out of the pass and into its own
> lib/Transforms/Utils/SSI.cpp which takes the DominatorTree* and
> DominatorFrontier*. This method could then be called from any pass
> without having to declare it in advance in its own analysis usage.
> Then the SSI pass would then exist for testing purposes; it could do
> something like either collect the sensible instructions or maybe just
> all non-void instructions and run createSSI over them.
>
Nick, instead of moving only createSSI out of the pass, why don't we
move SSI Pass to lib/Transforms/Utils/, and make it an utility class
instead of a Pass? With this, we would not need to worry about
getAnalysisUsage.
If we decide to make it an utility class, should I put all content in a
.h file and forget about the .cpp?
> I'll try to do a more thorough review soon.
>
> Nick
>
> 2009/6/25 Andre Tavares <andrelct at dcc.ufmg.br
> <mailto:andrelct at dcc.ufmg.br>>
>
> Hello,
>
> I'm submiting a patch that will be responsible to create SSI
> representation on demand. This representation conforms with the
> current SSA, and will not break other optimizations. It only
> inserts some phi functions on the code. A brief description is
> below, and the code is attached.
>
> // This pass converts a list of variables to the Static Single
> Information
> // form. This is a program representation described by Scott
> Ananian in his
> // Master Thesis: "The Static Single Information Form (1999)".
> // We are building an on-demand representation, that is, we do not
> convert
> // every single variable in the target function to SSI form.
> Rather, we receive
> // a list of target variables that must be converted. We also do not
> // completely convert a target variable to the SSI format.
> Instead, we only
> // change the variable in the points where new information can be
> attached
> // to its live range, that is, at branch points.
>
> --
> Andre Tavares
> Master Student in Computer Science - UFMG - Brasil
> http://dcc.ufmg.br/~andrelct <http://dcc.ufmg.br/%7Eandrelct>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Andre Tavares
Master Student in Computer Science - UFMG - Brasil
http://dcc.ufmg.br/~andrelct
More information about the llvm-commits
mailing list