[llvm] 728f99f - [PowerPC] Remove duplicate patterns for atomic_swap (#195936)

via llvm-commits llvm-commits at lists.llvm.org
Wed May 6 06:34:40 PDT 2026


Author: Kai Nacke
Date: 2026-05-06T09:34:35-04:00
New Revision: 728f99f928c7fe769717e4a1eb80da95809374c1

URL: https://github.com/llvm/llvm-project/commit/728f99f928c7fe769717e4a1eb80da95809374c1
DIFF: https://github.com/llvm/llvm-project/commit/728f99f928c7fe769717e4a1eb80da95809374c1.diff

LOG: [PowerPC] Remove duplicate patterns for atomic_swap (#195936)

The definition and implementation of atomic_load_* and atomic_swap is
basically similar. Changing the way how the operations are enumerated
makes it possible to remove the separate patterns for atomic_swap.

Added: 
    

Modified: 
    llvm/lib/Target/PowerPC/PPCInstr64Bit.td
    llvm/lib/Target/PowerPC/PPCInstrInfo.td

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td
index 9b56f958b4c6a..c578806d6cad5 100644
--- a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td
+++ b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td
@@ -265,10 +265,11 @@ def : Pat<(PPCcall_nop_rm (i64 mcsym:$dst)),
 // clean this up in PPCMIPeephole with calls to
 // PPCInstrInfo::convertToImmediateForm() but we should probably not emit them
 // in the first place.
-foreach op = ["add", "sub", "and", "or", "xor", "nand", "min", "max", "umax",
-              "umin"] in {
-  defvar pat = !cast<PatFrag>("atomic_load_"#op#"_i64");
-  defvar pseudo = "ATOMIC_LOAD_"#!toupper(op)#"_I64";
+foreach op = ["load_add", "load_sub", "load_and", "load_or", "load_xor",
+              "load_nand", "load_min", "load_max", "load_umax", "load_umin",
+              "swap"] in {
+  defvar pat = !cast<PatFrag>("atomic_"#op#"_i64");
+  defvar pseudo = "ATOMIC_"#!toupper(op)#"_I64";
   let Defs = [CR0] in
     def pseudo : PPCCustomInserterPseudo<
         (outs g8rc:$dst), (ins memrr:$ptr, i32imm:$sz, g8rc:$incr),
@@ -277,20 +278,13 @@ foreach op = ["add", "sub", "and", "or", "xor", "nand", "min", "max", "umax",
           (!cast<Instruction>(pseudo) memrr:$ptr, 8, g8rc:$incr)>;
 }
 
-let Defs = [CR0] in {
+let Defs = [CR0] in
   def ATOMIC_CMP_SWAP_I64 : PPCCustomInserterPseudo<
     (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$old, g8rc:$new),
     "#" # NAME, []>;
 
-  def ATOMIC_SWAP_I64 : PPCCustomInserterPseudo<
-    (outs g8rc:$dst), (ins memrr:$ptr, i32imm:$sz, g8rc:$new),
-    "#" # NAME, []>;
-}
-
 def : Pat<(i64 (atomic_cmp_swap_i64 ForceXForm:$ptr, g8rc:$old, g8rc:$new)),
           (ATOMIC_CMP_SWAP_I64 memrr:$ptr, i64:$old, i64:$new)>;
-def : Pat<(i64 (atomic_swap_i64 ForceXForm:$ptr, g8rc:$new)),
-          (ATOMIC_SWAP_I64 memrr:$ptr, 8, i64:$new)>;
 
 // Instructions to support atomic operations
 let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in {

diff  --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td
index 0c10ff9b46342..80b39b9b5003f 100644
--- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td
+++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td
@@ -2017,10 +2017,11 @@ def : Pat<(int_ppc_dcbtst_with_hint xoaddr:$dst, i32:$TH),
 // For example for operation AND, ATOMIC_LOAD_AND_NOWP is only matched for sizes
 // 8 and 16 bit if the word part feature is not available. In all other cases,
 // ATOMIC_LOAD_AND is matched.
-foreach op = ["add", "sub", "and", "or", "xor", "nand", "min", "max", "umax",
-              "umin"] in {
-  defvar atomic_load = "ATOMIC_LOAD_"#!toupper(op);
-  defvar atomic_load_nowp = "ATOMIC_LOAD_"#!toupper(op)#"_NOWP";
+foreach op = ["load_add", "load_sub", "load_and", "load_or", "load_xor",
+              "load_nand", "load_min", "load_max", "load_umax", "load_umin",
+              "swap"] in {
+  defvar atomic_load = "ATOMIC_"#!toupper(op);
+  defvar atomic_load_nowp = "ATOMIC_"#!toupper(op)#"_NOWP";
   let Defs = [CR0] in {
     def atomic_load : PPCCustomInserterPseudo<
         (outs gprc:$dst), (ins memrr:$ptr, i32imm:$sz, gprc:$incr),
@@ -2054,25 +2055,6 @@ foreach bitsz = [8, 16, 32] in {
           (!cast<Instruction>(pseudo) memrr:$ptr, gprc:$old, gprc:$new)>;
 }
 
-let Defs = [CR0] in {
-  def ATOMIC_SWAP : PPCCustomInserterPseudo<
-      (outs gprc:$dst), (ins memrr:$ptr, i32imm:$sz, gprc:$new),
-      "#" # NAME,[]>;
-  def ATOMIC_SWAP_NOWP : PPCCustomInserterPseudo<
-      (outs gprc:$dst), (ins memrr:$ptr, i32imm:$sz, gprc:$new),
-      "#" # NAME,[]>;
-}
-foreach bitsz = [8, 16] in {
-  defvar pat = !cast<PatFrag>("atomic_swap_i"#bitsz);
-  def : Pat<(i32 (pat ForceXForm:$ptr, gprc:$new)),
-          (ATOMIC_SWAP memrr:$ptr, !div(bitsz, 8), gprc:$new)>,
-           Requires<[HasPartwordAtomics]>;
-  def : Pat<(i32 (pat ForceXForm:$ptr, gprc:$new)),
-          (ATOMIC_SWAP_NOWP memrr:$ptr, !div(bitsz, 8), gprc:$new)>;
-}
-def : Pat<(i32 (atomic_swap_i32 ForceXForm:$ptr, gprc:$new)),
-          (ATOMIC_SWAP memrr:$ptr, 4, gprc:$new)>;
-
 def : Pat<(PPCatomicCmpSwap_8 ForceXForm:$ptr, i32:$old, i32:$new),
         (ATOMIC_CMP_SWAP_I8 ForceXForm:$ptr, i32:$old, i32:$new)>;
 def : Pat<(PPCatomicCmpSwap_16 ForceXForm:$ptr, i32:$old, i32:$new),


        


More information about the llvm-commits mailing list