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

Daniel Berlin dberlin at dberlin.org
Wed Mar 25 12:36:04 PDT 2015


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();

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


More information about the llvm-dev mailing list