Skip to content

Commit e294f9f

Browse files
committed
[SelectionDAG] Legalize <1 x T> vector types for atomic load
`load atomic <1 x T>` is not valid. This change legalizes vector types of atomic load via scalarization in SelectionDAG so that it can, for example, translate from `v1i32` to `i32`. commit-id:5c36cc8c
1 parent b28c988 commit e294f9f

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

Diff for: llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

+1
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
861861
SDValue ScalarizeVecRes_ExpOp(SDNode *N);
862862
SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
863863
SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
864+
SDValue ScalarizeVecRes_ATOMIC_LOAD(AtomicSDNode *N);
864865
SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
865866
SDValue ScalarizeVecRes_VSELECT(SDNode *N);
866867
SDValue ScalarizeVecRes_SELECT(SDNode *N);

Diff for: llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
6060
case ISD::FP_ROUND: R = ScalarizeVecRes_FP_ROUND(N); break;
6161
case ISD::FPOWI: R = ScalarizeVecRes_ExpOp(N); break;
6262
case ISD::INSERT_VECTOR_ELT: R = ScalarizeVecRes_INSERT_VECTOR_ELT(N); break;
63+
case ISD::ATOMIC_LOAD:
64+
R = ScalarizeVecRes_ATOMIC_LOAD(cast<AtomicSDNode>(N));
65+
break;
6366
case ISD::LOAD: R = ScalarizeVecRes_LOAD(cast<LoadSDNode>(N));break;
6467
case ISD::SCALAR_TO_VECTOR: R = ScalarizeVecRes_SCALAR_TO_VECTOR(N); break;
6568
case ISD::SIGN_EXTEND_INREG: R = ScalarizeVecRes_InregOp(N); break;
@@ -451,6 +454,18 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N) {
451454
return Op;
452455
}
453456

457+
SDValue DAGTypeLegalizer::ScalarizeVecRes_ATOMIC_LOAD(AtomicSDNode *N) {
458+
SDValue Result = DAG.getAtomic(
459+
ISD::ATOMIC_LOAD, SDLoc(N), N->getMemoryVT().getVectorElementType(),
460+
N->getValueType(0).getVectorElementType(), N->getChain(), N->getBasePtr(),
461+
N->getMemOperand());
462+
463+
// Legalize the chain result - switch anything that used the old chain to
464+
// use the new one.
465+
ReplaceValueWith(SDValue(N, 1), Result.getValue(1));
466+
return Result;
467+
}
468+
454469
SDValue DAGTypeLegalizer::ScalarizeVecRes_LOAD(LoadSDNode *N) {
455470
assert(N->isUnindexed() && "Indexed vector load?");
456471

Diff for: llvm/test/CodeGen/X86/atomic-load-store.ll

+9
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,12 @@ define i32 @test3(ptr %ptr) {
2828
%val = load atomic i32, ptr %ptr seq_cst, align 4
2929
ret i32 %val
3030
}
31+
32+
define <1 x i32> @atomic_vec1_i32(ptr %x) {
33+
; CHECK-LABEL: atomic_vec1_i32:
34+
; CHECK: ## %bb.0:
35+
; CHECK-NEXT: movl (%rdi), %eax
36+
; CHECK-NEXT: retq
37+
%ret = load atomic <1 x i32>, ptr %x acquire, align 4
38+
ret <1 x i32> %ret
39+
}

0 commit comments

Comments
 (0)