Closed martin-fink closed 2 years ago
Marking calls as tail calls and inserting an unreachable instruction should be done for all return types.
unreachable
The C code in test/smoke_test/terminating-func.c is compiled and optimized to the following IR [1]:
test/smoke_test/terminating-func.c
; ... define dso_local i32 @exit_conditionally(i32 %0) local_unnamed_addr #3 !dbg !20 { call void @llvm.dbg.value(metadata i32 %0, metadata !25, metadata !DIExpression()), !dbg !26 %2 = icmp eq i32 %0, 0, !dbg !27 br i1 %2, label %4, label %3, !dbg !29 3: ; preds = %1 tail call void @exit_with_msg(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0)), !dbg !30 unreachable, !dbg !32 4: ; preds = %1 %5 = tail call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @.str.2, i64 0, i64 0)), !dbg !33 ret i32 %5, !dbg !35 }
[1]: Compiler Explorer
Marking calls as tail calls and inserting an
unreachable
instruction should be done for all return types.The C code in
test/smoke_test/terminating-func.c
is compiled and optimized to the following IR [1]:[1]: Compiler Explorer