Implement Regression/Transforms/InstCombine/getelementptr_cast.ll, which
authorChris Lattner <sabre@nondot.org>
Sat, 27 Nov 2004 17:55:46 +0000 (17:55 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 27 Nov 2004 17:55:46 +0000 (17:55 +0000)
occurs many times in crafty

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

lib/Transforms/Scalar/InstructionCombining.cpp

index b279d9201ae8892c4e88633bdf5d59263b2c28ee..4acbc140900c4f0a85d8f84aa9f7aadf11d64ed0 100644 (file)
@@ -3783,6 +3783,21 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
                 GEP.setOperand(0, X);
                 return &GEP;
               }
+      } else if (GEP.getNumOperands() == 2) {
+        // Transform things like:
+        // %t = getelementptr ubyte* cast ([2 x sbyte]* %str to ubyte*), uint %V
+        // into:  %t1 = getelementptr [2 x sbyte*]* %str, int 0, uint %V; cast
+        Constant *X = CE->getOperand(0);
+        const Type *SrcElTy = cast<PointerType>(X->getType())->getElementType();
+        const Type *ResElTy =cast<PointerType>(CE->getType())->getElementType();
+        if (isa<ArrayType>(SrcElTy) &&
+            TD->getTypeSize(cast<ArrayType>(SrcElTy)->getElementType()) == 
+            TD->getTypeSize(ResElTy)) {
+          Value *V = InsertNewInstBefore(
+                 new GetElementPtrInst(X, Constant::getNullValue(Type::IntTy),
+                                       GEP.getOperand(1), GEP.getName()), GEP);
+          return new CastInst(V, GEP.getType());
+        }
       }
     }
   }