microsoft / llvm-mctoll

llvm-mctoll
Other
806 stars 123 forks source link

[X86-64] Insert unreachable after non-returning calls for all return types #156

Closed martin-fink closed 2 years ago

martin-fink commented 2 years ago

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]:

; ...
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