https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108691
--- Comment #7 from David Spickett <david.spickett at linaro dot org> --- > That still leaves us with missing abnormal edges - David, was this reduced > from an actual program? No, it's a simplified version of the C used to generate an LLVM IR test case: extern int setjmp(ptr); extern void notsetjmp(void); void bbb(void) { setjmp(0); int (*fnptr)(ptr) = setjmp; fnptr(0); notsetjmp(); } The test is checking that llvm follows each call to a returns twice function with a branch target identifier instruction. In case the function returns using a jump instead of the normal ret. That's probably beside the point for this bug though. The "real code" that motivated the feature was not doing indirect calls. I just tested that because there's no reason it shouldn't also work. I don't know of a use case for code like this. Like you said, if the compiler doesn't know what the indirect call target is, it won't know it's return twice. If it does know what you're calling, you could probably just call it directly. So I was just shuffling statements around to test clang and compare against gcc and found the ICE that way.