Stay away from str <undef> in ARMLoadStoreOpt. This pass does not understand
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 24 Feb 2010 18:57:08 +0000 (18:57 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 24 Feb 2010 18:57:08 +0000 (18:57 +0000)
<undef> operands, and can cause scavenger failures when it translates
<kill,undef> to <kill>.

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

lib/Target/ARM/ARMLoadStoreOptimizer.cpp

index 4e2d1815dc6778380ea5d5f0486b9cdedfafbe72..5b4f02d6b75b912681845edb8051cc2be21db52a 100644 (file)
@@ -748,11 +748,19 @@ static bool isMemoryOp(const MachineInstr *MI) {
     if (MMO->isVolatile())
       return false;
 
-    // Unaligned ldr/str is emulated by some kernels, but unaligned ldm/stm is not.
+    // Unaligned ldr/str is emulated by some kernels, but unaligned ldm/stm is
+    // not.
     if (MMO->getAlignment() < 4)
       return false;
   }
 
+  // str <undef> could probably be eliminated entirely, but for now we just want
+  // to avoid making a mess of it.
+  // FIXME: Use str <undef> as a wildcard to enable better stm folding.
+  if (MI->getNumOperands() > 0 && MI->getOperand(0).isReg() &&
+      MI->getOperand(0).isUndef())
+    return false;
+
   int Opcode = MI->getOpcode();
   switch (Opcode) {
   default: break;