Summary:
This change is part of step six in the series of changes to remove
the alignment argument from memcpy/memmove/memset in favour of
alignment attributes. At this point all uses of
MemIntrinsicInst::[get|set]Alignment() have been updated, so we now
remove these methods entirely to discourage their use.
Steps:
Step 1) Remove alignment parameter and create alignment parameter attributes for
memcpy/memmove/memset. ( rL322965, rC322964, rL322963 )
Step 2) Expand the IRBuilder API to allow creation of memcpy/memmove with differing
source and dest alignments. ( rL323597 )
Step 3) Update Clang to use the new IRBuilder API. ( rC323617 )
Step 4) Update Polly to use the new IRBuilder API. ( rL323618 )
Step 5) Update LLVM passes that create memcpy/memmove calls to use the new IRBuilder API,
and those that use use MemIntrinsicInst::[get|set]Alignment() to use [get|set]DestAlignment()
and [get|set]SourceAlignment() instead. ( rL323886, rL323891, rL324148, rL324273, rL324278,
rL324384, rL324395, rL324402, rL324626, rL324642, rL324653, rL324654, rL324773, rL324774,
rL324781, rL324784, rL324955, rL324960, rL325816, rL327398, rL327421, rL328097 )
Step 6) Remove the single-alignment IRBuilder API for memcpy/memmove, and the
MemIntrinsicInst::[get|set]Alignment() methods.
Reference
http://lists.llvm.org/pipermail/llvm-dev/2015-August/089384.html
http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-
20151109/312083.html
llvm-svn: 328315
enum { ARG_VOLATILE = 3 };
public:
- // TODO: Remove this method entirely.
- // Interim, for now, during transition from having an alignment
- // arg to using alignment attributes.
- unsigned getAlignment() const;
-
ConstantInt *getVolatileCst() const {
return cast<ConstantInt>(
const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
return !getVolatileCst()->isZero();
}
- // TODO: Remove this method entirely. It is here only during transition
- // from having an explicit alignment arg to using alignment attributes.
- // For now we always set dest & source alignment attributes to match
- void setAlignment(unsigned Align);
-
void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
// Methods for support type inquiry through isa, cast, and dyn_cast:
}
};
- inline unsigned MemIntrinsic::getAlignment() const {
- if (const auto *MTI = dyn_cast<MemTransferInst>(this))
- return std::min(MTI->getDestAlignment(), MTI->getSourceAlignment());
- else
- return getDestAlignment();
- }
-
- inline void MemIntrinsic::setAlignment(unsigned Align) {
- setDestAlignment(Align);
- if (auto *MTI = dyn_cast<MemTransferInst>(this))
- MTI->setSourceAlignment(Align);
- }
-
/// This class wraps the llvm.memcpy intrinsic.
class MemCpyInst : public MemTransferInst {
public: