If we have an add, do it in the pointer realm, not the int realm. This is critical...
authorAndrew Lenharth <andrewl@lenharth.org>
Tue, 19 Sep 2006 18:24:51 +0000 (18:24 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Tue, 19 Sep 2006 18:24:51 +0000 (18:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30496 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 40dfb4163c83da62407ccf5773cb88fd5ed993be..e5f2d9294eb442c21385df92281c41afe2217d6c 100644 (file)
@@ -1595,6 +1595,28 @@ FoundSExt:
         return R;
   }
 
+  // add (cast *A to intptrtype) B -> cast (GEP (cast *A to sbyte*) B) -> intptrtype
+  {
+    CastInst* CI = dyn_cast<CastInst>(LHS);
+    Value* Other = RHS;
+    if (!CI) {
+      CI = dyn_cast<CastInst>(RHS);
+      Other = LHS;
+    }
+    if (CI) {
+      const Type *UIntPtrTy = TD->getIntPtrType();
+      const Type *SIntPtrTy = UIntPtrTy->getSignedVersion();
+      if((CI->getType() == UIntPtrTy || CI->getType() == SIntPtrTy) 
+        && isa<PointerType>(CI->getOperand(0)->getType())) {
+       Instruction* I2 = new CastInst(CI->getOperand(0), PointerType::get(Type::SByteTy), "ctg", &I);
+       WorkList.push_back(I2);
+       I2 = new GetElementPtrInst(I2, Other, "ctg", &I);
+       WorkList.push_back(I2);
+       return new CastInst(I2, CI->getType());
+      }
+    }
+  }
+
   return Changed ? &I : 0;
 }