Skip to content

Commit 10b57a1

Browse files
committed
[SelectionDAG] Legalize vector types for atomic load
Scalarize vector of atomic load in SelectionDAG.
1 parent aba2a03 commit 10b57a1

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
860860
SDValue ScalarizeVecRes_ExpOp(SDNode *N);
861861
SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
862862
SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
863+
SDValue ScalarizeVecRes_ATOMIC_LOAD(AtomicSDNode *N);
863864
SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
864865
SDValue ScalarizeVecRes_VSELECT(SDNode *N);
865866
SDValue ScalarizeVecRes_SELECT(SDNode *N);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 16 additions & 0 deletions
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,19 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N) {
451454
return Op;
452455
}
453456

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: llc %s --print-after-isel --disable-verify 2>&1 | FileCheck %s
2+
3+
define i32 @atomic_scalar() {
4+
; CHECK: # After Instruction Selection:
5+
; CHECK-NEXT: # Machine code for function atomic_scalar: IsSSA, TracksLiveness
6+
; CHECK-NEXT: Frame Objects:
7+
; CHECK-NEXT: fi#0: size=4, align=4, at location [SP+8]
8+
; CHECK: bb.0 (%ir-block.0):
9+
; CHECK-NEXT: %0:gr32 = MOV32rm %stack.0, 1, $noreg, 0, $noreg :: (dereferenceable load acquire (s32) from %ir.1)
10+
; CHECK-NEXT: $eax = COPY %0:gr32
11+
; CHECK-NEXT: RET 0, $eax
12+
; CHECK: # End machine code for function atomic_scalar.
13+
%1 = alloca <1 x i32>
14+
%2 = load atomic <1 x i32>, ptr %1 acquire, align 4
15+
%3 = extractelement <1 x i32> %2, i32 0
16+
ret i32 %3
17+
}

0 commit comments

Comments
 (0)