Thank you. Is it possible to determine the liveout of the operands (see example bellow) ? %5 = add i32 %4, %3 For '%5': i can simply use " i->isUsedOutsideOfBlock() " For '%3' and '%4' : this is the question ...>From your answer, is it possible to determine *which* value is liveout ( inbinary instruction)? On Sat, May 30, 2009 at 2:57 AM, John McCall <rjmccall at apple.com> wrote:> On May 29, 2009, at 11:37 PM, Rotem Varon wrote: > > How can i know, if a value have uses outside of the current basic > > block (liveout), without iterating through all the basic block ? > > If the value is created within the basic block in question, and the > block doesn't loop to itself, then you can just iterate through the > uses and note if the use is an instruction in a different block: > > bool isLiveOut(Instruction* I) { > BasicBlock* I_BB = I->getParent(): > for (Value::use_iterator ui = I->use_begin(), ue = I->use_end(); ui > ! > = ue; ++ui) > if (cast<Instruction>(ui)->getParent() != I_BB) > return true; > } > } > > If the value is created within the block but the block loops to > itself, you can get away with a very slight adjustment: > > if (cast<Instruction>(ui)->getParent() != I_BB && > !isa<PHINode>(ui)) > > If the value is created in one block and you want to know if it's live > out of some dominated block, that's a lot more complicated (and > expensive). > > John. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090530/5254351e/attachment.html>
On May 30, 2009, at 5:03 AM, Rotem Varon wrote:> Is it possible to determine the liveout of the operands (see example > bellow) ? > > %5 = add i32 %4, %3 > > For '%5': i can simply use " i->isUsedOutsideOfBlock() " > For '%3' and '%4' : this is the question ...By definition, operands are live out if they're used in any block that's reachable from the block containing the instruction. Barring a few special cases we've already covered, the easiest way I know to compute that in general is to first calculate the set of reachable blocks, then iterate through the uses, checking whether that use is in a reachable block (if the use is in a PHI node, only count it if the corresponding incoming block is reachable).> From your answer, is it possible to determine which value is liveout > ( in binary instruction)?All of these answers are things you would do for an individual LLVM "Value". I don't know what you mean by "which value" beyond that, and I don't know what you mean by "in binary instruction". John. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090530/b9e13d4a/attachment.html>
I believe Dan has added a pass to compute livein / liveout values. Evan Sent from my iPhone On May 30, 2009, at 5:03 AM, Rotem Varon <varonrotem at gmail.com> wrote:> Thank you. > > Is it possible to determine the liveout of the operands (see example > bellow) ? > > %5 = add i32 %4, %3 > > For '%5': i can simply use " i->isUsedOutsideOfBlock() " > For '%3' and '%4' : this is the question ... > > From your answer, is it possible to determine which value is liveout > ( in binary instruction)? > > > On Sat, May 30, 2009 at 2:57 AM, John McCall <rjmccall at apple.com> > wrote: > On May 29, 2009, at 11:37 PM, Rotem Varon wrote: > > How can i know, if a value have uses outside of the current basic > > block (liveout), without iterating through all the basic block ? > > If the value is created within the basic block in question, and the > block doesn't loop to itself, then you can just iterate through the > uses and note if the use is an instruction in a different block: > > bool isLiveOut(Instruction* I) { > BasicBlock* I_BB = I->getParent(): > for (Value::use_iterator ui = I->use_begin(), ue = I->use_end > (); ui ! > = ue; ++ui) > if (cast<Instruction>(ui)->getParent() != I_BB) > return true; > } > } > > If the value is created within the block but the block loops to > itself, you can get away with a very slight adjustment: > > if (cast<Instruction>(ui)->getParent() != I_BB && ! > isa<PHINode>(ui)) > > If the value is created in one block and you want to know if it's live > out of some dominated block, that's a lot more complicated (and > expensive). > > John. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090530/4218b9f5/attachment.html>
The pass you're referring to is in include/llvm/Analysis/LiveValues.h and lib/Analysis/LiveValues.cpp. It computes conservative approximations for specific liveness queries, rather than full livein/liveout information. It's intended to be used as a heuristic. Dan On May 30, 2009, at 3:51 PM, Evan Cheng wrote:> I believe Dan has added a pass to compute livein / liveout values. > > Evan > > Sent from my iPhone > > On May 30, 2009, at 5:03 AM, Rotem Varon <varonrotem at gmail.com> wrote: > >> Thank you. >> >> Is it possible to determine the liveout of the operands (see >> example bellow) ? >> >> %5 = add i32 %4, %3 >> >> For '%5': i can simply use " i->isUsedOutsideOfBlock() " >> For '%3' and '%4' : this is the question ... >> >> From your answer, is it possible to determine which value is >> liveout ( in binary instruction)? >> >> >> On Sat, May 30, 2009 at 2:57 AM, John McCall <rjmccall at apple.com> >> wrote: >> On May 29, 2009, at 11:37 PM, Rotem Varon wrote: >> > How can i know, if a value have uses outside of the current basic >> > block (liveout), without iterating through all the basic block ? >> >> If the value is created within the basic block in question, and the >> block doesn't loop to itself, then you can just iterate through the >> uses and note if the use is an instruction in a different block: >> >> bool isLiveOut(Instruction* I) { >> BasicBlock* I_BB = I->getParent(): >> for (Value::use_iterator ui = I->use_begin(), ue = I- >> >use_end(); ui ! >> = ue; ++ui) >> if (cast<Instruction>(ui)->getParent() != I_BB) >> return true; >> } >> } >> >> If the value is created within the block but the block loops to >> itself, you can get away with a very slight adjustment: >> >> if (cast<Instruction>(ui)->getParent() != I_BB && ! >> isa<PHINode>(ui)) >> >> If the value is created in one block and you want to know if it's >> live >> out of some dominated block, that's a lot more complicated (and >> expensive). >> >> John. >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
" All of these answers are things you would do for an individual LLVM "Value". " I am sorry, but may be i am missing something here. In the previous email you suggested the function "bool isLiveOut(Instruction* I) ". So, if you please, explain how i can find out if a llvm::Value (not an llvm::Instruction) is live out or not. As i understand it, isLiveOut can help me ONLY if i have an llvm::Instruction (not a llvm:Value). Thanks. P.S I am truly grateful for your help. On Sat, May 30, 2009 at 10:32 PM, John McCall <rjmccall at apple.com> wrote:> On May 30, 2009, at 5:03 AM, Rotem Varon wrote: > > Is it possible to determine the liveout of the operands (see example > bellow) ? > > %5 = add i32 %4, %3 > > For '%5': i can simply use " i->isUsedOutsideOfBlock() " > For '%3' and '%4' : this is the question ... > > > By definition, operands are live out if they're used in any block > that's reachable from > the block containing the instruction. Barring a few special cases we've > already > covered, the easiest way I know to compute that in general is > to first calculate the > set of reachable blocks, then iterate through the uses, checking whether > that use > is in a reachable block (if the use is in a PHI node, only count it if the > corresponding incoming block is reachable). > > From your answer, is it possible to determine *which* value is liveout ( > in binary instruction)? > > > All of these answers are things you would do for an individual LLVM > "Value". I don't > know what you mean by "which value" beyond that, and I don't know what you > mean > by "in binary instruction". > > John. > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090531/52e5c72c/attachment.html>