mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-01 09:18:30 +00:00
[DAGCombiner] Avoid calling method 'isShuffleMaskLegal' on illegal vector types.
This patch fixes a crasher in method 'DAGCombiner::visitOR' due to an invalid call to method 'isShuffleMaskLegal'. On x86, method 'isShuffleMaskLegal' always expects a legal vector value type in input. With this patch, we immediately check if the input OR dag node has a legal vector type; we only try to fold a OR dag node into a single shufflevector if we know that the resulting shuffle will have a legal type. This is to avoid calling method 'isShuffleMaskLegal' on a potentially illegal vector value type. Added a new test-case to file 'CodeGen/X86/combine-or.ll' to verify that DAGCombiner doesn't crash in the attempt to check/combine an OR between shuffles with illegal types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213020 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b7df516d1f
commit
217cd18656
@ -3255,6 +3255,8 @@ SDValue DAGCombiner::visitOR(SDNode *N) {
|
||||
// Do this only if the resulting shuffle is legal.
|
||||
if (isa<ShuffleVectorSDNode>(N0) &&
|
||||
isa<ShuffleVectorSDNode>(N1) &&
|
||||
// Avoid folding a node with illegal type.
|
||||
TLI.isTypeLegal(VT) &&
|
||||
N0->getOperand(1) == N1->getOperand(1) &&
|
||||
ISD::isBuildVectorAllZeros(N0.getOperand(1).getNode())) {
|
||||
bool CanFold = true;
|
||||
|
@ -266,4 +266,16 @@ define <2 x i64> @test21(<2 x i64> %a, <2 x i64> %b) {
|
||||
; CHECK-NEXT: pslldq
|
||||
; CHECK-NEXT: ret
|
||||
|
||||
; Verify that the DAGCombiner doesn't crash in the attempt to check if a shuffle
|
||||
; with illegal type has a legal mask. Method 'isShuffleMaskLegal' only knows how to
|
||||
; handle legal vector value types.
|
||||
define <4 x i8> @test_crash(<4 x i8> %a, <4 x i8> %b) {
|
||||
%shuf1 = shufflevector <4 x i8> %a, <4 x i8> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3>
|
||||
%shuf2 = shufflevector <4 x i8> %b, <4 x i8> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4>
|
||||
%or = or <4 x i8> %shuf1, %shuf2
|
||||
ret <4 x i8> %or
|
||||
}
|
||||
; CHECK-LABEL: test_crash
|
||||
; CHECK: movsd
|
||||
; CHECK: ret
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user