how to disable return type optimize when compile to IR code with clang ?

Hi all,
the example code is:

union mixtype
{
long long asInt64;
double asDouble;
int asIntPtr[2];
};

union mixtype double2mixtype(double d)
{
union mixtype result;
result.asDouble = d;
return result;
}

then I compile it to IR code like this:
clang.exe -S -emit-llvm test.c

and the test.ll file is:

; ModuleID = ‘test.c’
target datalayout = “e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32”
target triple = “i686-pc-win32”

%union.mixtype = type { i64 }

; Function Attrs: nounwind
define i64 @double2mixtype(double %d) #0 {
entry:
%retval = alloca %union.mixtype, align 8
%d.addr = alloca double, align 8
%result = alloca %union.mixtype, align 8
store double %d, double* %d.addr, align 8
%0 = load double* %d.addr, align 8
%asDouble = bitcast %union.mixtype* %result to double*
store double %0, double* %asDouble, align 8
%1 = bitcast %union.mixtype* %retval to i8*
%2 = bitcast %union.mixtype* %result to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %2, i32 8, i32 8, i1 false)
%coerce.dive = getelementptr %union.mixtype* %retval, i32 0, i32 0
%3 = load i64* %coerce.dive
ret i64 %3
}

; Function Attrs: nounwind
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #1

attributes #0 = { nounwind “less-precise-fpmad”=“false” “no-frame-pointer-elim”=“true” “no-frame-pointer-elim-non-leaf” “no-infs-fp-math”=“false” “no-nans-fp-math”=“false” “stack-protector-buffer-size”=“8” “unsafe-fp-math”=“false” “use-soft-float”=“false” }
attributes #1 = { nounwind }

!llvm.ident = !{!0}

!0 = metadata !{metadata !“clang version 3.4.2 (tags/RELEASE_34/dot2-final)”}

so, I wonder, how to set the options when compiling, to force double2mixtype return %union.mixtype but not i64 ?

This isn’t an optimization, it is actually how Clang is able to match the native ABI on your platform through LLVM IR. There is no flag to disable it. If we don’t do this, we need some other way to ensure that the data is returned in eax:edx on i686-pc-win32.

Previously we have discussed adding an ISA triple value for analysis only that uses simple IR lowerings, like making all struct passing indirect through pointers. That might be useful to you, depending on what you are trying to do.