InstSimplify: Don't simplify gep X, (Y-X) to Y if types differ

It's incorrect to perform this simplification if the types differ.
A bitcast would need to be inserted for this to work.

This fixes PR20771.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216597 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2014-08-27 20:08:34 +00:00
parent 1c768816d7
commit 48164ed24d
2 changed files with 16 additions and 1 deletions

View File

@ -2837,7 +2837,8 @@ static Value *SimplifyGEPInst(ArrayRef<Value *> Ops, const Query &Q, unsigned) {
return Constant::getNullValue(GEPTy);
Value *Temp;
if (match(P, m_PtrToInt(m_Value(Temp))))
return Temp;
if (Temp->getType() == GEPTy)
return Temp;
return nullptr;
};

View File

@ -64,3 +64,17 @@ define i64* @test6(i64* %b) {
; CHECK-LABEL: @test6
; CHECK-NEXT: ret i64* null
}
define i8* @test7(i8* %b, i8** %e) {
%e_ptr = ptrtoint i8** %e to i64
%b_ptr = ptrtoint i8* %b to i64
%sub = sub i64 %e_ptr, %b_ptr
%gep = getelementptr inbounds i8* %b, i64 %sub
ret i8* %gep
; CHECK-LABEL: @test7
; CHECK-NEXT: ptrtoint
; CHECK-NEXT: ptrtoint
; CHECK-NEXT: sub
; CHECK-NEXT: getelementptr
; CHECK-NEXT: ret
}