<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">HI,<div class=""><br class=""></div><div class="">When compiling the open-source software cryptopp (<a href="https://www.cryptopp.com/#download" class="">https://www.cryptopp.com/#download</a>) version 5.6.4 I found a strange issue with the IR generated.</div><div class=""><br class=""></div><div class="">The issue only appears when compiling with -O2 optimisation in the integer.cpp file (the function is _ZN8CryptoPPrsERNSt3__113basic_istreamIcNS0_11char_traitsIcEEEERNS_7IntegerE -> CryptoPP::operator>>(std::__1::basic_istream<char, std::__1::char_traits<char> >&, CryptoPP::Integer&)).</div><div class=""><br class=""></div><div class="">The verifier give me these errors:</div><div class=""><br class=""></div><div class=""><div class=""><i class="">EH pad cannot be in entry block. %4 = landingpad</i></div><div class=""><i class="">{ i8*, i32 } cleanupLandingPadInst not the first non-PHI instruction in the block. %4 = landingpad { i8*, i32 } cleanup</i></div><div class=""><br class=""></div><div class="">If I remove the verifier, I am able to compile the whole library and run the test suite without any issue.</div><div class=""><br class=""></div><div class="">When you look at the whole IR code for the function:</div><div class=""><br class=""></div><div class="">----------------------</div><div class=""><br class=""></div><div class=""><div class="">; Function Attrs: ssp uwtable</div><div class="">define nonnull dereferenceable(168) %"class.std::__1::basic_istream"* @_ZN8CryptoPPrsERNSt3__113basic_istreamIcNS0_11char_traitsIcEEEERNS_7IntegerE(%"class.std::__1::basic_istream"* dereferenceable(168), %"class.CryptoPP::Integer"* dereferenceable(40)) local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {</div><div class="">  %3 = tail call i8* @_ZN8CryptoPP17UnalignedAllocateEm(i64 16)</div><div class="">  %4 = landingpad { i8*, i32 }</div><div class="">          cleanup</div><div class="">  %5 = icmp eq i8* %3, null</div><div class="">  br i1 %5, label %6, label %8, !prof !22</div><div class=""><br class=""></div><div class="">; <label>:6:                                      ; preds = %2</div><div class="">  invoke void @__assert_rtn(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @__func__._ZN8CryptoPP20AllocatorWithCleanupIhLb0EE10deallocateEPvm, i64 0, i64 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.64, i64 0, i64 0), i32 197, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.75, i64 0, i64 0)) #58</div><div class="">          to label %7 unwind label %10</div><div class=""><br class=""></div><div class="">; <label>:7:                                      ; preds = %6</div><div class="">  unreachable</div><div class=""><br class=""></div><div class="">; <label>:8:                                      ; preds = %2</div><div class="">  %9 = tail call { i64, i8* } asm sideeffect "rep stosb", "={cx},={di},{ax},0,1,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 0, i64 16, i8* nonnull %3) #53, !srcloc !1070</div><div class="">  invoke void @_ZN8CryptoPP19UnalignedDeallocateEPv(i8* nonnull %3)</div><div class="">          to label %13 unwind label %10</div><div class=""><br class=""></div><div class="">; <label>:10:                                     ; preds = %8, %6</div><div class="">  %11 = landingpad { i8*, i32 }</div><div class="">          catch i8* null</div><div class="">  %12 = extractvalue { i8*, i32 } %11, 0</div><div class="">  tail call void @__clang_call_terminate(i8* %12) #59</div><div class="">  unreachable</div><div class=""><br class=""></div><div class="">; <label>:13:                                     ; preds = %8</div><div class="">  resume { i8*, i32 } %4</div><div class="">}</div></div><div class=""><br class=""></div><div class=""><div class="">----------------------</div></div><div class=""><br class=""></div><div class="">I was not able to understand which optimisation transforms the code like this.</div><div class=""><br class=""></div><div class="">I have attached the IR code from the function in O0 and O2.</div><div class=""><br class=""></div><div class="">Greetings,</div><div class=""><br class=""></div><div class="">Johan</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""></div></div></body></html>