[llvm-dev] returns_twice / noreturn

Alexandre Isoard via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 3 17:20:53 PDT 2017


I am not sure about the semantic (if any) of returns_twice and noreturn

int fork() __attribute__((returns_twice));
void join(int) __attribute__((noreturn));

int f(int n) {
  int t = fork();
  if (t != 0)
  return n;

Produces the following LLVM IR:

; Function Attrs: nounwind uwtable
define i32 @f(i32 %n) local_unnamed_addr #0 {
  %call = call i32 (...) @fork() #3
  %cmp = icmp eq i32 %call, 0
  br i1 %cmp, label %if.end, label %if.then

if.then:                                          ; preds = %entry
  call void @join(i32 %call) #4

if.end:                                           ; preds = %entry
  %inc = add nsw i32 %n, 1
  ret i32 %inc

; Function Attrs: returns_twice
declare i32 @fork(...) local_unnamed_addr #1

; Function Attrs: noreturn
declare void @join(i32) local_unnamed_addr #2

Where the n++ has been moved after the if, is that legal?

Also, technically, f could also returns_twice or noreturn (depending on the
return values of fork).

So my question is: do they have semantic or they are only "clues" for
heuristic purposes?

*Alexandre Isoard*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171103/e51d029f/attachment.html>

More information about the llvm-dev mailing list