Must generate an instruction for GetElementPtr if single user is not
authorVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 10 Nov 2001 01:05:26 +0000 (01:05 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 10 Nov 2001 01:05:26 +0000 (01:05 +0000)
a memory instruction!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1238 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9InstrSelection.cpp

index 25299171b8cddbfe951c820ea7b22c00a137cec6..cd017b6eb27ae5f072719c9a878a35a10c8a5782 100644 (file)
@@ -1819,16 +1819,26 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
       case 56: // reg:   GetElemPtrIdx(reg,reg)
         if (subtreeRoot->parent() != NULL)
           {
-            // Check if the parent was an array access.
-            // If so, we still need to generate this instruction.
-            MemAccessInst* memInst = (MemAccessInst*)
-              subtreeRoot->getInstruction();
-            const PointerType* ptrType =
-              (const PointerType*) memInst->getPtrOperand()->getType();
-            if (! ptrType->getValueType()->isArrayType())
-              {// we don't need a separate instr
-                numInstr = 0;          // don't forward operand!
-                break;
+            // If the parent was a memory operation and not an array access,
+            // the parent will fold this instruction in so generate nothing.
+            // 
+            Instruction* parent =
+              cast<Instruction>(subtreeRoot->parent()->getValue());
+            if (parent->getOpcode() == Instruction::Load ||
+                parent->getOpcode() == Instruction::Store ||
+                parent->getOpcode() == Instruction::GetElementPtr)
+              {
+                // Check if the parent is an array access,
+                // If so, we still need to generate this instruction.
+                GetElementPtrInst* getElemInst =
+                  cast<GetElementPtrInst>(subtreeRoot->getInstruction());
+                const PointerType* ptrType =
+                  (const PointerType*) getElemInst->getPtrOperand()->getType();
+                if (! ptrType->getValueType()->isArrayType())
+                  {// we don't need a separate instr
+                    numInstr = 0;              // don't forward operand!
+                    break;
+                  }
               }
           }
         // else in all other cases we need to a separate ADD instruction