Fix a bug in InstCombine where we would incorrectly attempt to construct a

bitcast between pointers of two different address spaces if they happened to have
the same pointer size.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203862 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2014-03-13 22:51:43 +00:00
parent 43d5e074aa
commit d3fc1be4f6
2 changed files with 19 additions and 0 deletions

View File

@ -335,6 +335,13 @@ static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI,
NewLoad->setAlignment(LI.getAlignment());
NewLoad->setAtomic(LI.getOrdering(), LI.getSynchScope());
// Now cast the result of the load.
PointerType *OldTy = dyn_cast<PointerType>(NewLoad->getType());
PointerType *NewTy = dyn_cast<PointerType>(LI.getType());
if (OldTy && NewTy &&
OldTy->getAddressSpace() != NewTy->getAddressSpace()) {
return new AddrSpaceCastInst(NewLoad, LI.getType());
}
return new BitCastInst(NewLoad, LI.getType());
}
}

View File

@ -0,0 +1,12 @@
; RUN: opt -instcombine -S < %s | FileCheck %s
target datalayout = "e-p:64:64:64-n8:16:32:64"
define i32* @pointer_to_addrspace_pointer(i32 addrspace(1)** %x) nounwind {
; CHECK-LABEL: @pointer_to_addrspace_pointer(
; CHECK: load
; CHECK: addrspacecast
%y = bitcast i32 addrspace(1)** %x to i32**
%z = load i32** %y
ret i32* %z
}