<html><body><p><font size="2">Hi,</font><br><br><font size="2">I meet an issue when I verify machineinstrs for Powerpc testcases in llvm.</font><br><br>llc -mtriple=powerpc64-unknown-linux-gnu < llvm/llvm/test/CodeGen/PowerPC/sj-ctr-loop.ll -verify-machineinstrs<br><br><i>Bad machine code: MBB exits via unconditional fall-through but ends with a barrier instruction! ***</i><ul><ul type="disc"><li><i>function: main</i><li><i>basic block: %bb.2 for.body.lr.ph (0x100275437e8)</i></ul></ul><br><font size="2">Content in block BB.2:</font><br><font size="2"><br></font><i><font size="2">BB#2: derived from LLVM BB %for.end</font></i><br><i><font size="2">    Predecessors according to CFG: BB#1</font></i><br><i><font size="2">        %vreg2<def> = ADDIStocHA %X2, <ga:@env_sigill>; G8RC_and_G8RC_NOX0:%vreg2</font></i><br><i><font size="2">        %vreg3<def> = LDtocL <ga:@env_sigill>, %vreg2<kill>; mem:LD8[GOT] G8RC:%vreg3 G8RC_and_G8RC_NOX0:%vreg2</font></i><br><i><font size="2">        %vreg4<def> = </font></i><b><i><font size="2">EH_SjLj_SetJmp64 </font></i></b><i><font size="2">%vreg3<kill>, %CTR8<imp-def,dead>; GPRC:%vreg4 G8RC:%vreg3</font></i><br><br><font size="2">Currently Powerpc sets </font><b><font size="2">EH_SjLj_SetJmp64 </font></b><font size="2">with flag isBarrier. But it is also a fall-through instruction. So it fails in machineinstr verifying.</font><br><br><font size="2">I checked other platforms like X86 and ARM, they also set this intrinsics as barrier. For my understanding, a barrier instruction means control flow can not fall through like llvm.eh.sjlj.longjmp and unconditional jumps. But setjmp should fall through.</font><br><br><font size="2">Is there any misunderstanding? Is there any specification reason for setting llvm.eh.sjlj.setjmp as a barrier?</font><br><br><font size="2">Thanks in advance.</font><br><br><font size="2">BRS//</font><br><font size="2">Chen Zheng</font><br><font size="2">Power Compiler Backend Developer</font><br><BR>
</body></html>