Instruction::mayThrow not handling invoke's?

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 ; :1 [#uses=0]

Cont: ; preds = %0
ret i32 0

Other: ; preds = %0
%exn = landingpad {i8*, i32} personality i32 (…)* @__gxx_personality_v0
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(this))
return !CI->doesNotThrow();
return isa(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(this))
return !II->doesNotThrow();


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.

Here is an interesting spin on this topic --