Daniel Berlin
2015-Mar-25 19:36 UTC
[LLVMdev] 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 ; <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>
Daniel Berlin
2015-Mar-25 20:43 UTC
[LLVMdev] Instruction::mayThrow not handling invoke's?
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(); > > ? > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150325/b62af55a/attachment.html>
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 >