diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-02-14 00:49:12 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-02-14 00:49:12 +0000 |
| commit | aa689f507901f610aa51eca83c4234fd0066dcff (patch) | |
| tree | 187ab5e62332573d292bb6817b68afe088851db7 /llvm/lib/Transforms/InstCombine | |
| parent | 27edf47bc098c8fca763e5325897529c5708b108 (diff) | |
| download | bcm5719-llvm-aa689f507901f610aa51eca83c4234fd0066dcff.tar.gz bcm5719-llvm-aa689f507901f610aa51eca83c4234fd0066dcff.zip | |
Do more addrspacecast transforms that happen for bitcast.
Makes addrspacecast (gep) do addrspacecast (gep) instead.
llvm-svn: 201376
Diffstat (limited to 'llvm/lib/Transforms/InstCombine')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 04c1499220c..e4365d691f7 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1220,9 +1220,7 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { if (!StrippedPtrTy) return 0; - if (StrippedPtr != PtrOp && - StrippedPtrTy->getAddressSpace() == GEP.getPointerAddressSpace()) { - + if (StrippedPtr != PtrOp) { bool HasZeroPointerIndex = false; if (ConstantInt *C = dyn_cast<ConstantInt>(GEP.getOperand(1))) HasZeroPointerIndex = C->isZero(); @@ -1276,8 +1274,11 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { Value *NewGEP = GEP.isInBounds() ? Builder->CreateInBoundsGEP(StrippedPtr, Idx, GEP.getName()) : Builder->CreateGEP(StrippedPtr, Idx, GEP.getName()); + // V and GEP are both pointer types --> BitCast - return new BitCastInst(NewGEP, GEP.getType()); + if (StrippedPtrTy->getAddressSpace() == GEP.getPointerAddressSpace()) + return new BitCastInst(NewGEP, GEP.getType()); + return new AddrSpaceCastInst(NewGEP, GEP.getType()); } // Transform things like: @@ -1307,8 +1308,11 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { Value *NewGEP = GEP.isInBounds() && NSW ? Builder->CreateInBoundsGEP(StrippedPtr, NewIdx, GEP.getName()) : Builder->CreateGEP(StrippedPtr, NewIdx, GEP.getName()); + // The NewGEP must be pointer typed, so must the old one -> BitCast - return new BitCastInst(NewGEP, GEP.getType()); + if (StrippedPtrTy->getAddressSpace() == GEP.getPointerAddressSpace()) + return new BitCastInst(NewGEP, GEP.getType()); + return new AddrSpaceCastInst(NewGEP, GEP.getType()); } } } @@ -1348,7 +1352,9 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { Builder->CreateInBoundsGEP(StrippedPtr, Off, GEP.getName()) : Builder->CreateGEP(StrippedPtr, Off, GEP.getName()); // The NewGEP must be pointer typed, so must the old one -> BitCast - return new BitCastInst(NewGEP, GEP.getType()); + if (StrippedPtrTy->getAddressSpace() == GEP.getPointerAddressSpace()) + return new BitCastInst(NewGEP, GEP.getType()); + return new AddrSpaceCastInst(NewGEP, GEP.getType()); } } } |

