Skip to content

Commit 027c728

Browse files
committed
[SelectionDAGBuilder] Don't create MGATHER/MSCATTER with Scale != ElemSize
This is an alternative to D124530. In getUniformBase() only create scales that match the gather/scatter element size. If targets also support other scales, then they can produce those scales in target DAG combines. This is what X86 already does (as long as the resulting scale would be 1, 2, 4 or 8). This essentially restores the pre-opaque-pointer state of things. Fixes llvm/llvm-project#55021. Differential Revision: https://reviews.llvm.org/D124605
1 parent 2c8cb9a commit 027c728

File tree

3 files changed

+279
-7
lines changed

3 files changed

+279
-7
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4361,7 +4361,8 @@ void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
43614361
// In all other cases the function returns 'false'.
43624362
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
43634363
ISD::MemIndexType &IndexType, SDValue &Scale,
4364-
SelectionDAGBuilder *SDB, const BasicBlock *CurBB) {
4364+
SelectionDAGBuilder *SDB, const BasicBlock *CurBB,
4365+
uint64_t ElemSize) {
43654366
SelectionDAG& DAG = SDB->DAG;
43664367
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
43674368
const DataLayout &DL = DAG.getDataLayout();
@@ -4402,9 +4403,11 @@ static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
44024403
Index = SDB->getValue(IndexVal);
44034404
IndexType = ISD::SIGNED_SCALED;
44044405

4405-
// MGATHER/MSCATTER only support scaling by a power-of-two.
4406+
// MGATHER/MSCATTER are only required to support scaling by one or by the
4407+
// element size. Other scales may be produced using target-specific DAG
4408+
// combines.
44064409
uint64_t ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
4407-
if (!isPowerOf2_64(ScaleVal))
4410+
if (ScaleVal != ElemSize && ScaleVal != 1)
44084411
return false;
44094412

44104413
Scale =
@@ -4430,7 +4433,7 @@ void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
44304433
ISD::MemIndexType IndexType;
44314434
SDValue Scale;
44324435
bool UniformBase = getUniformBase(Ptr, Base, Index, IndexType, Scale, this,
4433-
I.getParent());
4436+
I.getParent(), VT.getScalarStoreSize());
44344437

44354438
unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
44364439
MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
@@ -4538,7 +4541,7 @@ void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
45384541
ISD::MemIndexType IndexType;
45394542
SDValue Scale;
45404543
bool UniformBase = getUniformBase(Ptr, Base, Index, IndexType, Scale, this,
4541-
I.getParent());
4544+
I.getParent(), VT.getScalarStoreSize());
45424545
unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
45434546
MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
45444547
MachinePointerInfo(AS), MachineMemOperand::MOLoad,
@@ -7408,7 +7411,8 @@ void SelectionDAGBuilder::visitVPLoadGather(const VPIntrinsic &VPIntrin, EVT VT,
74087411
SDValue Base, Index, Scale;
74097412
ISD::MemIndexType IndexType;
74107413
bool UniformBase = getUniformBase(PtrOperand, Base, Index, IndexType, Scale,
7411-
this, VPIntrin.getParent());
7414+
this, VPIntrin.getParent(),
7415+
VT.getScalarStoreSize());
74127416
if (!UniformBase) {
74137417
Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
74147418
Index = getValue(PtrOperand);
@@ -7464,7 +7468,8 @@ void SelectionDAGBuilder::visitVPStoreScatter(const VPIntrinsic &VPIntrin,
74647468
SDValue Base, Index, Scale;
74657469
ISD::MemIndexType IndexType;
74667470
bool UniformBase = getUniformBase(PtrOperand, Base, Index, IndexType, Scale,
7467-
this, VPIntrin.getParent());
7471+
this, VPIntrin.getParent(),
7472+
VT.getScalarStoreSize());
74687473
if (!UniformBase) {
74697474
Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
74707475
Index = getValue(PtrOperand);
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=x86_64-linux -mcpu=skylake -mattr=+avx2 < %s | FileCheck %s
3+
4+
define <2 x float> @gather_v2f32_scale_512(ptr %result, <2 x i64> %idx, <2 x i1> %mask) {
5+
; CHECK-LABEL: gather_v2f32_scale_512:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vpsllq $9, %xmm0, %xmm2
8+
; CHECK-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
9+
; CHECK-NEXT: vpslld $31, %xmm0, %xmm1
10+
; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0
11+
; CHECK-NEXT: vgatherqps %xmm1, (%rdi,%xmm2), %xmm0
12+
; CHECK-NEXT: retq
13+
%gep = getelementptr inbounds [512 x i8], ptr %result, <2 x i64> %idx
14+
%res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep, i32 0, <2 x i1> %mask, <2 x float> zeroinitializer)
15+
ret <2 x float> %res
16+
}
17+
18+
define <2 x float> @gather_v2f32_scale_16(ptr %result, <2 x i64> %idx, <2 x i1> %mask) {
19+
; CHECK-LABEL: gather_v2f32_scale_16:
20+
; CHECK: # %bb.0:
21+
; CHECK-NEXT: vpsllq $4, %xmm0, %xmm2
22+
; CHECK-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
23+
; CHECK-NEXT: vpslld $31, %xmm0, %xmm1
24+
; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0
25+
; CHECK-NEXT: vgatherqps %xmm1, (%rdi,%xmm2), %xmm0
26+
; CHECK-NEXT: retq
27+
%gep = getelementptr inbounds [16 x i8], ptr %result, <2 x i64> %idx
28+
%res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep, i32 0, <2 x i1> %mask, <2 x float> zeroinitializer)
29+
ret <2 x float> %res
30+
}
31+
32+
define <2 x float> @gather_v2f32_scale_8(ptr %result, <2 x i64> %idx, <2 x i1> %mask) {
33+
; CHECK-LABEL: gather_v2f32_scale_8:
34+
; CHECK: # %bb.0:
35+
; CHECK-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
36+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm2
37+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
38+
; CHECK-NEXT: vgatherqps %xmm2, (%rdi,%xmm0,8), %xmm1
39+
; CHECK-NEXT: vmovaps %xmm1, %xmm0
40+
; CHECK-NEXT: retq
41+
%gep = getelementptr inbounds [8 x i8], ptr %result, <2 x i64> %idx
42+
%res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep, i32 0, <2 x i1> %mask, <2 x float> zeroinitializer)
43+
ret <2 x float> %res
44+
}
45+
46+
define <2 x float> @gather_v2f32_scale_4(ptr %result, <2 x i64> %idx, <2 x i1> %mask) {
47+
; CHECK-LABEL: gather_v2f32_scale_4:
48+
; CHECK: # %bb.0:
49+
; CHECK-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
50+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm2
51+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
52+
; CHECK-NEXT: vgatherqps %xmm2, (%rdi,%xmm0,4), %xmm1
53+
; CHECK-NEXT: vmovaps %xmm1, %xmm0
54+
; CHECK-NEXT: retq
55+
%gep = getelementptr inbounds [4 x i8], ptr %result, <2 x i64> %idx
56+
%res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep, i32 0, <2 x i1> %mask, <2 x float> zeroinitializer)
57+
ret <2 x float> %res
58+
}
59+
60+
define <2 x float> @gather_v2f32_scale_3(ptr %result, <2 x i64> %idx, <2 x i1> %mask) {
61+
; CHECK-LABEL: gather_v2f32_scale_3:
62+
; CHECK: # %bb.0:
63+
; CHECK-NEXT: vpaddq %xmm0, %xmm0, %xmm2
64+
; CHECK-NEXT: vpaddq %xmm0, %xmm2, %xmm2
65+
; CHECK-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
66+
; CHECK-NEXT: vpslld $31, %xmm0, %xmm1
67+
; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0
68+
; CHECK-NEXT: vgatherqps %xmm1, (%rdi,%xmm2), %xmm0
69+
; CHECK-NEXT: retq
70+
%gep = getelementptr inbounds [3 x i8], ptr %result, <2 x i64> %idx
71+
%res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep, i32 0, <2 x i1> %mask, <2 x float> zeroinitializer)
72+
ret <2 x float> %res
73+
}
74+
75+
define <2 x float> @gather_v2f32_scale_1(ptr %result, <2 x i64> %idx, <2 x i1> %mask) {
76+
; CHECK-LABEL: gather_v2f32_scale_1:
77+
; CHECK: # %bb.0:
78+
; CHECK-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
79+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm2
80+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
81+
; CHECK-NEXT: vgatherqps %xmm2, (%rdi,%xmm0), %xmm1
82+
; CHECK-NEXT: vmovaps %xmm1, %xmm0
83+
; CHECK-NEXT: retq
84+
%gep = getelementptr inbounds [1 x i8], ptr %result, <2 x i64> %idx
85+
%res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep, i32 0, <2 x i1> %mask, <2 x float> zeroinitializer)
86+
ret <2 x float> %res
87+
}
88+
89+
declare <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr>, i32 immarg, <2 x i1>, <2 x float>)
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=x86_64-linux -mcpu=skylake-avx512 < %s | FileCheck %s
3+
4+
define void @scatter_scale_512(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
5+
; CHECK-LABEL: scatter_scale_512:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
8+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
9+
; CHECK-NEXT: vpsllq $9, %ymm0, %ymm0
10+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
11+
; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}
12+
; CHECK-NEXT: vzeroupper
13+
; CHECK-NEXT: retq
14+
%gep = getelementptr inbounds [512 x i8], ptr %result, <4 x i64> %idx
15+
call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)
16+
ret void
17+
}
18+
19+
define void @scatter_scale_16(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
20+
; CHECK-LABEL: scatter_scale_16:
21+
; CHECK: # %bb.0:
22+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
23+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
24+
; CHECK-NEXT: vpsllq $4, %ymm0, %ymm0
25+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
26+
; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}
27+
; CHECK-NEXT: vzeroupper
28+
; CHECK-NEXT: retq
29+
%gep = getelementptr inbounds [16 x i8], ptr %result, <4 x i64> %idx
30+
call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)
31+
ret void
32+
}
33+
34+
define void @scatter_scale_8(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
35+
; CHECK-LABEL: scatter_scale_8:
36+
; CHECK: # %bb.0:
37+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
38+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
39+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
40+
; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0,8) {%k1}
41+
; CHECK-NEXT: vzeroupper
42+
; CHECK-NEXT: retq
43+
%gep = getelementptr inbounds [8 x i8], ptr %result, <4 x i64> %idx
44+
call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)
45+
ret void
46+
}
47+
48+
define void @scatter_scale_4(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
49+
; CHECK-LABEL: scatter_scale_4:
50+
; CHECK: # %bb.0:
51+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
52+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
53+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
54+
; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0,4) {%k1}
55+
; CHECK-NEXT: vzeroupper
56+
; CHECK-NEXT: retq
57+
%gep = getelementptr inbounds [4 x i8], ptr %result, <4 x i64> %idx
58+
call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)
59+
ret void
60+
}
61+
62+
define void @scatter_scale_3(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
63+
; CHECK-LABEL: scatter_scale_3:
64+
; CHECK: # %bb.0:
65+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
66+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
67+
; CHECK-NEXT: vpaddq %ymm0, %ymm0, %ymm1
68+
; CHECK-NEXT: vpaddq %ymm0, %ymm1, %ymm0
69+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
70+
; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}
71+
; CHECK-NEXT: vzeroupper
72+
; CHECK-NEXT: retq
73+
%gep = getelementptr inbounds [3 x i8], ptr %result, <4 x i64> %idx
74+
call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)
75+
ret void
76+
}
77+
78+
define void @scatter_scale_1(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
79+
; CHECK-LABEL: scatter_scale_1:
80+
; CHECK: # %bb.0:
81+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
82+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
83+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
84+
; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}
85+
; CHECK-NEXT: vzeroupper
86+
; CHECK-NEXT: retq
87+
%gep = getelementptr inbounds [1 x i8], ptr %result, <4 x i64> %idx
88+
call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)
89+
ret void
90+
}
91+
92+
define <4 x double> @gather_scale_512(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
93+
; CHECK-LABEL: gather_scale_512:
94+
; CHECK: # %bb.0:
95+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
96+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
97+
; CHECK-NEXT: vpsllq $9, %ymm0, %ymm1
98+
; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0
99+
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1), %ymm0 {%k1}
100+
; CHECK-NEXT: retq
101+
%gep = getelementptr inbounds [512 x i8], ptr %result, <4 x i64> %idx
102+
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)
103+
ret <4 x double> %res
104+
}
105+
106+
define <4 x double> @gather_scale_16(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
107+
; CHECK-LABEL: gather_scale_16:
108+
; CHECK: # %bb.0:
109+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
110+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
111+
; CHECK-NEXT: vpsllq $4, %ymm0, %ymm1
112+
; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0
113+
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1), %ymm0 {%k1}
114+
; CHECK-NEXT: retq
115+
%gep = getelementptr inbounds [16 x i8], ptr %result, <4 x i64> %idx
116+
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)
117+
ret <4 x double> %res
118+
}
119+
120+
define <4 x double> @gather_scale_8(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
121+
; CHECK-LABEL: gather_scale_8:
122+
; CHECK: # %bb.0:
123+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
124+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
125+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
126+
; CHECK-NEXT: vgatherqpd (%rdi,%ymm0,8), %ymm1 {%k1}
127+
; CHECK-NEXT: vmovapd %ymm1, %ymm0
128+
; CHECK-NEXT: retq
129+
%gep = getelementptr inbounds [8 x i8], ptr %result, <4 x i64> %idx
130+
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)
131+
ret <4 x double> %res
132+
}
133+
134+
define <4 x double> @gather_scale_4(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
135+
; CHECK-LABEL: gather_scale_4:
136+
; CHECK: # %bb.0:
137+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
138+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
139+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
140+
; CHECK-NEXT: vgatherqpd (%rdi,%ymm0,4), %ymm1 {%k1}
141+
; CHECK-NEXT: vmovapd %ymm1, %ymm0
142+
; CHECK-NEXT: retq
143+
%gep = getelementptr inbounds [4 x i8], ptr %result, <4 x i64> %idx
144+
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)
145+
ret <4 x double> %res
146+
}
147+
148+
define <4 x double> @gather_scale_3(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
149+
; CHECK-LABEL: gather_scale_3:
150+
; CHECK: # %bb.0:
151+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
152+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
153+
; CHECK-NEXT: vpaddq %ymm0, %ymm0, %ymm1
154+
; CHECK-NEXT: vpaddq %ymm0, %ymm1, %ymm1
155+
; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0
156+
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1), %ymm0 {%k1}
157+
; CHECK-NEXT: retq
158+
%gep = getelementptr inbounds [3 x i8], ptr %result, <4 x i64> %idx
159+
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)
160+
ret <4 x double> %res
161+
}
162+
163+
define <4 x double> @gather_scale_1(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {
164+
; CHECK-LABEL: gather_scale_1:
165+
; CHECK: # %bb.0:
166+
; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
167+
; CHECK-NEXT: vpmovd2m %xmm1, %k1
168+
; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1
169+
; CHECK-NEXT: vgatherqpd (%rdi,%ymm0), %ymm1 {%k1}
170+
; CHECK-NEXT: vmovapd %ymm1, %ymm0
171+
; CHECK-NEXT: retq
172+
%gep = getelementptr inbounds [1 x i8], ptr %result, <4 x i64> %idx
173+
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)
174+
ret <4 x double> %res
175+
}
176+
177+
declare void @llvm.masked.scatter.v4f64.v4p0(<4 x double>, <4 x ptr>, i32 immarg, <4 x i1>)
178+
declare <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr>, i32 immarg, <4 x i1>, <4 x double>)

0 commit comments

Comments
 (0)