Do not return success after checking only the FIRST USE of a gep instruction.
authorChris Lattner <sabre@nondot.org>
Fri, 12 Sep 2003 16:02:12 +0000 (16:02 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 12 Sep 2003 16:02:12 +0000 (16:02 +0000)
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

index 9f2e20f1f6f953934975a4bc4883dbd9dd2f8d89..2a6bddfb325e455f1982ee7325028fd94e715277 100644 (file)
@@ -234,8 +234,11 @@ bool SROA::isSafeElementUse(Value *Ptr) {
        I != E; ++I) {
     Instruction *User = cast<Instruction>(*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<GetElementPtrInst>(User);
       if (GEP->getNumOperands() > 1) {
@@ -243,7 +246,8 @@ bool SROA::isSafeElementUse(Value *Ptr) {
             !cast<Constant>(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);