mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
[X86][AVX] Fix failure due to a missing ISel pattern to select VBROADCAST nodes (PR23259).
This fixes a regression introduced at revision 218263. On AVX, if we optimize for size, a splat build_vector of a load is lowered into a VBROADCAST node. This is done even if the value type of the splat build_vector node is v2i64. Since AVX doesn't support v2f64/v2i64 broadcasts, revision 218263 added two extra tablegen patterns to allow selecting a VMOVDDUPrm from an X86VBroadcast where the scalar element comes from a loadi64/loadf64. However, revision 218263 forgot to add an extra fallback pattern for the case where we have a X86VBroadcast of a loadi64 with multiple uses. This patch adds the missing tablegen pattern in X86InstrSSE.td. This patch also adds an extra test to 'splat-for-size.ll' to verify that ISel doesn't crash with a 'fatal error in the backend' due to a missing AVX pattern to select v2i64 X86ISD::BROADCAST nodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235509 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -5223,9 +5223,9 @@ let Predicates = [HasAVX] in {
|
||||
|
||||
let Predicates = [UseAVX, OptForSize] in {
|
||||
def : Pat<(v2f64 (X86VBroadcast (loadf64 addr:$src))),
|
||||
(VMOVDDUPrm addr:$src)>;
|
||||
(VMOVDDUPrm addr:$src)>;
|
||||
def : Pat<(v2i64 (X86VBroadcast (loadi64 addr:$src))),
|
||||
(VMOVDDUPrm addr:$src)>;
|
||||
(VMOVDDUPrm addr:$src)>;
|
||||
}
|
||||
|
||||
let Predicates = [UseSSE3] in {
|
||||
@@ -8478,6 +8478,8 @@ let Predicates = [HasAVX] in {
|
||||
|
||||
def : Pat<(v2f64 (X86VBroadcast f64:$src)),
|
||||
(VMOVDDUPrr (COPY_TO_REGCLASS FR64:$src, VR128))>;
|
||||
def : Pat<(v2i64 (X86VBroadcast i64:$src)),
|
||||
(VMOVDDUPrr (COPY_TO_REGCLASS GR64:$src, VR128))>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Reference in New Issue
Block a user