[cfe-dev] how to disable return type optimize when compile to IR code with clang ?

Reid Kleckner rnk at google.com
Thu Aug 21 10:41:53 PDT 2014


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.


On Wed, Aug 20, 2014 at 6:54 PM, zh <zhangheng607 at 163.com> wrote:

> 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 ?
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140821/eb822717/attachment.html>


More information about the cfe-dev mailing list