From 48164ed24df7df33e416b83d40135ad97a6db489 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 27 Aug 2014 20:08:34 +0000 Subject: [PATCH] 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 --- lib/Analysis/InstructionSimplify.cpp | 3 ++- test/Transforms/InstSimplify/gep.ll | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 118579d5b72..9f3b2876afe 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -2837,7 +2837,8 @@ static Value *SimplifyGEPInst(ArrayRef 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; }; diff --git a/test/Transforms/InstSimplify/gep.ll b/test/Transforms/InstSimplify/gep.ll index d1704bf80bc..49a97f133ce 100644 --- a/test/Transforms/InstSimplify/gep.ll +++ b/test/Transforms/InstSimplify/gep.ll @@ -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 +}