llvm-project/llvm/lib
Andrea Di Biagio 9ac8a6b13d [DAGCombiner] Fix wrong folding of a build_vector into a blend with zero.
Method 'visitBUILD_VECTOR' in the DAGCombiner knows how to combine a
build_vector of a bunch of extract_vector_elt nodes and constant zero nodes
into a shuffle blend with a zero vector.

However, method 'visitBUILD_VECTOR' forgot that a floating point
build_vector may contain negative zero as well as positive zero.

Example:

define <2 x double> @example(<2 x double> %A) {
entry:
  %0 = extractelement <2 x double> %A, i32 0
  %1 = insertelement <2 x double> undef, double %0, i32 0
  %2 = insertelement <2 x double> %1, double -0.0, i32 1
  ret <2 x double> %2
}

Before this patch, llc (with -mattr=+sse4.1) wrongly generated
  movq   %xmm0, %xmm0  # xmm0 = xmm0[0],zero

So, the sign bit of the negative zero was effectively lost.

This patch fixes the problem by adding explicit checks for positive zero.

With this patch, llc produces the following code for the example above:
  movhpd .LCPI0_0(%rip), %xmm0

where .LCPI0_0 referes to a 'double -0'.

llvm-svn: 239070
2015-06-04 19:15:01 +00:00
..
Analysis [PM/AA] Start refactoring AliasAnalysis to remove the analysis group and 2015-06-04 02:03:15 +00:00
AsmParser DebugInfo: Really support 2^16 arguments in a subprogram 2015-06-02 17:17:44 +00:00
Bitcode [BitcodeReader] Diagnose type mismatches with aliases 2015-06-03 01:30:13 +00:00
CodeGen [DAGCombiner] Fix wrong folding of a build_vector into a blend with zero. 2015-06-04 19:15:01 +00:00
DebugInfo [DWARF] Fix a bug in line info handling 2015-05-31 23:37:04 +00:00
ExecutionEngine Re-commit r238838, r238844 with fix for host/target endian mismatch and windows buildbot. 2015-06-03 10:27:28 +00:00
Fuzzer [lib/Fuzzer] make assertions more informative and update comments for the user-supplied mutator 2015-05-30 17:33:13 +00:00
IR [C API] Add LLVMStructGetTypeAtIndex. 2015-06-04 09:09:53 +00:00
IRReader Use ADDITIONAL_HEADER_DIRS in all LLVM CMake projects. 2015-02-11 03:28:02 +00:00
LTO Make the C++ LTO API easier to use from C++ clients. 2015-06-01 20:08:30 +00:00
LineEditor Use ADDITIONAL_HEADER_DIRS in all LLVM CMake projects. 2015-02-11 03:28:02 +00:00
Linker While in GlobalValue fix the function(s) that don't follow the 2015-05-15 18:20:14 +00:00
MC Test commit access. 2015-06-04 17:30:26 +00:00
Object [Object, MachO] Introduce MachOObjectFile::load_commands() range iterator. 2015-06-03 22:19:36 +00:00
Option Option parsing: properly handle flag aliases for joined options (PR23394) 2015-05-04 18:00:13 +00:00
Passes [PM] Fixup for r231556 where I missed a dependency on intrinsics 2015-03-07 09:08:20 +00:00
ProfileData InstrProf: Treat functions with a coverage map but no profile as unreached 2015-05-13 22:03:04 +00:00
Support [Support] Simplify Triple::getOSVersion 2015-06-01 23:45:25 +00:00
TableGen [TableGen] Use range-based for loops. NFC 2015-06-04 07:40:14 +00:00
Target R600/SI: Reimplement isLegalAddressingMode 2015-06-04 16:17:42 +00:00
Transforms Tidy code in InstrProfiling.cpp. NFC. 2015-06-04 11:45:32 +00:00
CMakeLists.txt [PM] Create a separate library for high-level pass management code. 2015-03-07 09:02:36 +00:00
LLVMBuild.txt Reflow long lines of some LLVMBuild files 2015-05-14 15:38:27 +00:00
Makefile [PM] Create a separate library for high-level pass management code. 2015-03-07 09:02:36 +00:00