[PATCH] Make sure to set trunc store action to Expand for all X86 targets.

Luqman Aden me+llvm at luqman.ca
Thu Sep 4 08:26:05 PDT 2014


Ping?

On Aug 29, 2014, at 2:56 PM, Luqman Aden <me+llvm at luqman.ca> wrote:

> When compiling without SSE2, isTruncStoreLegal(F64, F32) would return Legal, whereas with SSE2 it would return Expand. And since the Target doesn't seem to actually handle a truncstore for double -> float, it would just output a store of a full double in the space for a float hence overwriting other bits on the stack.
> 
> ```
> define void @bar() unnamed_addr {
> entry-block:
>  %a = alloca double
>  %b = alloca float
> 
>  store double 3.140000e+00, double* %a
>  %0 = load double* %a
> 
>  %1 = fptrunc double %0 to float
>  store float %1, float* %b
> 
>  ret void
> }
> ```
> 
> Without SSE2:
> ```
> bar:                                    # @bar
>    .cfi_startproc
> # BB#0:                                 # %entry-block
>    subl    $20, %esp
> .Ltmp0:
>    .cfi_def_cfa_offset 24
>    movl    $1074339512, 12(%esp)   # imm = 0x40091EB8
>    movl    $1374389535, 8(%esp)    # imm = 0x51EB851F                 0x40091EB851EB851F (double) 3.14
>    movl    $1074339512, 8(%esp)    # imm = 0x40091EB8
>    movl    $1374389535, 4(%esp)    # imm = 0x51EB851F
>    addl    $20, %esp
>    retl
> ```
> 
> With SSE2:
> ```
> bar:                                    # @bar
>    .cfi_startproc
> # BB#0:                                 # %entry-block
>    subl    $20, %esp
> .Ltmp0:
>    .cfi_def_cfa_offset 24
>    movl    $1074339512, 12(%esp)   # imm = 0x40091EB8
>    movl    $1374389535, 8(%esp)    # imm = 0x51EB851F            0x40091EB851EB851F (double) 3.14
>    movl    $1078523331, 4(%esp)    # imm = 0x4048F5C3           0x4048F5C3 (float) 3.14
>    addl    $20, %esp
>    retl
> ```
> 
> http://reviews.llvm.org/D5125
> 
> Files:
>  lib/Target/X86/X86ISelLowering.cpp
>  test/CodeGen/X86/dont-trunc-store-double-to-float.ll
> <D5125.13098.patch>





More information about the llvm-commits mailing list