Skip to content

Commit 74984de

Browse files
committed
[X86][CodeGen] Convert masked.load/store to CLOAD/CSTORE node only when vector size = 1
This fixes the crash when building llvm-test-suite with avx512f + cf.
1 parent 009082a commit 74984de

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4798,8 +4798,11 @@ void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
47984798
const auto &TTI =
47994799
TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
48004800
SDValue StoreNode =
4801-
!IsCompressing && TTI.hasConditionalLoadStoreForType(
4802-
I.getArgOperand(0)->getType()->getScalarType())
4801+
!IsCompressing &&
4802+
cast<FixedVectorType>(I.getArgOperand(0)->getType())
4803+
->getNumElements() == 1 &&
4804+
TTI.hasConditionalLoadStoreForType(
4805+
I.getArgOperand(0)->getType()->getScalarType())
48034806
? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
48044807
Mask)
48054808
: DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
@@ -4984,8 +4987,10 @@ void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
49844987
// variables.
49854988
SDValue Load;
49864989
SDValue Res;
4987-
if (!IsExpanding && TTI.hasConditionalLoadStoreForType(
4988-
Src0Operand->getType()->getScalarType()))
4990+
if (!IsExpanding &&
4991+
cast<FixedVectorType>(Src0Operand->getType())->getNumElements() == 1 &&
4992+
TTI.hasConditionalLoadStoreForType(
4993+
Src0Operand->getType()->getScalarType()))
49894994
Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
49904995
else
49914996
Res = Load =

llvm/test/CodeGen/X86/apx/cf.ll

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=x86_64 -mattr=+cf -verify-machineinstrs | FileCheck %s
2+
; RUN: llc < %s -mtriple=x86_64 -mattr=+cf,+avx512f -verify-machineinstrs | FileCheck %s
33

44
define void @basic(i32 %a, ptr %b, ptr %p, ptr %q) {
55
; CHECK-LABEL: basic:
@@ -103,3 +103,24 @@ entry:
103103
%2 = bitcast <1 x i64> %1 to i64
104104
ret i64 %2
105105
}
106+
107+
define void @no_crash(ptr %p, <4 x i1> %cond1, <4 x i1> %cond2) {
108+
; CHECK-LABEL: no_crash:
109+
; CHECK: # %bb.0: # %entry
110+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
111+
; CHECK-NEXT: vptestmd %zmm1, %zmm1, %k0
112+
; CHECK-NEXT: kshiftlw $12, %k0, %k0
113+
; CHECK-NEXT: kshiftrw $12, %k0, %k1
114+
; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
115+
; CHECK-NEXT: vptestmd %zmm0, %zmm0, %k0
116+
; CHECK-NEXT: kshiftlw $12, %k0, %k0
117+
; CHECK-NEXT: kshiftrw $12, %k0, %k2
118+
; CHECK-NEXT: vmovdqu64 (%rdi), %zmm0 {%k2} {z}
119+
; CHECK-NEXT: vmovdqu64 %zmm0, (%rdi) {%k1}
120+
; CHECK-NEXT: vzeroupper
121+
; CHECK-NEXT: retq
122+
entry:
123+
%0 = call <4 x i64> @llvm.masked.load.v4i64.p0(ptr %p, i32 8, <4 x i1> %cond1, <4 x i64> poison)
124+
call void @llvm.masked.store.v4i64.p0(<4 x i64> %0, ptr %p, i32 8, <4 x i1> %cond2)
125+
ret void
126+
}

0 commit comments

Comments
 (0)