Skip to content

Commit 0a04a06

Browse files
committed
GlobalISel: Add more verifier checks for G_SHUFFLE_VECTOR
llvm-svn: 368705
1 parent 5af9cf0 commit 0a04a06

File tree

4 files changed

+82
-11
lines changed

4 files changed

+82
-11
lines changed

llvm/lib/CodeGen/MachineVerifier.cpp

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1395,12 +1395,46 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
13951395
}
13961396

13971397
const Constant *Mask = MaskOp.getShuffleMask();
1398+
auto *MaskVT = dyn_cast<VectorType>(Mask->getType());
1399+
if (!MaskVT || !MaskVT->getElementType()->isIntegerTy(32)) {
1400+
report("Invalid shufflemask constant type", MI);
1401+
break;
1402+
}
1403+
13981404
if (!Mask->getAggregateElement(0u)) {
13991405
report("Invalid shufflemask constant type", MI);
14001406
break;
14011407
}
14021408

1403-
// TODO: Verify element numbers consistent
1409+
LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1410+
LLT Src0Ty = MRI->getType(MI->getOperand(1).getReg());
1411+
LLT Src1Ty = MRI->getType(MI->getOperand(2).getReg());
1412+
1413+
if (Src0Ty != Src1Ty)
1414+
report("Source operands must be the same type", MI);
1415+
1416+
if (Src0Ty.getScalarType() != DstTy.getScalarType())
1417+
report("G_SHUFFLE_VECTOR cannot change element type", MI);
1418+
1419+
// Don't check that all operands are vector because scalars are used in
1420+
// place of 1 element vectors.
1421+
int SrcNumElts = Src0Ty.isVector() ? Src0Ty.getNumElements() : 1;
1422+
int DstNumElts = DstTy.isVector() ? DstTy.getNumElements() : 1;
1423+
1424+
SmallVector<int, 32> MaskIdxes;
1425+
ShuffleVectorInst::getShuffleMask(Mask, MaskIdxes);
1426+
1427+
if (static_cast<int>(MaskIdxes.size()) != DstNumElts)
1428+
report("Wrong result type for shufflemask", MI);
1429+
1430+
for (int Idx : MaskIdxes) {
1431+
if (Idx < 0)
1432+
continue;
1433+
1434+
if (Idx >= 2 * SrcNumElts)
1435+
report("Out of bounds shuffle index", MI);
1436+
}
1437+
14041438
break;
14051439
}
14061440
default:

llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,17 @@ define i32 @test_shufflevector_s32_v2s32(i32 %arg) {
446446
ret i32 %res
447447
}
448448

449+
define i32 @test_shufflevector_s32_s32_s32(i32 %arg) {
450+
; CHECK-LABEL: name: test_shufflevector_s32_s32_s32
451+
; CHECK: [[ARG:%[0-9]+]]:_(s32) = COPY $r0
452+
; CHECK-DAG: [[UNDEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
453+
; CHECK: [[VEC:%[0-9]+]]:_(s32) = G_SHUFFLE_VECTOR [[ARG]](s32), [[UNDEF]], shufflemask(0)
454+
%vec = insertelement <1 x i32> undef, i32 %arg, i32 0
455+
%shuffle = shufflevector <1 x i32> %vec, <1 x i32> undef, <1 x i32> zeroinitializer
456+
%res = extractelement <1 x i32> %shuffle, i32 0
457+
ret i32 %res
458+
}
459+
449460
define i32 @test_shufflevector_v2s32_v3s32(i32 %arg1, i32 %arg2) {
450461
; CHECK-LABEL: name: test_shufflevector_v2s32_v3s32
451462
; CHECK: [[ARG1:%[0-9]+]]:_(s32) = COPY $r0

llvm/test/CodeGen/MIR/AArch64/parse-shufflemask.mir

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,9 @@ body: |
134134
135135
%0:_(<2 x s32>) = COPY $d0
136136
%2:_(<2 x s32>) = G_IMPLICIT_DEF
137-
%1:_(<2 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %2, shufflemask(0)
138-
$d0 = COPY %1(<2 x s32>)
139-
RET_ReallyLR implicit $d0
137+
%1:_(s32) = G_SHUFFLE_VECTOR %0(<2 x s32>), %2, shufflemask(0)
138+
$w0 = COPY %1
139+
RET_ReallyLR implicit $w0
140140
141141
...
142142

@@ -151,9 +151,9 @@ body: |
151151
152152
%0:_(<2 x s32>) = COPY $d0
153153
%2:_(<2 x s32>) = G_IMPLICIT_DEF
154-
%1:_(<2 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %2, shufflemask(1)
155-
$d0 = COPY %1(<2 x s32>)
156-
RET_ReallyLR implicit $d0
154+
%1:_(s32) = G_SHUFFLE_VECTOR %0(<2 x s32>), %2, shufflemask(1)
155+
$w0 = COPY %1
156+
RET_ReallyLR implicit $w0
157157
158158
...
159159

@@ -168,8 +168,8 @@ body: |
168168
169169
%0:_(<2 x s32>) = COPY $d0
170170
%2:_(<2 x s32>) = G_IMPLICIT_DEF
171-
%1:_(<2 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %2, shufflemask(undef)
172-
$d0 = COPY %1(<2 x s32>)
173-
RET_ReallyLR implicit $d0
171+
%1:_(s32) = G_SHUFFLE_VECTOR %0(<2 x s32>), %2, shufflemask(undef)
172+
$w0 = COPY %1
173+
RET_ReallyLR implicit $w0
174174
175175
...

llvm/test/MachineVerifier/test_g_shuffle_vector.mir

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# RUN: not llc -o - -march=arm64 -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
1+
# RUN: not llc -o - -march=arm64 -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
22
# REQUIRES: aarch64-registered-target
33
---
44
name: g_shuffle_vector
@@ -26,4 +26,30 @@ body: |
2626
; CHECK: Bad machine code: Incorrect mask operand type for G_SHUFFLE_VECTOR
2727
%9:_(<4 x s32>) = G_SHUFFLE_VECTOR %0, %1, i32 0
2828
29+
; CHECK: Bad machine code: Wrong result type for shufflemask
30+
%10:_(<4 x s32>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0, 2)
31+
32+
; CHECK: Bad machine code: Wrong result type for shufflemask
33+
%11:_(<2 x s32>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0, 2, 1, 1)
34+
35+
; CHECK: Bad machine code: G_SHUFFLE_VECTOR cannot change element type
36+
%12:_(<4 x s16>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0, 2, 1, 1)
37+
38+
; CHECK: Bad machine code: Source operands must be the same type
39+
%13:_(<4 x s32>) = G_SHUFFLE_VECTOR %0, %2, shufflemask(0, 2, 1, 1)
40+
41+
; CHECK: Bad machine code: Out of bounds shuffle index
42+
%14:_(<4 x s32>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0, 2, 1, 4)
43+
44+
; CHECK: Bad machine code: Out of bounds shuffle index
45+
%15:_(<4 x s32>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0, 2, 1, 5)
46+
47+
%19:_(s16) = G_CONSTANT i16 0
48+
49+
; CHECK: Bad machine code: Source operands must be the same type
50+
%20:_(<2 x s32>) = G_SHUFFLE_VECTOR %3, %19, shufflemask(1, 0)
51+
52+
; CHECK: Bad machine code: G_SHUFFLE_VECTOR cannot change element type
53+
%21:_(s16) = G_SHUFFLE_VECTOR %3, %4, shufflemask(0)
54+
2955
...

0 commit comments

Comments
 (0)