]> granicus.if.org Git - llvm/commitdiff
GlobalISel: Don't reduce elements for atomic load/store
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sun, 27 Jan 2019 22:36:24 +0000 (22:36 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Sun, 27 Jan 2019 22:36:24 +0000 (22:36 +0000)
This is invalid for the same reason as in the narrowScalar handling
for load.

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

lib/CodeGen/GlobalISel/LegalizerHelper.cpp
test/CodeGen/AMDGPU/GlobalISel/no-legalize-atomic.mir [new file with mode: 0644]

index c86b3e5468663c85eb92500d541e882040702b4e..62ed8af2c9a3a4a3ff96f78f090aa8bd574e4340 100644 (file)
@@ -1445,6 +1445,14 @@ LegalizerHelper::fewerElementsVectorLoadStore(MachineInstr &MI, unsigned TypeIdx
   if (TypeIdx != 0)
     return UnableToLegalize;
 
+  MachineMemOperand *MMO = *MI.memoperands_begin();
+
+  // This implementation doesn't work for atomics. Give up instead of doing
+  // something invalid.
+  if (MMO->getOrdering() != AtomicOrdering::NotAtomic ||
+      MMO->getFailureOrdering() != AtomicOrdering::NotAtomic)
+    return UnableToLegalize;
+
   bool IsLoad = MI.getOpcode() == TargetOpcode::G_LOAD;
   unsigned ValReg = MI.getOperand(0).getReg();
   unsigned AddrReg = MI.getOperand(1).getReg();
@@ -1459,7 +1467,7 @@ LegalizerHelper::fewerElementsVectorLoadStore(MachineInstr &MI, unsigned TypeIdx
   const LLT OffsetTy =
     LLT::scalar(MRI.getType(AddrReg).getScalarSizeInBits());
   MachineFunction &MF = *MI.getMF();
-  MachineMemOperand *MMO = *MI.memoperands_begin();
+
   for (unsigned Idx = 0; Idx < NumParts; ++Idx) {
     unsigned Adjustment = Idx * NarrowTy.getSizeInBits() / 8;
     unsigned Alignment = MinAlign(MMO->getAlignment(), Adjustment);
diff --git a/test/CodeGen/AMDGPU/GlobalISel/no-legalize-atomic.mir b/test/CodeGen/AMDGPU/GlobalISel/no-legalize-atomic.mir
new file mode 100644 (file)
index 0000000..a54a095
--- /dev/null
@@ -0,0 +1,46 @@
+# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -O0 -run-pass=legalizer -global-isel-abort=0 -o - %s | FileCheck %s
+
+# CHECK: %1:_(<8 x s32>) = G_LOAD %0(p1) :: (load monotonic 32, addrspace 1)
+# CHECK:  G_STORE %1(<8 x s32>), %0(p1) :: (store monotonic 32, addrspace 1)
+# CHECK: %1:_(s256) = G_LOAD %0(p1) :: (load monotonic 32, addrspace 1)
+# CHECK:  G_STORE %1(s256), %0(p1) :: (store monotonic 32, addrspace 1)
+
+---
+name: test_atomic_load_global_v8s32
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+    %0:_(p1) = COPY $vgpr0_vgpr1
+    %1:_(<8 x s32>) = G_LOAD %0 :: (load monotonic  32, addrspace 1, align 32)
+    $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 = COPY %1
+...
+
+---
+name: test_atomic_store_global_v8s32
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9
+    %0:_(p1) = COPY $vgpr0_vgpr1
+    %1:_(<8 x s32>) = COPY $vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9
+    G_STORE %1, %0 :: (store monotonic  32, addrspace 1, align 32)
+...
+
+---
+name: test_atomic_load_global_s256
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+    %0:_(p1) = COPY $vgpr0_vgpr1
+    %1:_(s256) = G_LOAD %0 :: (load monotonic  32, addrspace 1, align 32)
+    $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 = COPY %1
+...
+
+---
+name: test_atomic_store_global_s256
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9
+    %0:_(p1) = COPY $vgpr0_vgpr1
+    %1:_(s256) = COPY $vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9
+    G_STORE %1, %0 :: (store monotonic  32, addrspace 1, align 32)
+...