forked from OSchip/llvm-project
Change MachineMemOperand's alignment value to be the alignment of
the base pointer, without the offset. This matches MemSDNode's new alignment behavior, and holds more interesting information. llvm-svn: 82473
This commit is contained in:
parent
38c3ae9bc4
commit
e7c8242baa
|
@ -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; }
|
||||
|
|
|
@ -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!");
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue