Skip to content

Commit b5f7058

Browse files
authored
[AArch64][GlobalISel] Don't crash when legalising vector G_SHL (#168848)
1 parent c4def46 commit b5f7058

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6684,13 +6684,24 @@ LegalizerHelper::moreElementsVector(MachineInstr &MI, unsigned TypeIdx,
66846684
case TargetOpcode::G_FMAXIMUMNUM:
66856685
case TargetOpcode::G_STRICT_FADD:
66866686
case TargetOpcode::G_STRICT_FSUB:
6687-
case TargetOpcode::G_STRICT_FMUL:
6687+
case TargetOpcode::G_STRICT_FMUL: {
6688+
Observer.changingInstr(MI);
6689+
moreElementsVectorSrc(MI, MoreTy, 1);
6690+
moreElementsVectorSrc(MI, MoreTy, 2);
6691+
moreElementsVectorDst(MI, MoreTy, 0);
6692+
Observer.changedInstr(MI);
6693+
return Legalized;
6694+
}
66886695
case TargetOpcode::G_SHL:
66896696
case TargetOpcode::G_ASHR:
66906697
case TargetOpcode::G_LSHR: {
66916698
Observer.changingInstr(MI);
66926699
moreElementsVectorSrc(MI, MoreTy, 1);
6693-
moreElementsVectorSrc(MI, MoreTy, 2);
6700+
// The shift operand may have a different scalar type from the source and
6701+
// destination operands.
6702+
LLT ShiftMoreTy = MoreTy.changeElementType(
6703+
MRI.getType(MI.getOperand(2).getReg()).getElementType());
6704+
moreElementsVectorSrc(MI, ShiftMoreTy, 2);
66946705
moreElementsVectorDst(MI, MoreTy, 0);
66956706
Observer.changedInstr(MI);
66966707
return Legalized;
@@ -6806,12 +6817,10 @@ LegalizerHelper::moreElementsVector(MachineInstr &MI, unsigned TypeIdx,
68066817
LLT DstExtTy;
68076818
if (TypeIdx == 0) {
68086819
DstExtTy = MoreTy;
6809-
SrcExtTy = LLT::fixed_vector(
6810-
MoreTy.getNumElements(),
6820+
SrcExtTy = MoreTy.changeElementType(
68116821
MRI.getType(MI.getOperand(1).getReg()).getElementType());
68126822
} else {
6813-
DstExtTy = LLT::fixed_vector(
6814-
MoreTy.getNumElements(),
6823+
DstExtTy = MoreTy.changeElementType(
68156824
MRI.getType(MI.getOperand(0).getReg()).getElementType());
68166825
SrcExtTy = MoreTy;
68176826
}

llvm/test/CodeGen/AArch64/shift.ll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,37 @@ define <2 x i128> @lshr_v2i128(<2 x i128> %0, <2 x i128> %1){
10331033
ret <2 x i128> %3
10341034
}
10351035

1036+
define <2 x i8> @pr168848(<2 x i1> %shift) {
1037+
; CHECK-SD-LABEL: pr168848:
1038+
; CHECK-SD: // %bb.0: // %entry
1039+
; CHECK-SD-NEXT: movi v1.2s, #1
1040+
; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b
1041+
; CHECK-SD-NEXT: ushl v0.2s, v1.2s, v0.2s
1042+
; CHECK-SD-NEXT: ret
1043+
;
1044+
; CHECK-GI-LABEL: pr168848:
1045+
; CHECK-GI: // %bb.0: // %entry
1046+
; CHECK-GI-NEXT: movi v1.2s, #1
1047+
; CHECK-GI-NEXT: mov w8, #1 // =0x1
1048+
; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
1049+
; CHECK-GI-NEXT: fmov s1, w8
1050+
; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
1051+
; CHECK-GI-NEXT: mov v1.b[1], w8
1052+
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
1053+
; CHECK-GI-NEXT: ushl v0.8b, v1.8b, v0.8b
1054+
; CHECK-GI-NEXT: umov w8, v0.b[0]
1055+
; CHECK-GI-NEXT: umov w9, v0.b[1]
1056+
; CHECK-GI-NEXT: fmov s0, w8
1057+
; CHECK-GI-NEXT: mov v0.s[1], w9
1058+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
1059+
; CHECK-GI-NEXT: ret
1060+
entry:
1061+
%shift.zext = zext <2 x i1> %shift to <2 x i32>
1062+
%ones = shl <2 x i32> splat (i32 1), %shift.zext
1063+
%ones.trunc = trunc <2 x i32> %ones to <2 x i8>
1064+
ret <2 x i8> %ones.trunc
1065+
}
1066+
10361067
; ===== Vector with Non-Pow 2 Width =====
10371068

10381069
define <3 x i8> @shl_v3i8(<3 x i8> %0, <3 x i8> %1){

0 commit comments

Comments
 (0)