From 16d7955eb0f1e9e000976c4e714e7fd36471ea19 Mon Sep 17 00:00:00 2001 From: Andrew Lenharth Date: Tue, 19 Sep 2006 18:24:51 +0000 Subject: [PATCH] If we have an add, do it in the pointer realm, not the int realm. This is critical in the linux kernel for pointer analysis correctness git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30496 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/InstructionCombining.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 40dfb4163c8..e5f2d9294eb 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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(LHS); + Value* Other = RHS; + if (!CI) { + CI = dyn_cast(RHS); + Other = LHS; + } + if (CI) { + const Type *UIntPtrTy = TD->getIntPtrType(); + const Type *SIntPtrTy = UIntPtrTy->getSignedVersion(); + if((CI->getType() == UIntPtrTy || CI->getType() == SIntPtrTy) + && isa(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; } -- 2.34.1