[PATCH] D141360: [PowerPC][GISel] Select sync instructions required by atomic operations

Kai Luo via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 10 00:35:05 PST 2023


lkail created this revision.
lkail added reviewers: PowerPC, shchenz, nemanjai, Kai.
Herald added subscribers: kbarton, hiraditya.
Herald added a project: All.
lkail requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This is part of selecting `G_ATOMIC*` instructions. Select `isync`, `sync` and `lwsync` in GISel.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141360

Files:
  llvm/lib/Target/PowerPC/GISel/PPCInstructionSelector.cpp
  llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.cpp
  llvm/test/CodeGen/PowerPC/GlobalISel/ppc-isel-sync.ll


Index: llvm/test/CodeGen/PowerPC/GlobalISel/ppc-isel-sync.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/GlobalISel/ppc-isel-sync.ll
@@ -0,0 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64le -global-isel \
+; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s
+
+declare void @llvm.ppc.isync()
+declare void @llvm.ppc.sync()
+declare void @llvm.ppc.lwsync()
+
+define void @test_sync() {
+; CHECK-LABEL: test_sync:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    isync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    blr
+entry:
+  call void @llvm.ppc.isync()
+  call void @llvm.ppc.sync()
+  call void @llvm.ppc.lwsync()
+  ret void
+}
Index: llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.cpp
===================================================================
--- llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.cpp
+++ llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.cpp
@@ -175,6 +175,13 @@
            getValueMapping(PMI_GPR64)});
     break;
   }
+  case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: {
+    // FIXME: We have to check every operands in this MI and compuate value
+    // mapping accordingly.
+    SmallVector<const ValueMapping *, 8> OpdsMapping(NumOperands);
+    OperandsMapping = getOperandsMapping(OpdsMapping);
+    break;
+  }
   default:
     return getInvalidInstructionMapping();
   }
Index: llvm/lib/Target/PowerPC/GISel/PPCInstructionSelector.cpp
===================================================================
--- llvm/lib/Target/PowerPC/GISel/PPCInstructionSelector.cpp
+++ llvm/lib/Target/PowerPC/GISel/PPCInstructionSelector.cpp
@@ -62,6 +62,9 @@
   bool selectI64Imm(MachineInstr &I, MachineBasicBlock &MBB,
                     MachineRegisterInfo &MRI) const;
 
+  bool selectIntrinsicWithSideEffects(MachineInstr &I, MachineBasicBlock &MBB,
+                                      MachineRegisterInfo &MRI);
+
   const PPCSubtarget &STI;
   const PPCInstrInfo &TII;
   const PPCRegisterInfo &TRI;
@@ -704,10 +707,34 @@
     return selectZExt(I, MBB, MRI);
   case TargetOpcode::G_CONSTANT:
     return selectI64Imm(I, MBB, MRI);
+  case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
+    return selectIntrinsicWithSideEffects(I, MBB, MRI);
   }
   return false;
 }
 
+bool PPCInstructionSelector::selectIntrinsicWithSideEffects(
+    MachineInstr &I, MachineBasicBlock &MBB, MachineRegisterInfo &MRI) {
+  MachineFunction &MF = *MBB.getParent();
+
+  unsigned IntrinID = I.getIntrinsicID();
+  switch (IntrinID) {
+  default:
+    return false;
+  case Intrinsic::ppc_sync:
+    I.setDesc(TII.get(PPC::SYNC));
+    return true;
+  case Intrinsic::ppc_isync:
+    I.setDesc(TII.get(PPC::ISYNC));
+    return true;
+  case Intrinsic::ppc_lwsync:
+    I.setDesc(TII.get(PPC::SYNC));
+    MachineInstrBuilder MIB(MF, &I);
+    MIB.addImm(1);
+    return true;
+  }
+}
+
 namespace llvm {
 InstructionSelector *
 createPPCInstructionSelector(const PPCTargetMachine &TM,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141360.487712.patch
Type: text/x-patch
Size: 3094 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230110/6af173b4/attachment.bin>


More information about the llvm-commits mailing list