[llvm-commits] [LLVMdev] SSI Patch
Nick Lewycky
nicholas at mxc.ca
Fri Sep 18 01:04:06 PDT 2009
Andre Tavares wrote:
> I made all changes. Hope it is good now.
// Treat SSI_PHI
if (Variable *var = getVarFromPhi(PN)) {
var->addValueStack(PN);
defined.insert(var);
}
// Treat SSI_SIG
else if (Variable *var = getVarFromPhi(PN)) {
substituteUse(I);
var->addValueStack(PN);
defined.insert(var);
}
Those are both testing getVarFromPhi. Should the second one be
getVarFromSigma instead?
And since we have to make one change, we may as well make others :)
for (unsigned i = 0, e = PN->getNumIncomingValues(); i<e ; ++i) {
Whitespace.
if (PHINode *PN_inc = dyn_cast<PHINode>(inc)) {
if (isSigPhi(PN_inc, I, Set))
continue;
return false;
}
return false;
}
Isn't that just:
Value *PN_inc = dyn_cast<PHINode>(inc);
if (!PN_inc || !isSigPhi(PN_inc, I, Set))
return false;
}
given that the final } is closing the loop?
Finally, 'isSigPhi' is an ambiguous name. Perhaps it should be named
'isSigma'?
Nick
> Nick Lewycky wrote:
>> Andre Tavares wrote:
>>> Next step:
>>>
>>> There was that list of all variables converted to SSI. I decided to
>>> remove it as you guys didn't like to have list holding memory. Now
>>> insertSigma tests if a sigma is already there before it inserts any.
>>
>> + for (; begin != notphi; ++begin) {
>> + PHINode *PN = cast<PHINode>(begin);
>> + SmallPtrSet<PHINode *, 16> *Set = new SmallPtrSet<PHINode *, 16>();
>> + if (isSigPhi(PN, I, Set)) {
>> + delete(Set);
>> + return PN;
>> }
>> }
>>
>> Please don't do that. The point of SmallSet/SmallVector is that they
>> allocate the number of entries in the template parameter on the stack
>> so as to avoid extra malloc traffic. 'new SmallPtrSet' defeats that
>> entirely. You can simply declare it on the stack before the loop and
>> clear it in between each run of the loop with Set.clear();.
>>
>> Same thing again in findPhi().
>>
>> + // BB has one predecessor, BB cannot have phis.
>> + if (BB->getSinglePredecessor() != NULL || I == NULL)
>> + return NULL;
>>
>> Do you expect callers to pass NULL in as the Instruction? If not, you
>> could use an assert that I is not NULL.
>>
>> + delete(Set);
>>
>> You don't need the parenthesis.
>>
>> + if ((var = getVarFromPhi(PN)) != NULL) {
>>
>> You don't need the "!= NULL" part, it's implicit. Also, since you're
>> not using var outside this if, please declare it in the expression
>> like so:
>>
>> if (Variable *var = getVarFromPhi(PN)) {
>>
>> Same thing again for SSI_SIG right below it.
>>
>> +/// Test if PN is a Sigma or Phi from instruction I. This function
>> returns
>> +/// true if all operands of PN lead to I. Its is necessary to keep a
>> set of
>> +/// visited PNs (Set), in case there is a loop in Sigma and Phi
>> functions.
>> +///
>>
>> "Its necessary" -> It's necessary
>>
>> +bool SSI::isSigPhi(PHINode *PN, Instruction *I,
>> + SmallPtrSet<PHINode *, 16> *Set) {
>>
>> Not a huge deal, but Set could be a reference here. Alternately I
>> think you could use "SmallPtrImpl<PHINode *> *Set" which would remove
>> the restatement of the 16. I not sure whether you can do both changes
>> though.
>>
>> Please indent 'SmallPtrSet<...' to line up with the 'PHINode *PN...'
>> above it.
>>
>> + Set->insert(PN);
>>
>> You want to return if it's already in the set, right? That makes it
>> "if (!Set->insert(PN)) return ?;".
>>
>> + for (unsigned i=0, e=PN->getNumIncomingValues(); i<e ; ++i) {
>>
>> Please put spaces around your = and < signs, and no space before
>> semicolons.
>>
>> + Value *inc = PN->getIncomingValue(i);
>> + if (inc == I)
>> + continue;
>> + else if (PHINode *PN_inc = dyn_cast<PHINode>(inc)) {
>> + if ((Set->count(PN_inc) || isSigPhi(PN_inc, I, Set)))
>> + continue;
>> + else
>> + return false;
>> + } else
>> + return false;
>> + }
>>
>> If you have an if-statement which causes control-flow to move
>> elsewhere (like "return" or "continue") then don't follow it up with
>> an else-if. Just write another if statement afterwards.
>> http://llvm.org/docs/CodingStandards.html#hl_else_after_return
>>
>> +SSI::Variable * SSI::getVarFromPhi(PHINode *PN) {
>>
>> No space after the *
>>
>> + DenseMap<PHINode *, Variable *>::iterator val = phis.find(PN);
>> if (val == phis.end())
>> - return UNSIGNED_INFINITE;
>> + return NULL;
>> else
>> return val->second;
>>
>> Again, same problem: no else after return. (Yes, I realize it was
>> there before your patch. Please fix it anyways.)
>>
>> +void SSI::init(SmallPtrSet<Instruction *, 16> &v) {
>> + SmallPtrSetIterator<Instruction *> begin = v.begin();
>> + SmallPtrSetIterator<Instruction *> end = v.end();
>> + for (; begin != end; ++begin) {
>> + Instruction *I= *begin;
>>
>> Spaces around the = sign.
>>
>> + variables.push_back(new Variable(I));
>> }
>>
>> /// Clean all used resources in this creation of SSI
>> ///
>> void SSI::clean() {
>> - for (unsigned i = 0; i < num_values; ++i) {
>> - defsites[i].clear();
>> - if (i < value_stack.size())
>> - value_stack[i].clear();
>> + for (unsigned i = 0; i < variables.size(); ++i) {
>> + variables[i]->clear();
>> + delete variables[i];
>> }
>>
>> You don't need to call clear() on a Variable before deleting it. They
>> don't hold any pointers so they'll clean up cleanly during normal
>> destruction.
>>
>> + Variable(Instruction *v) {
>> + value = v;
>> + need = false;
>> + def_sites.push_back(value->getParent());
>> + value_stack.push_back(value);
>> + }
>>
>> Please use the initializer syntax for 'value' and 'need'.
>>
>> + bool needConstruction() {return need;}
>> + Instruction *getValue() {return value;}
>> + unsigned defSitesSize() {return def_sites.size();}
>> [...]
>>
>> Needs spaces around braces.
>>
>> + bool isSigPhi(PHINode *PN, Instruction *I,
>> + SmallPtrSet<PHINode *, 16> *Set);
>>
>> Again, indentation of SmallPtrSet should line up with PHINode.
>>
>> + bool hasDefinition(Variable *var, BasicBlock *BB);
>>
>> bool isDefinedIn(), maybe?
>>
>> + Variable *getVarFromPhi(PHINode *PN);
>> + Variable *getVarFromSigma(PHINode *PN);
>>
>> Nick
>>
>>> Andre Tavares wrote:
>>>> Missed that. Thanks.
>>>>
>>>> I will submit the next one today.
>>>>
>>>> Nick Lewycky wrote:
>>>>
>>>>> Andre Tavares wrote:
>>>>>
>>>>>> It is in its method now.
>>>>>>
>>>>> I noticed that insertSigma() still used 'unsigned j' when it didn't
>>>>> have to (it used to use 'j' instead of 'i' because 'i' was used in
>>>>> an outer loop). I changed that and committed it. Thanks!
>>>>>
>>>>> Nick
>>>>>
>>>>>
>>>>>> Nick Lewycky wrote:
>>>>>>
>>>>>>> Andre Tavares wrote:
>>>>>>>
>>>>>>>> I tried to make 5 separate patches, but as they are
>>>>>>>> constructive, they had information from the last one. So I will
>>>>>>>> post one by one as it gets on the tree.
>>>>>>>>
>>>>>>>> 1. We had a function isUsedInTerminator that tested if a
>>>>>>>> comparator was used in the terminator of its parent BasicBlock.
>>>>>>>> This is wrong because a comparator can be created in a
>>>>>>>> BasicBlock and used in the terminator of other BasicBlock, and
>>>>>>>> can be used in more than one.
>>>>>>>>
>>>>>>> + for (unsigned j = 0, e = TI->getNumSuccessors(); j <
>>>>>>> e; ++j) {
>>>>>>> + // Next Basic Block
>>>>>>> + BasicBlock *BB_next = TI->getSuccessor(j);
>>>>>>> + if (BB_next != BB &&
>>>>>>> + BB_next->getSinglePredecessor() != NULL &&
>>>>>>> + dominateAny(BB_next, value[i])) {
>>>>>>> + PHINode *PN = PHINode::Create(
>>>>>>> + value[i]->getType(), SSI_SIG,
>>>>>>> BB_next->begin());
>>>>>>> + PN->addIncoming(value[i], BB);
>>>>>>> + sigmas.insert(std::make_pair(PN, i));
>>>>>>> + created.insert(PN);
>>>>>>> + need = true;
>>>>>>> + defsites[i].push_back(BB_next);
>>>>>>> + ++NumSigmaInserted;
>>>>>>> + }
>>>>>>> + }
>>>>>>>
>>>>>>> Please break this out into its own method. Otherwise, this looks
>>>>>>> fine to me.
>>>>>>>
>>>>>>> Nick
>>>>>>>
>>>>>>>
>>>>>> ------------------------------------------------------------------------
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> llvm-commits mailing list
>>>>>> 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
>>
>>
>>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list