1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

Add comment as following:

load and store reference same memory location, the memory location
is represented by getelementptr with two uses (load and store) and
the getelementptr's base is alloca with single use. At this point,
instructions from alloca to store can be removed.
(this pattern is generated when bitfield is accessed.)
For example,
%u = alloca %struct.test, align 4               ; [#uses=1]
%0 = getelementptr inbounds %struct.test* %u, i32 0, i32 0;[#uses=2]
%1 = load i8* %0, align 4                       ; [#uses=1]
%2 = and i8 %1, -16                             ; [#uses=1]
%3 = or i8 %2, 5                                ; [#uses=1]
store i8 %3, i8* %0, align 4

llvm-svn: 127565
This commit is contained in:
Jin-Gu Kang 2011-03-13 14:05:51 +00:00
parent d57f14037a
commit 5000ba8961

View File

@ -433,6 +433,18 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
!SI.isVolatile()) {
if (LI == Val)
return EraseInstFromFunction(SI);
// load and store reference same memory location, the memory location
// is represented by getelementptr with two uses (load and store) and
// the getelementptr's base is alloca with single use. At this point,
// instructions from alloca to store can be removed.
// (this pattern is generated when bitfield is accessed.)
// For example,
// %u = alloca %struct.test, align 4 ; [#uses=1]
// %0 = getelementptr inbounds %struct.test* %u, i32 0, i32 0;[#uses=2]
// %1 = load i8* %0, align 4 ; [#uses=1]
// %2 = and i8 %1, -16 ; [#uses=1]
// %3 = or i8 %2, 5 ; [#uses=1]
// store i8 %3, i8* %0, align 4
if (Ptr->hasNUses(2)) {
if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr)) {
if (isa<AllocaInst>(GEP->getOperand(0))) {