<div dir="ltr">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.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 25, 2015 at 12:36 PM, Daniel Berlin <span dir="ltr"><<a href="mailto:dberlin@dberlin.org" target="_blank">dberlin@dberlin.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">While improving ADCE, i notice that for <div><br></div><div><br></div><div><div>declare i32 @strlen(i8*) readnone</div><div><br></div><div>define i32 @test() {</div><div><span style="white-space:pre-wrap">    </span>; invoke of pure function should not be deleted!</div><div><span style="white-space:pre-wrap"> </span>invoke i32 @strlen( i8* null ) readnone</div><div><span style="white-space:pre-wrap">                  </span>to label %Cont unwind label %Other<span style="white-space:pre-wrap">              </span>; <i32>:1 [#uses=0]</div><div><br></div><div>Cont:<span style="white-space:pre-wrap">          </span>; preds = %0</div><div><span style="white-space:pre-wrap">     </span>ret i32 0</div><div><br></div><div>Other:<span style="white-space:pre-wrap">         </span>; preds = %0</div><div>         %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0</div><div>                  cleanup</div><div><span style="white-space:pre-wrap">      </span>ret i32 1</div><div>}</div><div><br></div><div>declare i32 @__gxx_personality_v0(...)</div></div><div><br></div><div>Instruction:: mayThrow returns false for the invoke. </div><div><br></div><div>This is because ...</div><div><br></div><div><div><br></div><div> bool Instruction::mayThrow() const {</div><div>   if (const CallInst *CI = dyn_cast<CallInst>(this))</div><div>     return !CI->doesNotThrow();</div><div>   return isa<ResumeInst>(this);</div><div> }</div></div><div><br></div><div>CallInst != InvokeInst, and invokeinst is not derived from callinst.</div><div><br></div><div>Am I missing something, or should this function also have:<br><br></div><div> if (const InvokeInst *II = dyn_cast<InvokeInst>(this))</div><div> return !II->doesNotThrow();<br></div><div><br></div><div>?<br><br></div><div><br></div></div>
</blockquote></div><br></div>