From 086832979ba34527c4fe97f75037a7e87089fcb4 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Tue, 9 Sep 2014 01:13:36 +0000 Subject: [PATCH] Set trunc store action to Expand for all X86 targets. 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 --- lib/Target/X86/X86ISelLowering.cpp | 4 ++-- .../X86/dont-trunc-store-double-to-float.ll | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/dont-trunc-store-double-to-float.ll diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index fab65738f70..0448d5c43da 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -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); @@ -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); diff --git a/test/CodeGen/X86/dont-trunc-store-double-to-float.ll b/test/CodeGen/X86/dont-trunc-store-double-to-float.ll new file mode 100644 index 00000000000..24d9533eba4 --- /dev/null +++ b/test/CodeGen/X86/dont-trunc-store-double-to-float.ll @@ -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 +} -- 2.40.0