[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 (...)*
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