Skip to content

Commit 8467b26

Browse files
committed
dpu: llvm & clang: remove builtin dpu_seqread_get
The builtin lowering is ill-formed with arithmetic+comp+branch instruction. Emit a splitted version in EmitInstrWithCustomInserter to recombine later is too complicated. This commit revert to what it was before, a simple function call in the runtime library. This revert the followings: "dpu: llvm: seqread_get: force incr to be a positive signed char to be optimized" This reverts commit cfc4828 "dpu: llvm: enumerate every nc condition to convert pageSizeLog2" This reverts commit 3c67e43. "dpu: llvm & clang: add builtin dpu_seqread_get" This reverts commit 301a2e2
1 parent bc1a447 commit 8467b26

File tree

7 files changed

+1
-195
lines changed

7 files changed

+1
-195
lines changed

clang/include/clang/Basic/BuiltinsDPU.def

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,5 @@
1717
BUILTIN(__builtin_dpu_tid, "UiC", "nc")
1818
BUILTIN(__builtin_dpu_sdma, "vvC*v*Ui", "")
1919
BUILTIN(__builtin_dpu_ldma, "vv*vC*Ui", "")
20-
BUILTIN(__builtin_dpu_seqread_get, "iiUiv*UiC", "")
2120

2221
#undef BUILTIN

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17372,17 +17372,6 @@ Value *CodeGenFunction::EmitDPUBuiltinExpr(unsigned BuiltinID,
1737217372
Value *Arg2 = EmitScalarExpr(E->getArg(2));
1737317373
return Builder.CreateCall(Callee, {Arg0, Arg1, Arg2});
1737417374
}
17375-
case DPU::BI__builtin_dpu_seqread_get: {
17376-
llvm::Type *ResultType = ConvertType(E->getType());
17377-
Value *ArgPtr = EmitScalarExpr(E->getArg(0));
17378-
Value *ArgInc = EmitScalarExpr(E->getArg(1));
17379-
Value *ArgReader = EmitPointerWithAlignment(E->getArg(2)).getPointer();
17380-
Value *ArgPageSize = EmitScalarExpr(E->getArg(3));
17381-
17382-
llvm::Function *Callee =
17383-
CGM.getIntrinsic(Intrinsic::dpu_seqread_get, ResultType);
17384-
return Builder.CreateCall(Callee, {ArgPtr, ArgInc, ArgReader, ArgPageSize});
17385-
}
1738617375

1738717376
default:
1738817377
return nullptr;

llvm/include/llvm/IR/IntrinsicsDPU.td

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,4 @@ def int_dpu_ldma : Intrinsic<[], [llvm_wram_ptr_ty, llvm_mram_ptr_ty, llvm_i32_t
2222
def int_dpu_sdma_unchecked : Intrinsic<[], [llvm_wram_ptr_ty, llvm_wram_ptr_ty, llvm_i32_ty], [IntrHasSideEffects, ReadOnly<ArgIndex<0>>, WriteOnly<ArgIndex<1>>, Throws]>;
2323
def int_dpu_ldma_unchecked : Intrinsic<[], [llvm_wram_ptr_ty, llvm_wram_ptr_ty, llvm_i32_ty], [IntrHasSideEffects, ReadOnly<ArgIndex<1>>, WriteOnly<ArgIndex<0>>, Throws]>;
2424

25-
def int_dpu_seqread_get : Intrinsic<[llvm_anyint_ty], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty, llvm_i32_ty], [IntrHasSideEffects]>;
26-
2725
}

llvm/lib/Target/DPU/DPUISelLowering.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,6 @@ enum {
157157
LDMA,
158158
SDMA,
159159

160-
SEQREAD_GET,
161-
SEQREAD_GET_CST,
162-
163160
LHU_BIG,
164161
LHS_BIG,
165162
LW_BIG,

llvm/lib/Target/DPU/DPUInstrInfo.td

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ def SDT_DMA : SDTypeProfile<0, 3, [SDTCisInt<2>, SDTCisVT<0, iPTR>, SDTCisVT<1,
5858
def SDT_Ldma : SDNode<"DPUISD::LDMA", SDT_DMA, [SDNPHasChain]>;
5959
def SDT_Sdma : SDNode<"DPUISD::SDMA", SDT_DMA, [SDNPHasChain]>;
6060

61-
def SDT_SEQREAD_GET : SDTypeProfile<1, 5, [SDTCisInt<0>, SDTCisInt<1>, SDTCisVT<2, iPTR>, SDTCisInt<3>, SDTCisInt<4>]>;
62-
def DPUSeqreadGet : SDNode<"DPUISD::SEQREAD_GET", SDT_SEQREAD_GET, [SDNPHasChain]>;
63-
def DPUSeqreadGetCst : SDNode<"DPUISD::SEQREAD_GET_CST", SDT_SEQREAD_GET, [SDNPHasChain]>;
64-
6561
// To promote special types of operands to registers (see the patterns below).
6662
def SDTDPUWrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>;
6763
def DPUWrapper : SDNode<"DPUISD::Wrapper", SDTDPUWrapper>;
@@ -77,20 +73,6 @@ def DPULdBig : SDNode <"DPUISD::LD_BIG", SDT_DPULoadBig, [SDNPHasChain, SDNPMayL
7773

7874
include "DPUInstrFormats.td"
7975

80-
let usesCustomInserter = 1 in {
81-
def SEQREAD_GET: PseudoDPUInstruction<
82-
(outs SimpleReg:$rc),
83-
(ins SimpleReg:$ptr, SimpleReg:$inc, SimpleReg:$reader, i32imm:$cc, i32imm:$pageSize),
84-
"",
85-
[(set i32:$rc, (DPUSeqreadGet i32:$ptr, i32:$inc, i32:$reader, (i32 imm:$cc), (i32 imm:$pageSize)))]>;
86-
87-
def SEQREAD_GET_CST: PseudoDPUInstruction<
88-
(outs SimpleReg:$rc),
89-
(ins SimpleReg:$ptr, s8_imm:$inc, SimpleReg:$reader, i32imm:$cc, i32imm:$pageSize),
90-
"",
91-
[(set i32:$rc, (DPUSeqreadGetCst i32:$ptr, (s8_imm:$inc), i32:$reader, (i32 imm:$cc), (i32 imm:$pageSize)))]>;
92-
}
93-
9476
def ADD_VAStart: PseudoDPUInstruction<
9577
(outs SimpleReg:$rc), (ins SimpleReg:$ra),
9678
"",

llvm/lib/Target/DPU/DPUTargetLowering.cpp

Lines changed: 1 addition & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -405,10 +405,6 @@ const char *DPUTargetLowering::getTargetNodeName(unsigned Opcode) const {
405405
switch (Opcode) {
406406
default:
407407
return nullptr;
408-
case DPUISD::SEQREAD_GET:
409-
return "DPUISD::SEQREAD_GET";
410-
case DPUISD::SEQREAD_GET_CST:
411-
return "DPUISD::SEQREAD_GET_CST";
412408
case DPUISD::LHU_BIG:
413409
return "DPUISD::LHU_BIG";
414410
case DPUISD::LHS_BIG:
@@ -1848,15 +1844,13 @@ SDValue DPUTargetLowering::LowerShift(SDValue Op, SelectionDAG &DAG,
18481844
}
18491845
}
18501846

1851-
static uint64_t FormatDMASize(uint64_t size) { return (size >> 3) - 1; }
1852-
18531847
SDValue DPUTargetLowering::LowerDMAUnchecked(
18541848
SelectionDAG &DAG, const SDLoc &dl, const EVT &evt, SDValue Chain,
18551849
SDValue ra, SDValue rb, SDValue Size, bool CanFetchConstant,
18561850
uint64_t Length, int DPUISD) const {
18571851

18581852
if (CanFetchConstant) {
1859-
Size = DAG.getConstant(FormatDMASize(Length), dl, MVT::i32);
1853+
Size = DAG.getConstant((Length >> 3) - 1, dl, MVT::i32);
18601854
} else {
18611855
const EVT &raVT = ra.getValueType();
18621856
// to + (((nb_of_bytes >> 3) - 1) << 24);
@@ -1907,71 +1901,6 @@ SDValue DPUTargetLowering::LowerDMA(SDValue Op, SelectionDAG &DAG,
19071901
CanFetchConstant, size, DPUISD);
19081902
}
19091903

1910-
static uint64_t PageSizeLog2ToNcCondition(uint64_t pageSize) {
1911-
switch (pageSize) {
1912-
case 5:
1913-
return DPUAsmCondition::NotCarry5;
1914-
case 6:
1915-
return DPUAsmCondition::NotCarry6;
1916-
case 7:
1917-
return DPUAsmCondition::NotCarry7;
1918-
case 8:
1919-
return DPUAsmCondition::NotCarry8;
1920-
case 9:
1921-
return DPUAsmCondition::NotCarry9;
1922-
case 10:
1923-
return DPUAsmCondition::NotCarry10;
1924-
case 11:
1925-
return DPUAsmCondition::NotCarry11;
1926-
case 12:
1927-
return DPUAsmCondition::NotCarry12;
1928-
case 13:
1929-
return DPUAsmCondition::NotCarry13;
1930-
case 14:
1931-
return DPUAsmCondition::NotCarry14;
1932-
default:
1933-
return DPUAsmCondition::NR_CONDITIONS;
1934-
}
1935-
}
1936-
1937-
SDValue DPUTargetLowering::LowerSeqreadGet(SDValue Op,
1938-
SelectionDAG &DAG) const {
1939-
SDLoc dl(Op);
1940-
SDValue incValue = Op.getOperand(3);
1941-
SDValue pageSizeValue = Op.getOperand(5);
1942-
uint64_t pageSize, pageSizeLog2, inc;
1943-
if (!canFetchConstantTo(pageSizeValue, &pageSize)) {
1944-
LowerUnsupported(
1945-
Op, DAG, "NC only apply on constant and staticaly defined page size");
1946-
}
1947-
pageSizeLog2 = (uint64_t)log2((double)pageSize);
1948-
if (pageSize != ((uint64_t)pow(2, (double)pageSizeLog2)) ||
1949-
pageSizeLog2 < 5 || pageSizeLog2 > 14) {
1950-
LowerUnsupported(
1951-
Op, DAG,
1952-
"NC only apply on a page size of a power of 2 in range [64;32768]");
1953-
}
1954-
1955-
int Opcode = DPUISD::SEQREAD_GET;
1956-
SDValue cond =
1957-
DAG.getConstant(PageSizeLog2ToNcCondition(pageSizeLog2), dl, MVT::i32);
1958-
if (canFetchConstantTo(incValue, &inc) && (inc > 0) && (inc < 128)) {
1959-
Opcode = DPUISD::SEQREAD_GET_CST;
1960-
incValue = DAG.getConstant(inc, dl, MVT::i32);
1961-
}
1962-
1963-
SmallVector<EVT, 2> ResTys;
1964-
1965-
for (SDNode::value_iterator I = Op->value_begin(), E = Op->value_end();
1966-
I != E; ++I)
1967-
ResTys.push_back(*I);
1968-
1969-
SDValue Ops[] = {
1970-
Op.getOperand(0), Op.getOperand(2), incValue, Op.getOperand(4), cond,
1971-
pageSizeValue};
1972-
return DAG.getNode(Opcode, dl, ResTys, Ops);
1973-
}
1974-
19751904
SDValue DPUTargetLowering::LowerIntrinsic(SDValue Op, SelectionDAG &DAG,
19761905
int IntrinsicType) const {
19771906
SDLoc dl(Op);
@@ -1992,12 +1921,6 @@ SDValue DPUTargetLowering::LowerIntrinsic(SDValue Op, SelectionDAG &DAG,
19921921
}
19931922
break;
19941923
case ISD::INTRINSIC_W_CHAIN:
1995-
switch (cast<ConstantSDNode>(Op->getOperand(1))->getZExtValue()) {
1996-
case Intrinsic::dpu_seqread_get: {
1997-
result = LowerSeqreadGet(Op, DAG);
1998-
break;
1999-
}
2000-
}
20011924
break;
20021925
case ISD::INTRINSIC_VOID:
20031926
switch (cast<ConstantSDNode>(Op->getOperand(1))->getZExtValue()) {
@@ -3134,92 +3057,12 @@ static MachineBasicBlock *EmitClz64WithCustomInserter(MachineInstr &MI,
31343057
return endMBB;
31353058
}
31363059

3137-
static MachineBasicBlock *EmitSeqreadGet(MachineInstr &MI,
3138-
MachineBasicBlock *BB, bool IsIncCst) {
3139-
const TargetInstrInfo &TII = *BB->getParent()->getSubtarget().getInstrInfo();
3140-
DebugLoc dl = MI.getDebugLoc();
3141-
const BasicBlock *LLVM_BB = BB->getBasicBlock();
3142-
MachineFunction::iterator I = ++BB->getIterator();
3143-
MachineFunction *F = BB->getParent();
3144-
MachineBasicBlock *slowMBB = F->CreateMachineBasicBlock(LLVM_BB);
3145-
MachineBasicBlock *fastMBB = F->CreateMachineBasicBlock(LLVM_BB);
3146-
F->insert(I, slowMBB);
3147-
F->insert(I, fastMBB);
3148-
// Update machine-CFG edges by transferring all successors of the current
3149-
// block to the new block which will contain the Phi node for the select.
3150-
fastMBB->splice(fastMBB->begin(), BB,
3151-
std::next(MachineBasicBlock::iterator(MI)), BB->end());
3152-
fastMBB->transferSuccessorsAndUpdatePHIs(BB);
3153-
// Next, add the true and fallthrough blocks as its successors.
3154-
BB->addSuccessor(slowMBB);
3155-
BB->addSuccessor(fastMBB);
3156-
slowMBB->addSuccessor(fastMBB);
3157-
3158-
unsigned int Dest = MI.getOperand(0).getReg();
3159-
unsigned int PtrInit = MI.getOperand(1).getReg();
3160-
unsigned int Reader = MI.getOperand(3).getReg();
3161-
unsigned int Cond = MI.getOperand(4).getImm();
3162-
unsigned int PageSize = MI.getOperand(5).getImm();
3163-
3164-
MachineRegisterInfo &RI = F->getRegInfo();
3165-
unsigned int PtrIncremented = RI.createVirtualRegister(&DPU::GP_REGRegClass);
3166-
3167-
if (IsIncCst) {
3168-
BuildMI(BB, dl, TII.get(DPU::ADDrrici), PtrIncremented)
3169-
.addReg(PtrInit)
3170-
.addImm(MI.getOperand(2).getImm())
3171-
.addImm(Cond)
3172-
.addMBB(fastMBB);
3173-
} else {
3174-
BuildMI(BB, dl, TII.get(DPU::ADDrrrci), PtrIncremented)
3175-
.addReg(PtrInit)
3176-
.addReg(MI.getOperand(2).getReg())
3177-
.addImm(Cond)
3178-
.addMBB(fastMBB);
3179-
}
3180-
3181-
unsigned int WramCache = RI.createVirtualRegister(&DPU::GP_REGRegClass);
3182-
unsigned int MramCache = RI.createVirtualRegister(&DPU::GP_REGRegClass);
3183-
unsigned int MramCacheUpdated =
3184-
RI.createVirtualRegister(&DPU::GP_REGRegClass);
3185-
unsigned int PtrUpdated = RI.createVirtualRegister(&DPU::GP_REGRegClass);
3186-
BuildMI(slowMBB, dl, TII.get(DPU::LWrri), MramCache).addReg(Reader).addImm(4);
3187-
BuildMI(slowMBB, dl, TII.get(DPU::ADDrri), MramCacheUpdated)
3188-
.addReg(MramCache)
3189-
.addImm(PageSize);
3190-
BuildMI(slowMBB, dl, TII.get(DPU::SWrir))
3191-
.addReg(Reader)
3192-
.addImm(4)
3193-
.addReg(MramCacheUpdated);
3194-
BuildMI(slowMBB, dl, TII.get(DPU::LWrri), WramCache).addReg(Reader).addImm(0);
3195-
BuildMI(slowMBB, dl, TII.get(DPU::LDMArri))
3196-
.addReg(WramCache)
3197-
.addReg(MramCacheUpdated)
3198-
.addImm(FormatDMASize(PageSize * 2));
3199-
BuildMI(slowMBB, dl, TII.get(DPU::ADDrri), PtrUpdated)
3200-
.addReg(PtrIncremented)
3201-
.addImm(-PageSize);
3202-
3203-
BuildMI(*fastMBB, fastMBB->begin(), dl, TII.get(TargetOpcode::PHI), Dest)
3204-
.addReg(PtrIncremented)
3205-
.addMBB(BB)
3206-
.addReg(PtrUpdated)
3207-
.addMBB(slowMBB);
3208-
3209-
MI.eraseFromParent(); // The pseudo instruction is gone now.
3210-
return fastMBB;
3211-
}
3212-
32133060
MachineBasicBlock *
32143061
DPUTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
32153062
MachineBasicBlock *BB) const {
32163063
switch (MI.getOpcode()) {
32173064
default:
32183065
llvm_unreachable("Unexpected instr type to insert");
3219-
case DPU::SEQREAD_GET:
3220-
return EmitSeqreadGet(MI, BB, false);
3221-
case DPU::SEQREAD_GET_CST:
3222-
return EmitSeqreadGet(MI, BB, true);
32233066
case DPU::Mul16UUrr:
32243067
return EmitMul16WithCustomInserter(MI, BB, DPU::MUL_UL_ULrrrci,
32253068
DPU::MUL_UH_ULrrr, DPU::MUL_UH_ULrrr,

llvm/lib/Target/DPU/DPUTargetLowering.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ class DPUTargetLowering : public TargetLowering {
121121

122122
SDValue LowerDMA(SDValue Op, SelectionDAG &DAG, int DPUISD) const;
123123

124-
SDValue LowerSeqreadGet(SDValue Op, SelectionDAG &DAG) const;
125-
126124
SDValue LowerIntrinsic(SDValue Op, SelectionDAG &DAG,
127125
int IntrinsicType) const;
128126

0 commit comments

Comments
 (0)