llvm-6502/lib/IR
Chandler Carruth ffc97a6ae1 [slp] Fix a nasty bug in the SLP vectorizer that Joerg pointed out.
Apparently some code finally started to tickle this after my
canonicalization changes to instcombine.

The bug stems from trying to form a vector type out of scalars that
aren't compatible at all. In this example, from x86_mmx values. The code
in the vectorizer that checks for reasonable types whas checking for
aggregates or vectors, but there are lots of other types that should
just never reach the vectorizer.

Debugging this was made more confusing by the lie in an assert in
VectorType::get() -- it isn't that the types are *primitive*. The types
must be integer, pointer, or floating point types. No other types are
allowed.

I've improved the assert and added a helper to the vectorizer to handle
the element type validity checks. It now re-uses the VectorType static
function and then further excludes weird target-specific types that we
probably shouldn't be touching here (x86_fp80 and ppc_fp128). Neither of
these are really reachable anyways (neither 80-bit nor 128-bit things
will get vectorized) but it seems better to just eagerly exclude such
nonesense.

I've added a test case, but while it definitely covers two of the paths
through this code there may be more paths that would benefit from test
coverage. I'm not familiar enough with the SLP vectorizer to synthesize
test cases for all of these, but was able to update the code itself by
inspection.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228899 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-12 02:30:56 +00:00
..
AsmWriter.cpp IR: Add specialized debug info metadata nodes 2015-02-10 00:52:32 +00:00
AsmWriter.h
AttributeImpl.h
Attributes.cpp
AutoUpgrade.cpp [X86] Use i8 immediate for comparison type on AVX512 packed integer instructions. This matches floating point equivalents. Includes autoupgrade support to convert old code. 2015-01-25 23:26:02 +00:00
BasicBlock.cpp Add a pass for inserting safepoints into (nearly) arbitrary IR 2015-02-04 00:37:33 +00:00
CMakeLists.txt Use ADDITIONAL_HEADER_DIRS in all LLVM CMake projects. 2015-02-11 03:28:02 +00:00
Comdat.cpp
ConstantFold.cpp ConstantFold: Shifting undef by zero results in undef 2014-12-18 23:54:43 +00:00
ConstantFold.h
ConstantRange.cpp
Constants.cpp
ConstantsContext.h
Core.cpp Fix LLVMSetMetadata and LLVMAddNamedMetadataOperand for single value MDNodes 2015-01-28 16:35:59 +00:00
DataLayout.cpp DataLayout: Report when the preferred alignment is less than the ABI 2015-02-11 09:13:09 +00:00
DebugInfo.cpp Debug info: Use DW_OP_bit_piece instead of DW_OP_piece in the 2015-02-09 23:57:15 +00:00
DebugInfoMetadata.cpp IR: Remove unnecessary fields from MDTemplateParameter 2015-02-10 01:59:57 +00:00
DebugLoc.cpp IR: Cleanup dead code, NFC 2015-01-16 17:31:29 +00:00
DiagnosticInfo.cpp IR: Split Metadata from Value 2014-12-09 18:38:53 +00:00
DiagnosticPrinter.cpp
DIBuilder.cpp Allow DIBuilder::replaceVTableHolder() to work with temporary nodes, 2015-02-11 17:45:10 +00:00
Dominators.cpp [PM] Port domtree to the new pass manager (at last). 2015-01-14 10:19:28 +00:00
Function.cpp Masked Gather and Scatter Intrinsics. 2015-02-08 08:27:19 +00:00
GCOV.cpp llvm-cov: Don't use llvm::outs() in library code 2015-01-23 23:09:27 +00:00
Globals.cpp The leak detector is dead, long live asan and valgrind. 2014-12-22 13:00:36 +00:00
GVMaterializer.cpp
InlineAsm.cpp Reformat (and remove some tabs) to make debugging this code a 2015-02-10 21:15:06 +00:00
Instruction.cpp The leak detector is dead, long live asan and valgrind. 2014-12-22 13:00:36 +00:00
Instructions.cpp IR: Split Metadata from Value 2014-12-09 18:38:53 +00:00
IntrinsicInst.cpp IR: Split Metadata from Value 2014-12-09 18:38:53 +00:00
IRBuilder.cpp [Statepoint] Improve two asserts, fix some style (NFC) 2015-02-09 23:02:10 +00:00
IRPrintingPasses.cpp [PM] Switch the new pass manager to use a reference-based API for IR 2015-01-05 02:47:05 +00:00
LegacyPassManager.cpp [LPM] A targeted but somewhat horrible fix to the legacy pass manager's 2015-01-28 09:47:21 +00:00
LLVMBuild.txt
LLVMContext.cpp Fix LLVMContext to match what MDKind names that the LL parser permits. Fixes PR21799! 2014-12-11 02:10:28 +00:00
LLVMContextImpl.cpp Revert GCStrategy ownership changes 2015-01-26 18:26:35 +00:00
LLVMContextImpl.h IR: Remove unnecessary fields from MDTemplateParameter 2015-02-10 01:59:57 +00:00
Makefile
Mangler.cpp
MDBuilder.cpp IR: Return unique_ptr from MDNode::getTemporary() 2015-01-19 21:30:18 +00:00
Metadata.cpp IR: Add MDNode::replaceWithPermanent() 2015-02-10 19:13:46 +00:00
MetadataImpl.h Added missing header for the explicit dependency on MDNode. 2015-02-04 00:20:52 +00:00
MetadataTracking.cpp IR: Store RAUW support and Context in the same pointer, NFC 2015-01-19 19:02:06 +00:00
Module.cpp Verifier: Check for null operands in !llvm.module.flags 2015-02-11 09:13:06 +00:00
module.modulemap
Pass.cpp Refactoring cl::parser construction and initialization. 2015-01-22 21:01:12 +00:00
PassManager.cpp [PM] Push the debug option for the new pass manager into the opt tool 2015-01-13 22:42:38 +00:00
PassRegistry.cpp
Statepoint.cpp Intrinsics: introduce llvm_any_ty aka ValueType Any 2015-01-22 20:14:38 +00:00
SymbolTableListTraitsImpl.h
Type.cpp [slp] Fix a nasty bug in the SLP vectorizer that Joerg pointed out. 2015-02-12 02:30:56 +00:00
TypeFinder.cpp IR: Split Metadata from Value 2014-12-09 18:38:53 +00:00
Use.cpp
UseListOrder.cpp
User.cpp
Value.cpp isDereferenceablePointer: look through gc.relocate calls 2015-02-09 21:08:03 +00:00
ValueSymbolTable.cpp IR: Split Metadata from Value 2014-12-09 18:38:53 +00:00
ValueTypes.cpp
Verifier.cpp Verifier: Check for null operands in !llvm.module.flags 2015-02-11 09:13:06 +00:00