Skip to content

Commit 23fb928

Browse files
committed
[X86] Cast atomic vectors in IR to support floats
This commit casts floats to ints in an atomic load during AtomicExpand to support floating point types. It also is required to support 128 bit vectors in SSE/AVX.
1 parent 8466578 commit 23fb928

File tree

4 files changed

+122
-287
lines changed

4 files changed

+122
-287
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32136,6 +32136,13 @@ X86TargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const {
3213632136
}
3213732137
}
3213832138

32139+
TargetLowering::AtomicExpansionKind
32140+
X86TargetLowering::shouldCastAtomicLoadInIR(LoadInst *LI) const {
32141+
if (LI->getType()->getScalarType()->isFloatingPointTy())
32142+
return AtomicExpansionKind::CastToInteger;
32143+
return AtomicExpansionKind::None;
32144+
}
32145+
3213932146
LoadInst *
3214032147
X86TargetLowering::lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *AI) const {
3214132148
unsigned NativeWidth = Subtarget.is64Bit() ? 64 : 32;

llvm/lib/Target/X86/X86ISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,6 +1841,8 @@ namespace llvm {
18411841
shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
18421842
TargetLoweringBase::AtomicExpansionKind
18431843
shouldExpandLogicAtomicRMWInIR(AtomicRMWInst *AI) const;
1844+
TargetLoweringBase::AtomicExpansionKind
1845+
shouldCastAtomicLoadInIR(LoadInst *LI) const override;
18441846
void emitBitTestAtomicRMWIntrinsic(AtomicRMWInst *AI) const override;
18451847
void emitCmpArithAtomicRMWIntrinsic(AtomicRMWInst *AI) const override;
18461848

llvm/lib/Target/X86/X86InstrCompiler.td

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,21 @@ def : Pat<(v2i64 (scalar_to_vector (i64 (atomic_load_64 addr:$src)))),
12201220
def : Pat<(v2i64 (scalar_to_vector (i64 (atomic_load_64 addr:$src)))),
12211221
(VMOV64toPQIZrm addr:$src)>, Requires<[HasAVX512]>;
12221222

1223+
// load atomic <2 x i64>
1224+
def : Pat<(v2i64 (atomic_load_128_v2i64 addr:$src)),
1225+
(MOVAPDrm addr:$src)>, Requires<[UseSSE2]>;
1226+
def : Pat<(v2i64 (atomic_load_128_v2i64 addr:$src)),
1227+
(VMOVAPDrm addr:$src)>, Requires<[UseAVX]>;
1228+
def : Pat<(v2i64 (atomic_load_128_v2i64 addr:$src)),
1229+
(VMOVAPDZ128rm addr:$src)>, Requires<[HasAVX512]>;
1230+
// load atomic <4 x i32>
1231+
def : Pat<(v4i32 (atomic_load_128_v4i32 addr:$src)),
1232+
(MOVAPDrm addr:$src)>, Requires<[UseSSE2]>;
1233+
def : Pat<(v4i32 (atomic_load_128_v4i32 addr:$src)),
1234+
(VMOVAPDrm addr:$src)>, Requires<[UseAVX]>;
1235+
def : Pat<(v4i32 (atomic_load_128_v4i32 addr:$src)),
1236+
(VMOVAPDZ128rm addr:$src)>, Requires<[HasAVX512]>;
1237+
12231238
// Floating point loads/stores.
12241239
def : Pat<(atomic_store_32 (i32 (bitconvert (f32 FR32:$src))), addr:$dst),
12251240
(MOVSSmr addr:$dst, FR32:$src)>, Requires<[UseSSE1]>;

0 commit comments

Comments
 (0)