[AArch64][GlobalISel] Don't form truncstores in postlegalizer-lowering for s128.
authorAmara Emerson <amara@apple.com>
Tue, 20 Jul 2021 07:03:37 +0000 (00:03 -0700)
committerAmara Emerson <amara@apple.com>
Tue, 20 Jul 2021 07:04:34 +0000 (00:04 -0700)
We don't support truncating s128 stores, so don't form them.

llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp
llvm/test/CodeGen/AArch64/GlobalISel/postlegalizer-lowering-truncstore.mir

index 45f2d81..84ecb4b 100644 (file)
@@ -959,7 +959,10 @@ static bool matchFormTruncstore(MachineInstr &MI, MachineRegisterInfo &MRI,
   if (MRI.getType(DstReg).isVector())
     return false;
   // Match a store of a truncate.
-  return mi_match(DstReg, MRI, m_GTrunc(m_Reg(SrcReg)));
+  if (!mi_match(DstReg, MRI, m_GTrunc(m_Reg(SrcReg))))
+    return false;
+  // Only form truncstores for value types of max 64b.
+  return MRI.getType(SrcReg).getSizeInBits() <= 64;
 }
 
 static bool applyFormTruncstore(MachineInstr &MI, MachineRegisterInfo &MRI,
index d302e7f..e96fae4 100644 (file)
@@ -32,3 +32,19 @@ body: |
     %trunc:_(<4 x s8>) = G_TRUNC %val
     G_STORE %trunc(<4 x s8>), %ptr(p0) :: (store (<4 x s8>))
 ...
+---
+name:            truncstore_too_large
+legalized:       true
+body: |
+  bb.0.entry:
+    liveins: $x0
+    ; CHECK-LABEL: name: truncstore_too_large
+    ; CHECK: %ptr:_(p0) = COPY $x0
+    ; CHECK: %val:_(s128) = COPY $q0
+    ; CHECK: %trunc:_(s32) = G_TRUNC %val(s128)
+    ; CHECK: G_STORE %trunc(s32), %ptr(p0) :: (store (s32))
+    %ptr:_(p0) = COPY $x0
+    %val:_(s128) = COPY $q0
+    %trunc:_(s32) = G_TRUNC %val
+    G_STORE %trunc(s32), %ptr(p0) :: (store (s32))
+...