[LLVMdev] Instruction::mayThrow not handling invoke's?

Sanjoy Das sanjoy at playingwithpointers.com
Mon Jul 20 00:00:16 PDT 2015


Here is an interesting spin on this topic --
https://llvm.org/bugs/show_bug.cgi?id=24185

On Wed, Mar 25, 2015 at 1:43 PM, Daniel Berlin <dberlin at dberlin.org> wrote:
> After talking with Nick (the real reason i asked is because
> mayHaveSideEffects returns false for this invoke), we don't consider the
> control flow change of invoke to be a side effects.
>
> On Wed, Mar 25, 2015 at 12:36 PM, Daniel Berlin <dberlin at dberlin.org> wrote:
>>
>> While improving ADCE, i notice that for
>>
>>
>> declare i32 @strlen(i8*) readnone
>>
>> define i32 @test() {
>> ; invoke of pure function should not be deleted!
>> invoke i32 @strlen( i8* null ) readnone
>> to label %Cont unwind label %Other ; <i32>:1 [#uses=0]
>>
>> Cont: ; preds = %0
>> ret i32 0
>>
>> Other: ; preds = %0
>>          %exn = landingpad {i8*, i32} personality i32 (...)*
>> @__gxx_personality_v0
>>                   cleanup
>> ret i32 1
>> }
>>
>> declare i32 @__gxx_personality_v0(...)
>>
>> Instruction:: mayThrow returns false for the invoke.
>>
>> This is because ...
>>
>>
>>  bool Instruction::mayThrow() const {
>>    if (const CallInst *CI = dyn_cast<CallInst>(this))
>>      return !CI->doesNotThrow();
>>    return isa<ResumeInst>(this);
>>  }
>>
>> CallInst != InvokeInst, and invokeinst is not derived from callinst.
>>
>> Am I missing something, or should this function also have:
>>
>>  if (const InvokeInst *II = dyn_cast<InvokeInst>(this))
>>  return !II->doesNotThrow();
>>
>> ?
>>
>>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list