Skip to content

Commit

Permalink
Set trunc store action to Expand for all X86 targets.
Browse files Browse the repository at this point in the history
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.

Patch by Luqman Aden!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217410 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
bob-wilson committed Sep 9, 2014
1 parent 0acb489 commit 0868329
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ void X86TargetLowering::resetOperationActions() {
setTruncStoreAction(MVT::i32, MVT::i8 , Expand);
setTruncStoreAction(MVT::i16, MVT::i8, Expand);

setTruncStoreAction(MVT::f64, MVT::f32, Expand);

// SETOEQ and SETUNE require checking two conditions.
setCondCodeAction(ISD::SETOEQ, MVT::f32, Expand);
setCondCodeAction(ISD::SETOEQ, MVT::f64, Expand);
Expand Down Expand Up @@ -1057,8 +1059,6 @@ void X86TargetLowering::resetOperationActions() {
AddPromotedToType (ISD::SELECT, VT, MVT::v2i64);
}

setTruncStoreAction(MVT::f64, MVT::f32, Expand);

// Custom lower v2i64 and v2f64 selects.
setOperationAction(ISD::LOAD, MVT::v2f64, Legal);
setOperationAction(ISD::LOAD, MVT::v2i64, Legal);
Expand Down
20 changes: 20 additions & 0 deletions test/CodeGen/X86/dont-trunc-store-double-to-float.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
; RUN: llc -march=x86 < %s | FileCheck %s

; CHECK-LABEL: @bar
; CHECK: movl $1074339512,
; CHECK: movl $1374389535,
; CHECK: movl $1078523331,
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
}

0 comments on commit 0868329

Please sign in to comment.