]> granicus.if.org Git - llvm/commitdiff
AMDGPU: Introduce maybeAtomic instruction flag
authorKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Fri, 21 Jul 2017 21:05:45 +0000 (21:05 +0000)
committerKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Fri, 21 Jul 2017 21:05:45 +0000 (21:05 +0000)
Testing is in the follow up change

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308779 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AMDGPU/BUFInstructions.td
lib/Target/AMDGPU/FLATInstructions.td
lib/Target/AMDGPU/SIDefines.h
lib/Target/AMDGPU/SIInstrFormats.td
lib/Target/AMDGPU/SIInstructions.td

index 0354a609f4eade067f705184e33c838e2b14407d..89caa65cdaf22df86b16d33308cc75be62699768 100644 (file)
@@ -437,6 +437,7 @@ class MUBUF_Load_Pseudo <string opName,
   let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
   let mayLoad = 1;
   let mayStore = 0;
+  let maybeAtomic = 1;
 }
 
 // FIXME: tfe can't be an operand because it requires a separate
@@ -483,6 +484,7 @@ class MUBUF_Store_Pseudo <string opName,
   let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
   let mayLoad = 0;
   let mayStore = 1;
+  let maybeAtomic = 1;
 }
 
 multiclass MUBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
@@ -566,6 +568,7 @@ class MUBUF_Atomic_Pseudo<string opName,
   let DisableWQM = 1;
   let has_glc = 0;
   let has_tfe = 0;
+  let maybeAtomic = 1;
 }
 
 class MUBUF_AtomicNoRet_Pseudo<string opName, int addrKind,
index fcfd629d55e1e9a7749c33e4fe33faf17d995b27..b038cc4fa2c052cc48a0344e08a4aa1e7bcd6718 100644 (file)
@@ -137,6 +137,7 @@ class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
   let has_saddr = HasSaddr;
   let enabled_saddr = EnableSaddr;
   let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
+  let maybeAtomic = 1;
 }
 
 class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
@@ -157,6 +158,7 @@ class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
   let has_saddr = HasSaddr;
   let enabled_saddr = EnableSaddr;
   let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
+  let maybeAtomic = 1;
 }
 
 multiclass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass> {
@@ -187,6 +189,7 @@ class FLAT_Scratch_Load_Pseudo <string opName, RegisterClass regClass,
   let enabled_saddr = EnableSaddr;
   let has_vaddr = !if(EnableSaddr, 0, 1);
   let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
+  let maybeAtomic = 1;
 }
 
 class FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit EnableSaddr = 0> : FLAT_Pseudo<
@@ -202,8 +205,8 @@ class FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit En
   let has_saddr = 1;
   let enabled_saddr = EnableSaddr;
   let has_vaddr = !if(EnableSaddr, 0, 1);
-
   let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
+  let maybeAtomic = 1;
 }
 
 multiclass FLAT_Scratch_Load_Pseudo<string opName, RegisterClass regClass> {
@@ -228,6 +231,7 @@ class FLAT_AtomicNoRet_Pseudo<string opName, dag outs, dag ins,
     let has_glc  = 0;
     let glcValue = 0;
     let has_vdst = 0;
+    let maybeAtomic = 1;
 }
 
 class FLAT_AtomicRet_Pseudo<string opName, dag outs, dag ins,
index e86d4b4d1e06ede794a55b8e54db5753c8bc16f2..1d151243f7deea04e1bf6d2e59f2a1675b0208c2 100644 (file)
@@ -68,7 +68,8 @@ enum : uint64_t {
   FIXED_SIZE = UINT64_C(1) << 40,
   VOPAsmPrefer32Bit = UINT64_C(1) << 41,
   HasFPClamp = UINT64_C(1) << 42,
-  VOP3_OPSEL = UINT64_C(1) << 43
+  VOP3_OPSEL = UINT64_C(1) << 43,
+  maybeAtomic = UINT64_C(1) << 44
 };
 
 // v_cmp_class_* etc. use a 10-bit mask for what operation is checked.
index aa491ea196548855a0dd8648c2db3321272fc058..f2e1437ae6bf68ae3c589a4463b3961f6320cb53 100644 (file)
@@ -45,7 +45,7 @@ class InstSI <dag outs, dag ins, string asm = "",
   field bit FLAT = 0;
   field bit DS = 0;
 
-   // Pseudo instruction formats.
+  // Pseudo instruction formats.
   field bit VGPRSpill = 0;
   field bit SGPRSpill = 0;
 
@@ -87,6 +87,9 @@ class InstSI <dag outs, dag ins, string asm = "",
   // modifier (gfx9 only).
   field bit VOP3_OPSEL = 0;
 
+  // Is it possible for this instruction to be atomic?
+  field bit maybeAtomic = 0;
+
   // These need to be kept in sync with the enum in SIInstrFlags.
   let TSFlags{0} = SALU;
   let TSFlags{1} = VALU;
@@ -133,6 +136,8 @@ class InstSI <dag outs, dag ins, string asm = "",
   let TSFlags{42} = FPClamp;
   let TSFlags{43} = VOP3_OPSEL;
 
+  let TSFlags{44} = maybeAtomic;
+
   let SchedRW = [Write32Bit];
 
   field bits<1> DisableSIDecoder = 0;
index 5826874d3c4815ad2b40238f71b235210d34af8f..f6b723d34740d4ec1915557c2f81c58c7dbaeded 100644 (file)
@@ -99,6 +99,7 @@ def ATOMIC_FENCE : SPseudoInstSI<
   [(atomic_fence (i32 imm:$ordering), (i32 imm:$scope))],
   "ATOMIC_FENCE $ordering, $scope"> {
   let hasSideEffects = 1;
+  let maybeAtomic = 1;
 }
 
 let hasSideEffects = 0, mayLoad = 0, mayStore = 0, Uses = [EXEC] in {