From 8fce16ef1abd92c59ab2b02d59e6d16a1c0ba0b7 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 12 Sep 2003 16:02:12 +0000 Subject: [PATCH] Do not return success after checking only the FIRST USE of a gep instruction. Instead, check all uses. This fixes bug: ScalarRepl/2003-09-12-IncorrectPromote.ll This also fixes the miscompilation of Ptrdist/bc git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8493 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/ScalarReplAggregates.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 9f2e20f1f6f..2a6bddfb325 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -234,8 +234,11 @@ bool SROA::isSafeElementUse(Value *Ptr) { I != E; ++I) { Instruction *User = cast(*I); switch (User->getOpcode()) { - case Instruction::Load: return true; - case Instruction::Store: return User->getOperand(0) != Ptr; + case Instruction::Load: break; + case Instruction::Store: + // Store is ok if storing INTO the pointer, not storing the pointer + if (User->getOperand(0) == Ptr) return false; + break; case Instruction::GetElementPtr: { GetElementPtrInst *GEP = cast(User); if (GEP->getNumOperands() > 1) { @@ -243,7 +246,8 @@ bool SROA::isSafeElementUse(Value *Ptr) { !cast(GEP->getOperand(1))->isNullValue()) return false; // Using pointer arithmetic to navigate the array... } - return isSafeElementUse(GEP); + if (!isSafeElementUse(GEP)) return false; + break; } default: DEBUG(std::cerr << " Transformation preventing inst: " << *User); -- 2.34.1