Skip to content

Commit c154ab8

Browse files
committed
[SelectionDAG] Legalize vector types for atomic load
Scalarize vector of atomic load in SelectionDAG.
1 parent 91fdfec commit c154ab8

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
@@ -850,6 +850,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
850850
SDValue ScalarizeVecRes_ExpOp(SDNode *N);
851851
SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
852852
SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
853+
SDValue ScalarizeVecRes_ATOMIC_LOAD(AtomicSDNode *N);
853854
SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
854855
SDValue ScalarizeVecRes_VSELECT(SDNode *N);
855856
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;
@@ -447,6 +450,19 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N) {
447450
return Op;
448451
}
449452

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

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)