The crash happens because the cast for `Mask = cast<ShuffleVectorSDNode>(Res)->getMask();` fails for node `t197: v16i8 = vector_shuffle<16,17,18,19,4,5,6,7,8,9,10,11,u,u,u,u> t196, t196`. However, both `LHS` and `RHS` are the same node, so `DAG.getCommutedVectorShuffle` doesn't return a `ShuffleVectorSDNode` and crashes. The fix is to add a check before the cast is performed. Closes https://github.com/llvm/llvm-project/issues/172265
95 lines
4.1 KiB
LLVM
95 lines
4.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck -check-prefix=CHECK-LE %s
|
|
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck -check-prefix=CHECK-BE %s
|
|
|
|
define <32 x i32> @issue_172265(<32 x i32> %BS_ARG_1, <3 x i32> %0) {
|
|
; CHECK-LABEL: issue_172265:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addis 3, 2, .LCPI18_0@toc@ha
|
|
; CHECK-NEXT: vspltw 3, 10, 1
|
|
; CHECK-NEXT: addi 3, 3, .LCPI18_0@toc@l
|
|
; CHECK-NEXT: vmr 7, 3
|
|
; CHECK-NEXT: lvx 4, 0, 3
|
|
; CHECK-NEXT: addis 3, 2, .LCPI18_1@toc@ha
|
|
; CHECK-NEXT: addi 3, 3, .LCPI18_1@toc@l
|
|
; CHECK-NEXT: vmr 8, 3
|
|
; CHECK-NEXT: vmr 9, 3
|
|
; CHECK-NEXT: vperm 4, 3, 3, 4
|
|
; CHECK-NEXT: lvx 1, 0, 3
|
|
; CHECK-NEXT: addis 3, 2, .LCPI18_2@toc@ha
|
|
; CHECK-NEXT: addi 3, 3, .LCPI18_2@toc@l
|
|
; CHECK-NEXT: lvx 5, 0, 3
|
|
; CHECK-NEXT: addis 3, 2, .LCPI18_3@toc@ha
|
|
; CHECK-NEXT: addi 3, 3, .LCPI18_3@toc@l
|
|
; CHECK-NEXT: lvx 6, 0, 3
|
|
; CHECK-NEXT: addis 3, 2, .LCPI18_4@toc@ha
|
|
; CHECK-NEXT: addi 3, 3, .LCPI18_4@toc@l
|
|
; CHECK-NEXT: vperm 4, 2, 4, 1
|
|
; CHECK-NEXT: lvx 2, 0, 3
|
|
; CHECK-NEXT: vperm 0, 3, 3, 5
|
|
; CHECK-NEXT: vperm 5, 3, 3, 6
|
|
; CHECK-NEXT: vperm 6, 3, 3, 2
|
|
; CHECK-NEXT: vmr 2, 0
|
|
; CHECK-NEXT: blr
|
|
; CHECK-LE-LABEL: issue_172265:
|
|
; CHECK-LE: # %bb.0: # %entry
|
|
; CHECK-LE-NEXT: addis 3, 2, .LCPI0_0@toc@ha
|
|
; CHECK-LE-NEXT: xxspltw 35, 42, 1
|
|
; CHECK-LE-NEXT: addi 3, 3, .LCPI0_0@toc@l
|
|
; CHECK-LE-NEXT: vmr 7, 3
|
|
; CHECK-LE-NEXT: vmr 8, 3
|
|
; CHECK-LE-NEXT: vmr 9, 3
|
|
; CHECK-LE-NEXT: lxvd2x 0, 0, 3
|
|
; CHECK-LE-NEXT: addis 3, 2, .LCPI0_1@toc@ha
|
|
; CHECK-LE-NEXT: addi 3, 3, .LCPI0_1@toc@l
|
|
; CHECK-LE-NEXT: lxvd2x 1, 0, 3
|
|
; CHECK-LE-NEXT: addis 3, 2, .LCPI0_2@toc@ha
|
|
; CHECK-LE-NEXT: addi 3, 3, .LCPI0_2@toc@l
|
|
; CHECK-LE-NEXT: lxvd2x 2, 0, 3
|
|
; CHECK-LE-NEXT: addis 3, 2, .LCPI0_3@toc@ha
|
|
; CHECK-LE-NEXT: addi 3, 3, .LCPI0_3@toc@l
|
|
; CHECK-LE-NEXT: xxswapd 36, 0
|
|
; CHECK-LE-NEXT: lxvd2x 0, 0, 3
|
|
; CHECK-LE-NEXT: vperm 4, 2, 3, 4
|
|
; CHECK-LE-NEXT: xxswapd 37, 1
|
|
; CHECK-LE-NEXT: vperm 2, 3, 3, 5
|
|
; CHECK-LE-NEXT: xxswapd 32, 2
|
|
; CHECK-LE-NEXT: vperm 5, 3, 3, 0
|
|
; CHECK-LE-NEXT: xxswapd 33, 0
|
|
; CHECK-LE-NEXT: vperm 6, 3, 3, 1
|
|
; CHECK-LE-NEXT: blr
|
|
;
|
|
; CHECK-BE-LABEL: issue_172265:
|
|
; CHECK-BE: # %bb.0: # %entry
|
|
; CHECK-BE-NEXT: addis 3, 2, .LCPI0_0@toc@ha
|
|
; CHECK-BE-NEXT: vspltw 3, 10, 2
|
|
; CHECK-BE-NEXT: addi 3, 3, .LCPI0_0@toc@l
|
|
; CHECK-BE-NEXT: vmr 7, 3
|
|
; CHECK-BE-NEXT: lvx 4, 0, 3
|
|
; CHECK-BE-NEXT: addis 3, 2, .LCPI0_2@toc@ha
|
|
; CHECK-BE-NEXT: addi 3, 3, .LCPI0_2@toc@l
|
|
; CHECK-BE-NEXT: lvx 5, 0, 3
|
|
; CHECK-BE-NEXT: addis 3, 2, .LCPI0_3@toc@ha
|
|
; CHECK-BE-NEXT: addi 3, 3, .LCPI0_3@toc@l
|
|
; CHECK-BE-NEXT: vperm 0, 3, 3, 5
|
|
; CHECK-BE-NEXT: lvx 5, 0, 3
|
|
; CHECK-BE-NEXT: addis 3, 2, .LCPI0_1@toc@ha
|
|
; CHECK-BE-NEXT: addi 3, 3, .LCPI0_1@toc@l
|
|
; CHECK-BE-NEXT: lvx 1, 0, 3
|
|
; CHECK-BE-NEXT: addis 3, 2, .LCPI0_4@toc@ha
|
|
; CHECK-BE-NEXT: addi 3, 3, .LCPI0_4@toc@l
|
|
; CHECK-BE-NEXT: vperm 4, 3, 3, 4
|
|
; CHECK-BE-NEXT: vperm 4, 4, 2, 1
|
|
; CHECK-BE-NEXT: lvx 2, 0, 3
|
|
; CHECK-BE-NEXT: vperm 5, 3, 3, 5
|
|
; CHECK-BE-NEXT: vperm 6, 3, 3, 2
|
|
; CHECK-BE-NEXT: vmr 2, 0
|
|
; CHECK-BE-NEXT: vmr 8, 3
|
|
; CHECK-BE-NEXT: vmr 9, 3
|
|
; CHECK-BE-NEXT: blr
|
|
entry:
|
|
%vecinit37 = shufflevector <3 x i32> %0, <3 x i32> zeroinitializer, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
|
|
%shuffle56 = shufflevector <32 x i32> %vecinit37, <32 x i32> %BS_ARG_1, <32 x i32> <i32 4, i32 9, i32 3, i32 3, i32 4, i32 1, i32 1, i32 0, i32 16, i32 5, i32 5, i32 34, i32 3, i32 0, i32 8, i32 2, i32 8, i32 1, i32 0, i32 0, i32 0, i32 1, i32 0, i32 0, i32 7, i32 5, i32 3, i32 6, i32 0, i32 3, i32 4, i32 7>
|
|
ret <32 x i32> %shuffle56
|
|
}
|