void main() {
  float x[1];
  double y = .01, z;
  x[0] = 3.14;
  print(x[0] + y);
  print(x[0] - y);
  print(x[0] * y);
  print(x[0] / y);
  print("\n");
  x[0] += y;
  printid(x);
  x[0] -= y;
  printid(x);
  x[0] *= y;
  printid(x);
  x[0] /= y;
  printid(x);
  print("\n");
  z = x[0] += y;
  printid(z);
  z = x[0] -= y;
  printid(z);
  z = x[0] *= y;
  printid(z);
  z = x[0] /= y;
  printid(z);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movsd  0xed8(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movss  0xec3(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  -0x10(%rbp),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  -0x10(%rbp),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  -0x10(%rbp),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x10(%rbp),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
lea    0xe73(%rip),%rdi
mov    $0x0,%al
call   1030 <print@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
lea    -0x4(%rbp),%rdi
mov    $0x0,%al
call   1040 <printid@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
lea    -0x4(%rbp),%rdi
mov    $0x0,%al
call   1040 <printid@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
lea    -0x4(%rbp),%rdi
mov    $0x0,%al
call   1040 <printid@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
lea    -0x4(%rbp),%rdi
mov    $0x0,%al
call   1040 <printid@plt>
lea    0xdcd(%rip),%rdi
mov    $0x0,%al
call   1030 <print@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
movsd  -0x10(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r14
push   %rbx
push   %rax
movsd  0xed4(%rip),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
movsd  0xecd(%rip),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
movsd  0xec6(%rip),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
movsd  0xebf(%rip),%xmm0
mov    $0x1,%al
call   1030 <print@plt>
lea    0xec9(%rip),%r14
mov    %r14,%rdi
xor    %eax,%eax
call   1030 <print@plt>
movl   $0x4049999a,0x4(%rsp)
40
lea    0x4(%rsp),%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printid@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xe86(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printid@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0xe68(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printid@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  0xe42(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printid@plt>
mov    %r14,%rdi
xor    %eax,%eax
call   1030 <print@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xe12(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xde3(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0xdc4(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  0xd9d(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printid@plt>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@.str = [2 x i8] c"\0A\00"
define void @main() {
%1 = alloca [1 x float]
%2 = alloca double
%3 = alloca double
store double 1.000000e-02, double* %2
%4 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
store float 0x40091EB860000000, float* %4
%5 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%6 = load float, float* %5
%7 = fpext float %6 to double
%8 = load double, double* %2
%9 = fadd double %7, %8
%10 = call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double %9)
%11 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%12 = load float, float* %11
%13 = fpext float %12 to double
%14 = load double, double* %2
%15 = fsub double %13, %14
%16 = call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double %15)
%17 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%18 = load float, float* %17
%19 = fpext float %18 to double
%20 = load double, double* %2
%21 = fmul double %19, %20
%22 = call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double %21)
%23 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%24 = load float, float* %23
%25 = fpext float %24 to double
%26 = load double, double* %2
%27 = fdiv double %25, %26
%28 = call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double %27)
%29 = call i32 (i8*, ...) bitcast (i32 (...)* @print to i32 (i8*, ...)*)(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%30 = load double, double* %2
%31 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%32 = load float, float* %31
%33 = fpext float %32 to double
%34 = fadd double %33, %30
%35 = fptrunc double %34 to float
store float %35, float* %31
%36 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%37 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %36)
%38 = load double, double* %2
%39 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%40 = load float, float* %39
%41 = fpext float %40 to double
%42 = fsub double %41, %38
%43 = fptrunc double %42 to float
store float %43, float* %39
%44 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%45 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %44)
%46 = load double, double* %2
%47 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%48 = load float, float* %47
%49 = fpext float %48 to double
%50 = fmul double %49, %46
%51 = fptrunc double %50 to float
store float %51, float* %47
%52 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%53 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %52)
%54 = load double, double* %2
%55 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%56 = load float, float* %55
%57 = fpext float %56 to double
%58 = fdiv double %57, %54
%59 = fptrunc double %58 to float
store float %59, float* %55
%60 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%61 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %60)
%62 = call i32 (i8*, ...) bitcast (i32 (...)* @print to i32 (i8*, ...)*)(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%63 = load double, double* %2
%64 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%65 = load float, float* %64
%66 = fpext float %65 to double
%67 = fadd double %66, %63
%68 = fptrunc double %67 to float
store float %68, float* %64
%69 = fpext float %68 to double
store double %69, double* %3
%70 = load double, double* %3
%71 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %70)
%72 = load double, double* %2
%73 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%74 = load float, float* %73
%75 = fpext float %74 to double
%76 = fsub double %75, %72
%77 = fptrunc double %76 to float
store float %77, float* %73
%78 = fpext float %77 to double
store double %78, double* %3
%79 = load double, double* %3
%80 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %79)
%81 = load double, double* %2
%82 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%83 = load float, float* %82
%84 = fpext float %83 to double
%85 = fmul double %84, %81
%86 = fptrunc double %85 to float
store float %86, float* %82
%87 = fpext float %86 to double
store double %87, double* %3
%88 = load double, double* %3
%89 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %88)
%90 = load double, double* %2
%91 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%92 = load float, float* %91
%93 = fpext float %92 to double
%94 = fdiv double %93, %90
%95 = fptrunc double %94 to float
store float %95, float* %91
%96 = fpext float %95 to double
store double %96, double* %3
%97 = load double, double* %3
%98 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %97)
ret void
}

LLVM IR (-O2):
@.str = [2 x i8] c"\0A\00"
define void @main() {
%1 = alloca [1 x float]
%2 = bitcast [1 x float]* %1 to i8*
%3 = getelementptr inbounds [1 x float], [1 x float]* %1, i64 0, i64 0
%4 = tail call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double 0x400933334147AE14)
%5 = tail call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double 0x40090A3D7EB851EC)
%6 = tail call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double 0x3FA013A933333333)
%7 = tail call i32 (double, ...) bitcast (i32 (...)* @print to i32 (double, ...)*)(double 0x4073A0000B000000)
%8 = tail call i32 (i8*, ...) bitcast (i32 (...)* @print to i32 (i8*, ...)*)(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
store float 0x4009333340000000, float* %3
%9 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %3)
%10 = load float, float* %3
%11 = fpext float %10 to double
%12 = fadd double %11, -1.000000e-02
%13 = fptrunc double %12 to float
store float %13, float* %3
%14 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %3)
%15 = load float, float* %3
%16 = fpext float %15 to double
%17 = fmul double %16, 1.000000e-02
%18 = fptrunc double %17 to float
store float %18, float* %3
%19 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %3)
%20 = load float, float* %3
%21 = fpext float %20 to double
%22 = fdiv double %21, 1.000000e-02
%23 = fptrunc double %22 to float
store float %23, float* %3
%24 = call i32 (float*, ...) bitcast (i32 (...)* @printid to i32 (float*, ...)*)(float* %3)
%25 = call i32 (i8*, ...) bitcast (i32 (...)* @print to i32 (i8*, ...)*)(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%26 = load float, float* %3
%27 = fpext float %26 to double
%28 = fadd double %27, 1.000000e-02
%29 = fptrunc double %28 to float
store float %29, float* %3
%30 = fpext float %29 to double
%31 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %30)
%32 = load float, float* %3
%33 = fpext float %32 to double
%34 = fadd double %33, -1.000000e-02
%35 = fptrunc double %34 to float
store float %35, float* %3
%36 = fpext float %35 to double
%37 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %36)
%38 = load float, float* %3
%39 = fpext float %38 to double
%40 = fmul double %39, 1.000000e-02
%41 = fptrunc double %40 to float
store float %41, float* %3
%42 = fpext float %41 to double
%43 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %42)
%44 = load float, float* %3
%45 = fpext float %44 to double
%46 = fdiv double %45, 1.000000e-02
%47 = fptrunc double %46 to float
store float %47, float* %3
%48 = fpext float %47 to double
%49 = call i32 (double, ...) bitcast (i32 (...)* @printid to i32 (double, ...)*)(double %48)
ret void
}