diff options
author | dim <dim@FreeBSD.org> | 2014-09-18 06:34:27 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2014-09-18 06:34:27 +0000 |
commit | 7ced298ca7bee66ba2a5f169cd74aece9cf568e0 (patch) | |
tree | d4305aec018e396cadce337daee1e3fc8c8d3a9d | |
parent | ddfed1e4ee9cd636f565aa9505a44a050216d0be (diff) | |
download | FreeBSD-src-7ced298ca7bee66ba2a5f169cd74aece9cf568e0.zip FreeBSD-src-7ced298ca7bee66ba2a5f169cd74aece9cf568e0.tar.gz |
MFC r271597:
Pull in r217410 from upstream llvm trunk (by Bob Wilson):
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!
This should fix clang -O0 on i386 assigning garbage to floats, in
certain scenarios.
PR: 187437
Submitted by: cebd@gmail.com
Approved by: re (marius)
Obtained from: http://llvm.org/viewvc/llvm-project?rev=217410&view=rev
-rw-r--r-- | contrib/llvm/lib/Target/X86/X86ISelLowering.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp b/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp index 716c146..1f20e29 100644 --- a/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -300,6 +300,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); @@ -1011,8 +1013,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); |