From 5ec71d0c9c7c5dacbe7bef9023bb83ec40c52e01 Mon Sep 17 00:00:00 2001 From: Sergei Barannikov Date: Sun, 7 Sep 2025 17:59:34 +0300 Subject: [PATCH] [BPF] Remove skb operand of LD_ABS/LD_IND instructions The instructions already have R6 register in the Uses list, there is no need for an additional explicit `GPR:$skb` operand. This simplifies intrinsic selection and makes the instructions decodable without post-decoding pass inserting R6 operand. --- llvm/lib/Target/BPF/BPFISelDAGToDAG.cpp | 21 ------------------- llvm/lib/Target/BPF/BPFInstrInfo.td | 10 ++++----- llvm/lib/Target/BPF/CMakeLists.txt | 3 +-- .../BPF/Disassembler/BPFDisassembler.cpp | 12 ----------- .../llvm-project-overlay/llvm/BUILD.bazel | 5 +---- 5 files changed, 6 insertions(+), 45 deletions(-) diff --git a/llvm/lib/Target/BPF/BPFISelDAGToDAG.cpp b/llvm/lib/Target/BPF/BPFISelDAGToDAG.cpp index 352017e9b9292..dadba52de4627 100644 --- a/llvm/lib/Target/BPF/BPFISelDAGToDAG.cpp +++ b/llvm/lib/Target/BPF/BPFISelDAGToDAG.cpp @@ -193,27 +193,6 @@ void BPFDAGToDAGISel::Select(SDNode *Node) { switch (Opcode) { default: break; - case ISD::INTRINSIC_W_CHAIN: { - unsigned IntNo = Node->getConstantOperandVal(1); - switch (IntNo) { - case Intrinsic::bpf_load_byte: - case Intrinsic::bpf_load_half: - case Intrinsic::bpf_load_word: { - SDLoc DL(Node); - SDValue Chain = Node->getOperand(0); - SDValue N1 = Node->getOperand(1); - SDValue Skb = Node->getOperand(2); - SDValue N3 = Node->getOperand(3); - - SDValue R6Reg = CurDAG->getRegister(BPF::R6, MVT::i64); - Chain = CurDAG->getCopyToReg(Chain, DL, R6Reg, Skb, SDValue()); - Node = CurDAG->UpdateNodeOperands(Node, Chain, N1, R6Reg, N3); - break; - } - } - break; - } - case ISD::FrameIndex: { int FI = cast(Node)->getIndex(); EVT VT = Node->getValueType(0); diff --git a/llvm/lib/Target/BPF/BPFInstrInfo.td b/llvm/lib/Target/BPF/BPFInstrInfo.td index b21f1a0eee3b0..de7dae2c8ca68 100644 --- a/llvm/lib/Target/BPF/BPFInstrInfo.td +++ b/llvm/lib/Target/BPF/BPFInstrInfo.td @@ -1189,10 +1189,9 @@ let Defs = [R0, R1, R2, R3, R4, R5], Uses = [R6], hasSideEffects = 1, hasExtraDefRegAllocReq = 1, hasExtraSrcRegAllocReq = 1, mayLoad = 1 in { class LOAD_ABS : TYPE_LD_ST { + [(set R0, (OpNode R6, i64immSExt32:$imm))]> { bits<32> imm; let Inst{31-0} = imm; @@ -1201,10 +1200,9 @@ class LOAD_ABS class LOAD_IND : TYPE_LD_ST { + [(set R0, (OpNode R6, GPR:$val))]> { bits<4> val; let Inst{55-52} = val; diff --git a/llvm/lib/Target/BPF/CMakeLists.txt b/llvm/lib/Target/BPF/CMakeLists.txt index 678cb42c35f13..eade4cacb7100 100644 --- a/llvm/lib/Target/BPF/CMakeLists.txt +++ b/llvm/lib/Target/BPF/CMakeLists.txt @@ -6,8 +6,7 @@ tablegen(LLVM BPFGenAsmMatcher.inc -gen-asm-matcher) tablegen(LLVM BPFGenAsmWriter.inc -gen-asm-writer) tablegen(LLVM BPFGenCallingConv.inc -gen-callingconv) tablegen(LLVM BPFGenDAGISel.inc -gen-dag-isel) -tablegen(LLVM BPFGenDisassemblerTables.inc -gen-disassembler - -ignore-non-decodable-operands) +tablegen(LLVM BPFGenDisassemblerTables.inc -gen-disassembler) tablegen(LLVM BPFGenInstrInfo.inc -gen-instr-info) tablegen(LLVM BPFGenMCCodeEmitter.inc -gen-emitter) tablegen(LLVM BPFGenRegisterInfo.inc -gen-register-info) diff --git a/llvm/lib/Target/BPF/Disassembler/BPFDisassembler.cpp b/llvm/lib/Target/BPF/Disassembler/BPFDisassembler.cpp index b5bb1c08c5644..230cf3b0ddbe4 100644 --- a/llvm/lib/Target/BPF/Disassembler/BPFDisassembler.cpp +++ b/llvm/lib/Target/BPF/Disassembler/BPFDisassembler.cpp @@ -205,18 +205,6 @@ DecodeStatus BPFDisassembler::getInstruction(MCInst &Instr, uint64_t &Size, Op.setImm(Make_64(Hi, Op.getImm())); break; } - case BPF::LD_ABS_B: - case BPF::LD_ABS_H: - case BPF::LD_ABS_W: - case BPF::LD_IND_B: - case BPF::LD_IND_H: - case BPF::LD_IND_W: { - auto Op = Instr.getOperand(0); - Instr.clear(); - Instr.addOperand(MCOperand::createReg(BPF::R6)); - Instr.addOperand(Op); - break; - } } return Result; diff --git a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel index eb2a96d3500ee..b042c183df9fb 100644 --- a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel @@ -2307,10 +2307,7 @@ llvm_target_lib_list = [lib for lib in [ "lib/Target/BPF/BPFGenCallingConv.inc": ["-gen-callingconv"], "lib/Target/BPF/BPFGenDAGISel.inc": ["-gen-dag-isel"], "lib/Target/BPF/BPFGenGlobalISel.inc": ["-gen-global-isel"], - "lib/Target/BPF/BPFGenDisassemblerTables.inc": [ - "-gen-disassembler", - "-ignore-non-decodable-operands", - ], + "lib/Target/BPF/BPFGenDisassemblerTables.inc": ["-gen-disassembler"], "lib/Target/BPF/BPFGenMCCodeEmitter.inc": ["-gen-emitter"], "lib/Target/BPF/BPFGenInstrInfo.inc": ["-gen-instr-info"], "lib/Target/BPF/BPFGenRegisterInfo.inc": ["-gen-register-info"],