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
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(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 --
https://llvm.org/bugs/show_bug.cgi?id=24185