[llvm-dev] help me understand how nounwind attribute on functions works?

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Thu Feb 9 18:41:32 PST 2017


> On Feb 9, 2017, at 6:37 PM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:
> 
> On Thu, Feb 9, 2017 at 6:25 PM, Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
>> 
>>> On Feb 9, 2017, at 6:16 PM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:
>>> 
>>> On Thu, Feb 9, 2017 at 8:41 AM, Reid Kleckner via llvm-dev
>>> <llvm-dev at lists.llvm.org> wrote:
>>>> On Wed, Feb 8, 2017 at 5:45 PM, Mehdi Amini <mehdi.amini at apple.com> wrote:
>>>>> 
>>>>> What isn’t clear to me still is : why shouldn't this be transitive?
>>>>> In the example you’re showing, for a caller of f() in bar, what is the
>>>>> advantage of knowing that f() is nounwind if it an exception can still be
>>>>> thrown? What does it allow?
>>>> 
>>>> 
>>>> We know an exception cannot unwind out of f. An exception can be thrown
>>>> inside something that f calls, but it must be caught before it unwinds
>>>> beyond f.
>>> 
>>> So perhaps a viable rule is that every CallInst in a nounwind function
>>> can be marked as nounwind (even though the callee for said CallInst
>>> can't be)?
>> 
>> 
>> That should be an implicit assumption when a given function has the attribute. A `isCallNounwind(CallSite &C)` should be allowed to be implemented conceptually: return C.getCaller()->hasNounwindAttr() || C.getCaller()->hasNounwindAttr();
>> 
>> I’m still not sure what is LLVM doing differently for such calls thought? Why is it useful to know that a call is nounwind?
>> I thought it is only useful to be able to turn invoke into calls, but what else?
> 
> Because nounwind functions do not have an implicit throw edge, you can
> do things like:
> 
> call @readnone_nounwind()
> int k = a / b;
> 
> ==>
> 
> int k = a / b;
> call @readnone_nounwind()

Thanks for the example!

— 
Mehdi


> 
> Unfortunately the readnone (or readonly) is important in LLVM today;
> since the informal semantics today are readnone or readonly functions
> can't exit(0) or infloop.
> 
> -- Sanjoy
> 
>> 
>> Thanks,
>> 
>>>> Mehdi

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170209/b23bad64/attachment.html>


More information about the llvm-dev mailing list