char ****returnIntSum(int *u, float *a, char *str, char ***dummy, double **b,
                      int uninit) {
  int c = **b;
  int foo = uninit;
  int bar = *a;
  **b *= 2;
  *a = 2.718;
  if (u)
    returnIntSum(0, a, str + 3, dummy, b, uninit);
  else
    return (char ****)0xDEADDEAD;
  return (char ****)0xABBABEEF;
}


x86 assembly (clang, -O0):
<returnIntSum>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9d,-0x34(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x18(%rbp),%rax
cvttss2si (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  0xeaa(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movss  0xe8e(%rip),%xmm0
movss  %xmm0,(%rax)
cmpq   $0x0,-0x10(%rbp)
je     11a7 <returnIntSum+0x97>
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rdx
add    $0x3,%rdx
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%r8
mov    -0x34(%rbp),%r9d
xor    %eax,%eax
mov    %eax,%edi
call   1030 <returnIntSum@plt>
jmp    11b5 <returnIntSum+0xa5>
mov    $0xdeaddead,%eax
mov    %rax,-0x8(%rbp)
jmp    11be <returnIntSum+0xae>
mov    $0xabbabeef,%eax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<returnIntSum>:
mov    $0xabbabeef,%eax
mov    (%r8),%rcx
movsd  (%rcx),%xmm0
addsd  %xmm0,%xmm0
movsd  %xmm0,(%rcx)
movl   $0x402df3b6,(%rsi)
test   %rdi,%rdi
je     1128 <returnIntSum+0x28>
addsd  %xmm0,%xmm0
movsd  %xmm0,(%rcx)
ret
add    $0x32f31fbe,%rax
ret

LLVM IR (-O0):
define i8**** @returnIntSum(i32* %0, float* %1, i8* %2, i8*** %3, double** %4, i32 %5) {
%7 = alloca i8****
%8 = alloca i32*
%9 = alloca float*
%10 = alloca i8*
%11 = alloca i8***
%12 = alloca double**
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i32* %0, i32** %8
store float* %1, float** %9
store i8* %2, i8** %10
store i8*** %3, i8**** %11
store double** %4, double*** %12
store i32 %5, i32* %13
%17 = load double**, double*** %12
%18 = load double*, double** %17
%19 = load double, double* %18
%20 = fptosi double %19 to i32
store i32 %20, i32* %14
%21 = load i32, i32* %13
store i32 %21, i32* %15
%22 = load float*, float** %9
%23 = load float, float* %22
%24 = fptosi float %23 to i32
store i32 %24, i32* %16
%25 = load double**, double*** %12
%26 = load double*, double** %25
%27 = load double, double* %26
%28 = fmul double %27, 2.000000e+00
store double %28, double* %26
%29 = load float*, float** %9
store float 0x4005BE76C0000000, float* %29
%30 = load i32*, i32** %8
%31 = icmp ne i32* %30, null
br i1 %31, label %32, label %40
32: ; preds = %6
%33 = load float*, float** %9
%34 = load i8*, i8** %10
%35 = getelementptr inbounds i8, i8* %34, i64 3
%36 = load i8***, i8**** %11
%37 = load double**, double*** %12
%38 = load i32, i32* %13
%39 = call i8**** @returnIntSum(i32* null, float* %33, i8* %35, i8*** %36, double** %37, i32 %38)
br label %41
40: ; preds = %6
store i8**** inttoptr (i64 3735936685 to i8****), i8***** %7
br label %42
41: ; preds = %32
store i8**** inttoptr (i64 2881142511 to i8****), i8***** %7
br label %42
42: ; preds = %41, %40
%43 = load i8****, i8***** %7
ret i8**** %43
}

LLVM IR (-O2):
define i8**** @returnIntSum(i32* readnone %0, float* nocapture writeonly %1, i8* nocapture readnone %2, i8*** nocapture readnone %3, double** nocapture %4, i32 %5) {
%7 = load double*, double** %4
%8 = load double, double* %7
%9 = fmul double %8, 2.000000e+00
store double %9, double* %7
store float 0x4005BE76C0000000, float* %1
%10 = icmp eq i32* %0, null
br i1 %10, label %13, label %11
11: ; preds = %6
%12 = fmul double %9, 2.000000e+00
store double %12, double* %7
br label %13
13: ; preds = %6, %11
%14 = phi i8**** [ inttoptr (i64 2881142511 to i8****), %11 ], [ inttoptr (i64 3735936685 to i8****), %6 ]
ret i8**** %14
}