From 3b7bfdb201fadea61639dee8f4de4181d745e858 Mon Sep 17 00:00:00 2001
From: Chris Lattner <sabre@nondot.org>
Date: Sat, 14 Jul 2001 06:11:51 +0000
Subject: [PATCH] Add knowledge about the struct form of the GetElementPtr
 instruction

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/Transforms/Scalar/SCCP.cpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp
index 79d90e65326..63ce5125087 100644
--- a/lib/Transforms/Scalar/SCCP.cpp
+++ b/lib/Transforms/Scalar/SCCP.cpp
@@ -23,6 +23,7 @@
 #include "llvm/ConstantPool.h"
 #include "llvm/InstrTypes.h"
 #include "llvm/iOther.h"
+#include "llvm/iMemory.h"
 #include "llvm/iTerminators.h"
 #include "llvm/Tools/STLExtras.h"
 #include "llvm/Assembly/Writer.h"
@@ -429,8 +430,13 @@ void SCCP::UpdateInstruction(Instruction *I) {
   
   //===-------------------------------------------------------------------===//
   // Handle Unary instructions...
+  //   Also treated as unary here, are cast instructions and getelementptr
+  //   instructions on struct* operands.
   //
-  if (I->isUnaryOp() || I->getOpcode() == Instruction::Cast) {
+  if (I->isUnaryOp() || I->getOpcode() == Instruction::Cast || 
+      (I->getOpcode() == Instruction::GetElementPtr &&
+       ((GetElementPtrInst*)I)->isStructSelector())) {
+
     Value *V = I->getOperand(0);
     InstVal &VState = getValueState(V);
     if (VState.isOverdefined()) {        // Inherit overdefinedness of operand