[PATCH] D81480: [BPF] generate proper code for __builtin_load_u32_to_ptr()

Yonghong Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 9 10:25:25 PDT 2020


yonghong-song created this revision.
yonghong-song added a reviewer: ast.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
yonghong-song added a comment.

The corresponding clang change: https://reviews.llvm.org/D81479


This is the BPF backend support for __builtin_load_u32_to_ptr().
A new codegen only opcode LOAD_U32_TO_PTR is introduced
for IR builtin int_bpf_load_u32_to_ptr(). Finally, a
single LDW instruction is generated for the builtin.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D81480

Files:
  llvm/lib/Target/BPF/BPFAsmPrinter.cpp
  llvm/lib/Target/BPF/BPFInstrInfo.td
  llvm/test/CodeGen/BPF/load_u32_to_ptr.ll


Index: llvm/test/CodeGen/BPF/load_u32_to_ptr.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/BPF/load_u32_to_ptr.ll
@@ -0,0 +1,18 @@
+; RUN: llc < %s -march=bpfel | FileCheck %s
+; RUN: llc < %s -march=bpfel -mattr=+alu32 | FileCheck %s
+
+%struct.t = type { i32, i32 }
+
+; Function Attrs: nounwind readonly
+define dso_local i8* @test(%struct.t* readonly %arg) local_unnamed_addr {
+entry:
+  %0 = bitcast %struct.t* %arg to i8*
+  %1 = tail call i8* @llvm.bpf.load.u32.to.ptr(i8* %0, i64 4)
+  ret i8* %1
+}
+
+; CHECK:        r0 = *(u32 *)(r{{[0-9]+}} + 4)
+; CHECK-NEXT:   exit
+
+; Function Attrs: nounwind readonly
+declare i8* @llvm.bpf.load.u32.to.ptr(i8*, i64) #1
Index: llvm/lib/Target/BPF/BPFInstrInfo.td
===================================================================
--- llvm/lib/Target/BPF/BPFInstrInfo.td
+++ llvm/lib/Target/BPF/BPFInstrInfo.td
@@ -392,6 +392,14 @@
   let BPFClass = BPF_LD;
 }
 
+let isCodeGenOnly = 1 in {
+  def LOAD_U32_TO_PTR : TYPE_LD_ST<BPF_MEM.Value, BPF_W.Value,
+                                   (outs GPR:$dst),
+                                   (ins GPR:$src, u64imm:$offset),
+                                   "$dst = (void *)(long)*(u32 *)($src + $offset)",
+                                   [(set GPR:$dst, (int_bpf_load_u32_to_ptr GPR:$src, imm:$offset))]>;
+}
+
 // STORE instructions
 class STORE<BPFWidthModifer SizeOp, string OpcodeStr, list<dag> Pattern>
     : TYPE_LD_ST<BPF_MEM.Value, SizeOp.Value,
Index: llvm/lib/Target/BPF/BPFAsmPrinter.cpp
===================================================================
--- llvm/lib/Target/BPF/BPFAsmPrinter.cpp
+++ llvm/lib/Target/BPF/BPFAsmPrinter.cpp
@@ -140,7 +140,12 @@
 void BPFAsmPrinter::emitInstruction(const MachineInstr *MI) {
   MCInst TmpInst;
 
-  if (!BTF || !BTF->InstLower(MI, TmpInst)) {
+  if (MI->getOpcode() == BPF::LOAD_U32_TO_PTR) {
+    TmpInst.setOpcode(BPF::LDW);
+    TmpInst.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
+    TmpInst.addOperand(MCOperand::createReg(MI->getOperand(1).getReg()));
+    TmpInst.addOperand(MCOperand::createImm(MI->getOperand(2).getImm()));
+  } else if (!BTF || !BTF->InstLower(MI, TmpInst)) {
     BPFMCInstLower MCInstLowering(OutContext, *this);
     MCInstLowering.Lower(MI, TmpInst);
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81480.269577.patch
Type: text/x-patch
Size: 2339 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200609/08344c78/attachment.bin>


More information about the llvm-commits mailing list