Skip to content

Commit 89217ff

Browse files
committed
[IA] Fix crash when dealing with deinterleave(interleave)
Having a sequence of `deinterleave2(interleave2)` causes a crash due to recent change that expects `getMaskOperand` to only work with load or store intrinsics. The change relaxes this and moves `llvm_unreachables` into lowering of interleaved loads or stores
1 parent 67b5195 commit 89217ff

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

llvm/lib/CodeGen/InterleavedAccessPass.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ static bool isReInterleaveMask(ShuffleVectorInst *SVI, unsigned &Factor,
256256
static Value *getMaskOperand(IntrinsicInst *II) {
257257
switch (II->getIntrinsicID()) {
258258
default:
259-
llvm_unreachable("Unexpected intrinsic");
259+
return nullptr;
260260
case Intrinsic::vp_load:
261261
return II->getOperand(1);
262262
case Intrinsic::masked_load:
@@ -382,8 +382,11 @@ bool InterleavedAccessImpl::lowerInterleavedLoad(
382382
if (LI) {
383383
LLVM_DEBUG(dbgs() << "IA: Found an interleaved load: " << *Load << "\n");
384384
} else {
385+
Value *MaskOperand = getMaskOperand(II);
386+
if (!MaskOperand)
387+
llvm_unreachable("unsupported intrinsic");
385388
// Check mask operand. Handle both all-true/false and interleaved mask.
386-
Mask = getMask(getMaskOperand(II), Factor, VecTy);
389+
Mask = getMask(MaskOperand, Factor, VecTy);
387390
if (!Mask)
388391
return false;
389392

@@ -534,10 +537,12 @@ bool InterleavedAccessImpl::lowerInterleavedStore(
534537
if (SI) {
535538
LLVM_DEBUG(dbgs() << "IA: Found an interleaved store: " << *Store << "\n");
536539
} else {
540+
Value *MaskOperand = getMaskOperand(II);
541+
if (!MaskOperand)
542+
llvm_unreachable("unsupported intrinsic");
537543
// Check mask operand. Handle both all-true/false and interleaved mask.
538544
unsigned LaneMaskLen = NumStoredElements / Factor;
539-
Mask = getMask(getMaskOperand(II), Factor,
540-
ElementCount::getFixed(LaneMaskLen));
545+
Mask = getMask(MaskOperand, Factor, ElementCount::getFixed(LaneMaskLen));
541546
if (!Mask)
542547
return false;
543548

@@ -634,9 +639,12 @@ bool InterleavedAccessImpl::lowerDeinterleaveIntrinsic(
634639
<< " and factor = " << Factor << "\n");
635640
} else {
636641
assert(II);
642+
Value *MaskOperand = getMaskOperand(II);
643+
if (!MaskOperand)
644+
return false;
637645

638646
// Check mask operand. Handle both all-true/false and interleaved mask.
639-
Mask = getMask(getMaskOperand(II), Factor, getDeinterleavedVectorType(DI));
647+
Mask = getMask(MaskOperand, Factor, getDeinterleavedVectorType(DI));
640648
if (!Mask)
641649
return false;
642650

@@ -673,8 +681,11 @@ bool InterleavedAccessImpl::lowerInterleaveIntrinsic(
673681

674682
Value *Mask = nullptr;
675683
if (II) {
684+
Value *MaskOperand = getMaskOperand(II);
685+
if (!MaskOperand)
686+
return false;
676687
// Check mask operand. Handle both all-true/false and interleaved mask.
677-
Mask = getMask(getMaskOperand(II), Factor,
688+
Mask = getMask(MaskOperand, Factor,
678689
cast<VectorType>(InterleaveValues[0]->getType()));
679690
if (!Mask)
680691
return false;

llvm/test/CodeGen/X86/x86-interleaved-access.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,3 +1897,15 @@ define <2 x i64> @PR37616(ptr %a0) nounwind {
18971897
%shuffle = shufflevector <16 x i64> %load, <16 x i64> undef, <2 x i32> <i32 2, i32 6>
18981898
ret <2 x i64> %shuffle
18991899
}
1900+
1901+
define { <8 x float>, <8 x float> } @interleave_deinterleave2() {
1902+
; AVX-LABEL: interleave_deinterleave2:
1903+
; AVX: # %bb.0: # %.entry
1904+
; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0
1905+
; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
1906+
; AVX-NEXT: retq
1907+
.entry:
1908+
%0 = call <16 x float> @llvm.vector.interleave2.v16f32(<8 x float> zeroinitializer, <8 x float> zeroinitializer)
1909+
%1 = call { <8 x float>, <8 x float> } @llvm.vector.deinterleave2.v16f32(<16 x float> %0)
1910+
ret { <8 x float>, <8 x float> } %1
1911+
}

0 commit comments

Comments
 (0)