Change MachineMemOperand's alignment value to be the alignment of
authorDan Gohman <gohman@apple.com>
Mon, 21 Sep 2009 19:47:04 +0000 (19:47 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 21 Sep 2009 19:47:04 +0000 (19:47 +0000)
the base pointer, without the offset. This matches MemSDNode's
new alignment behavior, and holds more interesting information.

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

include/llvm/CodeGen/MachineMemOperand.h
lib/CodeGen/MachineInstr.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
lib/CodeGen/StackSlotColoring.cpp
lib/CodeGen/TargetInstrInfoImpl.cpp

index de238e48d10a84000e6917ce18f625f21c7e473b..1b01c4893ef9be8de48471b6668c16029f05b6bb 100644 (file)
@@ -16,6 +16,8 @@
 #ifndef LLVM_CODEGEN_MACHINEMEMOPERAND_H
 #define LLVM_CODEGEN_MACHINEMEMOPERAND_H
 
+#include "llvm/Support/MathExtras.h"
+
 namespace llvm {
 
 class Value;
@@ -47,9 +49,9 @@ public:
   };
 
   /// MachineMemOperand - Construct an MachineMemOperand object with the
-  /// specified address Value, flags, offset, size, and alignment.
+  /// specified address Value, flags, offset, size, and base alignment.
   MachineMemOperand(const Value *v, unsigned int f, int64_t o, uint64_t s,
-                    unsigned int a);
+                    unsigned int base_alignment);
 
   /// getValue - Return the base address of the memory access. This may either
   /// be a normal LLVM IR Value, or one of the special values used in CodeGen.
@@ -72,8 +74,14 @@ public:
   uint64_t getSize() const { return Size; }
 
   /// getAlignment - Return the minimum known alignment in bytes of the
-  /// memory reference.
-  unsigned int getAlignment() const { return (1u << (Flags >> 3)) >> 1; }
+  /// actual memory reference.
+  uint64_t getAlignment() const {
+    return MinAlign(getBaseAlignment(), getOffset());
+  }
+
+  /// getBaseAlignment - Return the minimum known alignment in bytes of the
+  /// base address, without the offset.
+  uint64_t getBaseAlignment() const { return (1u << (Flags >> 3)) >> 1; }
 
   bool isLoad() const { return Flags & MOLoad; }
   bool isStore() const { return Flags & MOStore; }
index cf6597d8091b44024868ea108ce054dec8b809b9..2f5964f14083d333fcafb2a8826cfab79f5fcdb9 100644 (file)
@@ -284,7 +284,7 @@ MachineMemOperand::MachineMemOperand(const Value *v, unsigned int f,
                                      int64_t o, uint64_t s, unsigned int a)
   : Offset(o), Size(s), V(v),
     Flags((f & 7) | ((Log2_32(a) + 1) << 3)) {
-  assert(isPowerOf2_32(a) && "Alignment is not a power of 2!");
+  assert(getBaseAlignment() == a && "Alignment is not a power of 2!");
   assert((isLoad() || isStore()) && "Not a load/store!");
 }
 
index 669526780b46efb59adcdecb9760bb32cfa9b83f..87ea19be86929e4d20945c65fc88f5b995f2b7d0 100644 (file)
@@ -5015,10 +5015,10 @@ MachineMemOperand MemSDNode::getMemOperand() const {
   dyn_cast<const FrameIndexSDNode>(getBasePtr().getNode());
   if (!getSrcValue() && FI)
     return MachineMemOperand(PseudoSourceValue::getFixedStack(FI->getIndex()),
-                             Flags, 0, Size, getAlignment());
+                             Flags, 0, Size, getOriginalAlignment());
   else
     return MachineMemOperand(getSrcValue(), Flags, getSrcValueOffset(),
-                             Size, getAlignment());
+                             Size, getOriginalAlignment());
 }
 
 /// Profile - Gather unique data for the node.
index e62c0506b3ea98c31a3d65abb9801ca1bdb7a65f..7d88dad6c8c322b58285fcfa0b2c2ed149a29f99 100644 (file)
@@ -473,7 +473,7 @@ void StackSlotColoring::RewriteInstruction(MachineInstr *MI, int OldFI,
     else {
       MachineMemOperand MMO(PseudoSourceValue::getFixedStack(NewFI),
                             MMOs[i].getFlags(), MMOs[i].getOffset(),
-                            MMOs[i].getSize(),  MMOs[i].getAlignment());
+                            MMOs[i].getSize(),  MMOs[i].getBaseAlignment());
       MI->addMemOperand(MF, MMO);
     }
   }
index 8aca0ccd42404a5905a9c39c4e0b34ff96010eeb..f184cb74f0a093b9461c662aacc71e63ec325ae8 100644 (file)
@@ -205,7 +205,7 @@ TargetInstrInfo::foldMemoryOperand(MachineFunction &MF,
   assert(MFI.getObjectOffset(FrameIndex) != -1);
   MachineMemOperand MMO(PseudoSourceValue::getFixedStack(FrameIndex),
                         Flags,
-                        MFI.getObjectOffset(FrameIndex),
+                        /*Offset=*/0,
                         MFI.getObjectSize(FrameIndex),
                         MFI.getObjectAlignment(FrameIndex));
   NewMI->addMemOperand(MF, MMO);