| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 1 | //===- InstCombineLoadStoreAlloca.cpp -------------------------------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file implements the visit functions for load, store and alloca. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 | #include "InstCombine.h" | 
|  | 15 | #include "llvm/IntrinsicInst.h" | 
| Dan Gohman | 826bdf8 | 2010-05-28 16:19:17 +0000 | [diff] [blame] | 16 | #include "llvm/Analysis/Loads.h" | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 17 | #include "llvm/Target/TargetData.h" | 
|  | 18 | #include "llvm/Transforms/Utils/BasicBlockUtils.h" | 
|  | 19 | #include "llvm/Transforms/Utils/Local.h" | 
|  | 20 | #include "llvm/ADT/Statistic.h" | 
|  | 21 | using namespace llvm; | 
|  | 22 |  | 
|  | 23 | STATISTIC(NumDeadStore, "Number of dead stores eliminated"); | 
|  | 24 |  | 
|  | 25 | Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) { | 
| Dan Gohman | df5d7dc | 2010-05-28 15:09:00 +0000 | [diff] [blame] | 26 | // Ensure that the alloca array size argument has type intptr_t, so that | 
|  | 27 | // any casting is exposed early. | 
|  | 28 | if (TD) { | 
|  | 29 | const Type *IntPtrTy = TD->getIntPtrType(AI.getContext()); | 
|  | 30 | if (AI.getArraySize()->getType() != IntPtrTy) { | 
|  | 31 | Value *V = Builder->CreateIntCast(AI.getArraySize(), | 
|  | 32 | IntPtrTy, false); | 
|  | 33 | AI.setOperand(0, V); | 
|  | 34 | return &AI; | 
|  | 35 | } | 
|  | 36 | } | 
|  | 37 |  | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 38 | // Convert: alloca Ty, C - where C is a constant != 1 into: alloca [C x Ty], 1 | 
|  | 39 | if (AI.isArrayAllocation()) {  // Check C != 1 | 
|  | 40 | if (const ConstantInt *C = dyn_cast<ConstantInt>(AI.getArraySize())) { | 
|  | 41 | const Type *NewTy = | 
|  | 42 | ArrayType::get(AI.getAllocatedType(), C->getZExtValue()); | 
|  | 43 | assert(isa<AllocaInst>(AI) && "Unknown type of allocation inst!"); | 
|  | 44 | AllocaInst *New = Builder->CreateAlloca(NewTy, 0, AI.getName()); | 
|  | 45 | New->setAlignment(AI.getAlignment()); | 
|  | 46 |  | 
|  | 47 | // Scan to the end of the allocation instructions, to skip over a block of | 
|  | 48 | // allocas if possible...also skip interleaved debug info | 
|  | 49 | // | 
|  | 50 | BasicBlock::iterator It = New; | 
|  | 51 | while (isa<AllocaInst>(*It) || isa<DbgInfoIntrinsic>(*It)) ++It; | 
|  | 52 |  | 
|  | 53 | // Now that I is pointing to the first non-allocation-inst in the block, | 
|  | 54 | // insert our getelementptr instruction... | 
|  | 55 | // | 
|  | 56 | Value *NullIdx =Constant::getNullValue(Type::getInt32Ty(AI.getContext())); | 
|  | 57 | Value *Idx[2]; | 
|  | 58 | Idx[0] = NullIdx; | 
|  | 59 | Idx[1] = NullIdx; | 
|  | 60 | Value *V = GetElementPtrInst::CreateInBounds(New, Idx, Idx + 2, | 
|  | 61 | New->getName()+".sub", It); | 
|  | 62 |  | 
|  | 63 | // Now make everything use the getelementptr instead of the original | 
|  | 64 | // allocation. | 
|  | 65 | return ReplaceInstUsesWith(AI, V); | 
|  | 66 | } else if (isa<UndefValue>(AI.getArraySize())) { | 
|  | 67 | return ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType())); | 
|  | 68 | } | 
|  | 69 | } | 
|  | 70 |  | 
|  | 71 | if (TD && isa<AllocaInst>(AI) && AI.getAllocatedType()->isSized()) { | 
|  | 72 | // If alloca'ing a zero byte object, replace the alloca with a null pointer. | 
|  | 73 | // Note that we only do this for alloca's, because malloc should allocate | 
|  | 74 | // and return a unique pointer, even for a zero byte allocation. | 
|  | 75 | if (TD->getTypeAllocSize(AI.getAllocatedType()) == 0) | 
|  | 76 | return ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType())); | 
|  | 77 |  | 
|  | 78 | // If the alignment is 0 (unspecified), assign it the preferred alignment. | 
|  | 79 | if (AI.getAlignment() == 0) | 
|  | 80 | AI.setAlignment(TD->getPrefTypeAlignment(AI.getAllocatedType())); | 
|  | 81 | } | 
|  | 82 |  | 
|  | 83 | return 0; | 
|  | 84 | } | 
|  | 85 |  | 
|  | 86 |  | 
|  | 87 | /// InstCombineLoadCast - Fold 'load (cast P)' -> cast (load P)' when possible. | 
|  | 88 | static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI, | 
|  | 89 | const TargetData *TD) { | 
|  | 90 | User *CI = cast<User>(LI.getOperand(0)); | 
|  | 91 | Value *CastOp = CI->getOperand(0); | 
|  | 92 |  | 
|  | 93 | const PointerType *DestTy = cast<PointerType>(CI->getType()); | 
|  | 94 | const Type *DestPTy = DestTy->getElementType(); | 
|  | 95 | if (const PointerType *SrcTy = dyn_cast<PointerType>(CastOp->getType())) { | 
|  | 96 |  | 
|  | 97 | // If the address spaces don't match, don't eliminate the cast. | 
|  | 98 | if (DestTy->getAddressSpace() != SrcTy->getAddressSpace()) | 
|  | 99 | return 0; | 
|  | 100 |  | 
|  | 101 | const Type *SrcPTy = SrcTy->getElementType(); | 
|  | 102 |  | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 103 | if (DestPTy->isIntegerTy() || DestPTy->isPointerTy() || | 
|  | 104 | DestPTy->isVectorTy()) { | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 105 | // If the source is an array, the code below will not succeed.  Check to | 
|  | 106 | // see if a trivial 'gep P, 0, 0' will help matters.  Only do this for | 
|  | 107 | // constants. | 
|  | 108 | if (const ArrayType *ASrcTy = dyn_cast<ArrayType>(SrcPTy)) | 
|  | 109 | if (Constant *CSrc = dyn_cast<Constant>(CastOp)) | 
|  | 110 | if (ASrcTy->getNumElements() != 0) { | 
|  | 111 | Value *Idxs[2]; | 
|  | 112 | Idxs[0] = Constant::getNullValue(Type::getInt32Ty(LI.getContext())); | 
|  | 113 | Idxs[1] = Idxs[0]; | 
|  | 114 | CastOp = ConstantExpr::getGetElementPtr(CSrc, Idxs, 2); | 
|  | 115 | SrcTy = cast<PointerType>(CastOp->getType()); | 
|  | 116 | SrcPTy = SrcTy->getElementType(); | 
|  | 117 | } | 
|  | 118 |  | 
|  | 119 | if (IC.getTargetData() && | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 120 | (SrcPTy->isIntegerTy() || SrcPTy->isPointerTy() || | 
|  | 121 | SrcPTy->isVectorTy()) && | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 122 | // Do not allow turning this into a load of an integer, which is then | 
|  | 123 | // casted to a pointer, this pessimizes pointer analysis a lot. | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 124 | (SrcPTy->isPointerTy() == LI.getType()->isPointerTy()) && | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 125 | IC.getTargetData()->getTypeSizeInBits(SrcPTy) == | 
|  | 126 | IC.getTargetData()->getTypeSizeInBits(DestPTy)) { | 
|  | 127 |  | 
|  | 128 | // Okay, we are casting from one integer or pointer type to another of | 
|  | 129 | // the same size.  Instead of casting the pointer before the load, cast | 
|  | 130 | // the result of the loaded value. | 
| Bob Wilson | 4b71b6c | 2010-01-30 00:41:10 +0000 | [diff] [blame] | 131 | LoadInst *NewLoad = | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 132 | IC.Builder->CreateLoad(CastOp, LI.isVolatile(), CI->getName()); | 
| Bob Wilson | 4b71b6c | 2010-01-30 00:41:10 +0000 | [diff] [blame] | 133 | NewLoad->setAlignment(LI.getAlignment()); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 134 | // Now cast the result of the load. | 
|  | 135 | return new BitCastInst(NewLoad, LI.getType()); | 
|  | 136 | } | 
|  | 137 | } | 
|  | 138 | } | 
|  | 139 | return 0; | 
|  | 140 | } | 
|  | 141 |  | 
|  | 142 | Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { | 
|  | 143 | Value *Op = LI.getOperand(0); | 
|  | 144 |  | 
|  | 145 | // Attempt to improve the alignment. | 
|  | 146 | if (TD) { | 
|  | 147 | unsigned KnownAlign = | 
| Chris Lattner | 6fcd32e | 2010-12-25 20:37:57 +0000 | [diff] [blame] | 148 | getOrEnforceKnownAlignment(Op, TD->getPrefTypeAlignment(LI.getType()),TD); | 
| Dan Gohman | 3619660 | 2010-08-03 18:20:32 +0000 | [diff] [blame] | 149 | unsigned LoadAlign = LI.getAlignment(); | 
|  | 150 | unsigned EffectiveLoadAlign = LoadAlign != 0 ? LoadAlign : | 
|  | 151 | TD->getABITypeAlignment(LI.getType()); | 
|  | 152 |  | 
|  | 153 | if (KnownAlign > EffectiveLoadAlign) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 154 | LI.setAlignment(KnownAlign); | 
| Dan Gohman | 3619660 | 2010-08-03 18:20:32 +0000 | [diff] [blame] | 155 | else if (LoadAlign == 0) | 
|  | 156 | LI.setAlignment(EffectiveLoadAlign); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 157 | } | 
|  | 158 |  | 
|  | 159 | // load (cast X) --> cast (load X) iff safe. | 
|  | 160 | if (isa<CastInst>(Op)) | 
|  | 161 | if (Instruction *Res = InstCombineLoadCast(*this, LI, TD)) | 
|  | 162 | return Res; | 
|  | 163 |  | 
|  | 164 | // None of the following transforms are legal for volatile loads. | 
|  | 165 | if (LI.isVolatile()) return 0; | 
|  | 166 |  | 
|  | 167 | // Do really simple store-to-load forwarding and load CSE, to catch cases | 
| Duncan Sands | 75b5d27 | 2011-02-15 09:23:02 +0000 | [diff] [blame] | 168 | // where there are several consecutive memory accesses to the same location, | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 169 | // separated by a few arithmetic operations. | 
|  | 170 | BasicBlock::iterator BBI = &LI; | 
|  | 171 | if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,6)) | 
|  | 172 | return ReplaceInstUsesWith(LI, AvailableVal); | 
|  | 173 |  | 
|  | 174 | // load(gep null, ...) -> unreachable | 
|  | 175 | if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) { | 
|  | 176 | const Value *GEPI0 = GEPI->getOperand(0); | 
|  | 177 | // TODO: Consider a target hook for valid address spaces for this xform. | 
|  | 178 | if (isa<ConstantPointerNull>(GEPI0) && GEPI->getPointerAddressSpace() == 0){ | 
|  | 179 | // Insert a new store to null instruction before the load to indicate | 
|  | 180 | // that this code is not reachable.  We do this instead of inserting | 
|  | 181 | // an unreachable instruction directly because we cannot modify the | 
|  | 182 | // CFG. | 
|  | 183 | new StoreInst(UndefValue::get(LI.getType()), | 
|  | 184 | Constant::getNullValue(Op->getType()), &LI); | 
|  | 185 | return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType())); | 
|  | 186 | } | 
|  | 187 | } | 
|  | 188 |  | 
|  | 189 | // load null/undef -> unreachable | 
|  | 190 | // TODO: Consider a target hook for valid address spaces for this xform. | 
|  | 191 | if (isa<UndefValue>(Op) || | 
|  | 192 | (isa<ConstantPointerNull>(Op) && LI.getPointerAddressSpace() == 0)) { | 
|  | 193 | // Insert a new store to null instruction before the load to indicate that | 
|  | 194 | // this code is not reachable.  We do this instead of inserting an | 
|  | 195 | // unreachable instruction directly because we cannot modify the CFG. | 
|  | 196 | new StoreInst(UndefValue::get(LI.getType()), | 
|  | 197 | Constant::getNullValue(Op->getType()), &LI); | 
|  | 198 | return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType())); | 
|  | 199 | } | 
|  | 200 |  | 
|  | 201 | // Instcombine load (constantexpr_cast global) -> cast (load global) | 
|  | 202 | if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Op)) | 
|  | 203 | if (CE->isCast()) | 
|  | 204 | if (Instruction *Res = InstCombineLoadCast(*this, LI, TD)) | 
|  | 205 | return Res; | 
|  | 206 |  | 
|  | 207 | if (Op->hasOneUse()) { | 
|  | 208 | // Change select and PHI nodes to select values instead of addresses: this | 
|  | 209 | // helps alias analysis out a lot, allows many others simplifications, and | 
|  | 210 | // exposes redundancy in the code. | 
|  | 211 | // | 
|  | 212 | // Note that we cannot do the transformation unless we know that the | 
|  | 213 | // introduced loads cannot trap!  Something like this is valid as long as | 
|  | 214 | // the condition is always false: load (select bool %C, int* null, int* %G), | 
|  | 215 | // but it would not be valid if we transformed it to load from null | 
|  | 216 | // unconditionally. | 
|  | 217 | // | 
|  | 218 | if (SelectInst *SI = dyn_cast<SelectInst>(Op)) { | 
|  | 219 | // load (select (Cond, &V1, &V2))  --> select(Cond, load &V1, load &V2). | 
| Bob Wilson | 56600a1 | 2010-01-30 04:42:39 +0000 | [diff] [blame] | 220 | unsigned Align = LI.getAlignment(); | 
|  | 221 | if (isSafeToLoadUnconditionally(SI->getOperand(1), SI, Align, TD) && | 
|  | 222 | isSafeToLoadUnconditionally(SI->getOperand(2), SI, Align, TD)) { | 
| Bob Wilson | 4b71b6c | 2010-01-30 00:41:10 +0000 | [diff] [blame] | 223 | LoadInst *V1 = Builder->CreateLoad(SI->getOperand(1), | 
| Bob Wilson | 56600a1 | 2010-01-30 04:42:39 +0000 | [diff] [blame] | 224 | SI->getOperand(1)->getName()+".val"); | 
| Bob Wilson | 4b71b6c | 2010-01-30 00:41:10 +0000 | [diff] [blame] | 225 | LoadInst *V2 = Builder->CreateLoad(SI->getOperand(2), | 
| Bob Wilson | 56600a1 | 2010-01-30 04:42:39 +0000 | [diff] [blame] | 226 | SI->getOperand(2)->getName()+".val"); | 
|  | 227 | V1->setAlignment(Align); | 
|  | 228 | V2->setAlignment(Align); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 229 | return SelectInst::Create(SI->getCondition(), V1, V2); | 
|  | 230 | } | 
|  | 231 |  | 
|  | 232 | // load (select (cond, null, P)) -> load P | 
|  | 233 | if (Constant *C = dyn_cast<Constant>(SI->getOperand(1))) | 
|  | 234 | if (C->isNullValue()) { | 
|  | 235 | LI.setOperand(0, SI->getOperand(2)); | 
|  | 236 | return &LI; | 
|  | 237 | } | 
|  | 238 |  | 
|  | 239 | // load (select (cond, P, null)) -> load P | 
|  | 240 | if (Constant *C = dyn_cast<Constant>(SI->getOperand(2))) | 
|  | 241 | if (C->isNullValue()) { | 
|  | 242 | LI.setOperand(0, SI->getOperand(1)); | 
|  | 243 | return &LI; | 
|  | 244 | } | 
|  | 245 | } | 
|  | 246 | } | 
|  | 247 | return 0; | 
|  | 248 | } | 
|  | 249 |  | 
|  | 250 | /// InstCombineStoreToCast - Fold store V, (cast P) -> store (cast V), P | 
|  | 251 | /// when possible.  This makes it generally easy to do alias analysis and/or | 
|  | 252 | /// SROA/mem2reg of the memory object. | 
|  | 253 | static Instruction *InstCombineStoreToCast(InstCombiner &IC, StoreInst &SI) { | 
|  | 254 | User *CI = cast<User>(SI.getOperand(1)); | 
|  | 255 | Value *CastOp = CI->getOperand(0); | 
|  | 256 |  | 
|  | 257 | const Type *DestPTy = cast<PointerType>(CI->getType())->getElementType(); | 
|  | 258 | const PointerType *SrcTy = dyn_cast<PointerType>(CastOp->getType()); | 
|  | 259 | if (SrcTy == 0) return 0; | 
|  | 260 |  | 
|  | 261 | const Type *SrcPTy = SrcTy->getElementType(); | 
|  | 262 |  | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 263 | if (!DestPTy->isIntegerTy() && !DestPTy->isPointerTy()) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 264 | return 0; | 
|  | 265 |  | 
|  | 266 | /// NewGEPIndices - If SrcPTy is an aggregate type, we can emit a "noop gep" | 
|  | 267 | /// to its first element.  This allows us to handle things like: | 
|  | 268 | ///   store i32 xxx, (bitcast {foo*, float}* %P to i32*) | 
|  | 269 | /// on 32-bit hosts. | 
|  | 270 | SmallVector<Value*, 4> NewGEPIndices; | 
|  | 271 |  | 
|  | 272 | // If the source is an array, the code below will not succeed.  Check to | 
|  | 273 | // see if a trivial 'gep P, 0, 0' will help matters.  Only do this for | 
|  | 274 | // constants. | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 275 | if (SrcPTy->isArrayTy() || SrcPTy->isStructTy()) { | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 276 | // Index through pointer. | 
|  | 277 | Constant *Zero = Constant::getNullValue(Type::getInt32Ty(SI.getContext())); | 
|  | 278 | NewGEPIndices.push_back(Zero); | 
|  | 279 |  | 
|  | 280 | while (1) { | 
|  | 281 | if (const StructType *STy = dyn_cast<StructType>(SrcPTy)) { | 
|  | 282 | if (!STy->getNumElements()) /* Struct can be empty {} */ | 
|  | 283 | break; | 
|  | 284 | NewGEPIndices.push_back(Zero); | 
|  | 285 | SrcPTy = STy->getElementType(0); | 
|  | 286 | } else if (const ArrayType *ATy = dyn_cast<ArrayType>(SrcPTy)) { | 
|  | 287 | NewGEPIndices.push_back(Zero); | 
|  | 288 | SrcPTy = ATy->getElementType(); | 
|  | 289 | } else { | 
|  | 290 | break; | 
|  | 291 | } | 
|  | 292 | } | 
|  | 293 |  | 
|  | 294 | SrcTy = PointerType::get(SrcPTy, SrcTy->getAddressSpace()); | 
|  | 295 | } | 
|  | 296 |  | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 297 | if (!SrcPTy->isIntegerTy() && !SrcPTy->isPointerTy()) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 298 | return 0; | 
|  | 299 |  | 
|  | 300 | // If the pointers point into different address spaces or if they point to | 
|  | 301 | // values with different sizes, we can't do the transformation. | 
|  | 302 | if (!IC.getTargetData() || | 
|  | 303 | SrcTy->getAddressSpace() != | 
|  | 304 | cast<PointerType>(CI->getType())->getAddressSpace() || | 
|  | 305 | IC.getTargetData()->getTypeSizeInBits(SrcPTy) != | 
|  | 306 | IC.getTargetData()->getTypeSizeInBits(DestPTy)) | 
|  | 307 | return 0; | 
|  | 308 |  | 
|  | 309 | // Okay, we are casting from one integer or pointer type to another of | 
|  | 310 | // the same size.  Instead of casting the pointer before | 
|  | 311 | // the store, cast the value to be stored. | 
|  | 312 | Value *NewCast; | 
|  | 313 | Value *SIOp0 = SI.getOperand(0); | 
|  | 314 | Instruction::CastOps opcode = Instruction::BitCast; | 
|  | 315 | const Type* CastSrcTy = SIOp0->getType(); | 
|  | 316 | const Type* CastDstTy = SrcPTy; | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 317 | if (CastDstTy->isPointerTy()) { | 
| Duncan Sands | 9dff9be | 2010-02-15 16:12:20 +0000 | [diff] [blame] | 318 | if (CastSrcTy->isIntegerTy()) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 319 | opcode = Instruction::IntToPtr; | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 320 | } else if (CastDstTy->isIntegerTy()) { | 
|  | 321 | if (SIOp0->getType()->isPointerTy()) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 322 | opcode = Instruction::PtrToInt; | 
|  | 323 | } | 
|  | 324 |  | 
|  | 325 | // SIOp0 is a pointer to aggregate and this is a store to the first field, | 
|  | 326 | // emit a GEP to index into its first field. | 
|  | 327 | if (!NewGEPIndices.empty()) | 
|  | 328 | CastOp = IC.Builder->CreateInBoundsGEP(CastOp, NewGEPIndices.begin(), | 
|  | 329 | NewGEPIndices.end()); | 
|  | 330 |  | 
|  | 331 | NewCast = IC.Builder->CreateCast(opcode, SIOp0, CastDstTy, | 
|  | 332 | SIOp0->getName()+".c"); | 
| Dan Gohman | 2e20dfb | 2010-10-25 16:16:27 +0000 | [diff] [blame] | 333 | SI.setOperand(0, NewCast); | 
|  | 334 | SI.setOperand(1, CastOp); | 
|  | 335 | return &SI; | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 336 | } | 
|  | 337 |  | 
|  | 338 | /// equivalentAddressValues - Test if A and B will obviously have the same | 
|  | 339 | /// value. This includes recognizing that %t0 and %t1 will have the same | 
|  | 340 | /// value in code like this: | 
|  | 341 | ///   %t0 = getelementptr \@a, 0, 3 | 
|  | 342 | ///   store i32 0, i32* %t0 | 
|  | 343 | ///   %t1 = getelementptr \@a, 0, 3 | 
|  | 344 | ///   %t2 = load i32* %t1 | 
|  | 345 | /// | 
|  | 346 | static bool equivalentAddressValues(Value *A, Value *B) { | 
|  | 347 | // Test if the values are trivially equivalent. | 
|  | 348 | if (A == B) return true; | 
|  | 349 |  | 
|  | 350 | // Test if the values come form identical arithmetic instructions. | 
|  | 351 | // This uses isIdenticalToWhenDefined instead of isIdenticalTo because | 
|  | 352 | // its only used to compare two uses within the same basic block, which | 
|  | 353 | // means that they'll always either have the same value or one of them | 
|  | 354 | // will have an undefined value. | 
|  | 355 | if (isa<BinaryOperator>(A) || | 
|  | 356 | isa<CastInst>(A) || | 
|  | 357 | isa<PHINode>(A) || | 
|  | 358 | isa<GetElementPtrInst>(A)) | 
|  | 359 | if (Instruction *BI = dyn_cast<Instruction>(B)) | 
|  | 360 | if (cast<Instruction>(A)->isIdenticalToWhenDefined(BI)) | 
|  | 361 | return true; | 
|  | 362 |  | 
|  | 363 | // Otherwise they may not be equivalent. | 
|  | 364 | return false; | 
|  | 365 | } | 
|  | 366 |  | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 367 | Instruction *InstCombiner::visitStoreInst(StoreInst &SI) { | 
|  | 368 | Value *Val = SI.getOperand(0); | 
|  | 369 | Value *Ptr = SI.getOperand(1); | 
|  | 370 |  | 
|  | 371 | // If the RHS is an alloca with a single use, zapify the store, making the | 
|  | 372 | // alloca dead. | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 373 | if (!SI.isVolatile()) { | 
|  | 374 | if (Ptr->hasOneUse()) { | 
|  | 375 | if (isa<AllocaInst>(Ptr)) | 
|  | 376 | return EraseInstFromFunction(SI); | 
|  | 377 | if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr)) { | 
|  | 378 | if (isa<AllocaInst>(GEP->getOperand(0))) { | 
|  | 379 | if (GEP->getOperand(0)->hasOneUse()) | 
|  | 380 | return EraseInstFromFunction(SI); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 381 | } | 
|  | 382 | } | 
|  | 383 | } | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 384 | } | 
|  | 385 |  | 
|  | 386 | // Attempt to improve the alignment. | 
|  | 387 | if (TD) { | 
|  | 388 | unsigned KnownAlign = | 
| Chris Lattner | 6fcd32e | 2010-12-25 20:37:57 +0000 | [diff] [blame] | 389 | getOrEnforceKnownAlignment(Ptr, TD->getPrefTypeAlignment(Val->getType()), | 
|  | 390 | TD); | 
| Dan Gohman | 3619660 | 2010-08-03 18:20:32 +0000 | [diff] [blame] | 391 | unsigned StoreAlign = SI.getAlignment(); | 
|  | 392 | unsigned EffectiveStoreAlign = StoreAlign != 0 ? StoreAlign : | 
|  | 393 | TD->getABITypeAlignment(Val->getType()); | 
|  | 394 |  | 
|  | 395 | if (KnownAlign > EffectiveStoreAlign) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 396 | SI.setAlignment(KnownAlign); | 
| Dan Gohman | 3619660 | 2010-08-03 18:20:32 +0000 | [diff] [blame] | 397 | else if (StoreAlign == 0) | 
|  | 398 | SI.setAlignment(EffectiveStoreAlign); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 399 | } | 
|  | 400 |  | 
|  | 401 | // Do really simple DSE, to catch cases where there are several consecutive | 
|  | 402 | // stores to the same location, separated by a few arithmetic operations. This | 
|  | 403 | // situation often occurs with bitfield accesses. | 
|  | 404 | BasicBlock::iterator BBI = &SI; | 
|  | 405 | for (unsigned ScanInsts = 6; BBI != SI.getParent()->begin() && ScanInsts; | 
|  | 406 | --ScanInsts) { | 
|  | 407 | --BBI; | 
| Victor Hernandez | 5f8c8c0 | 2010-01-22 19:05:05 +0000 | [diff] [blame] | 408 | // Don't count debug info directives, lest they affect codegen, | 
|  | 409 | // and we skip pointer-to-pointer bitcasts, which are NOPs. | 
|  | 410 | if (isa<DbgInfoIntrinsic>(BBI) || | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 411 | (isa<BitCastInst>(BBI) && BBI->getType()->isPointerTy())) { | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 412 | ScanInsts++; | 
|  | 413 | continue; | 
|  | 414 | } | 
|  | 415 |  | 
|  | 416 | if (StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) { | 
|  | 417 | // Prev store isn't volatile, and stores to the same location? | 
|  | 418 | if (!PrevSI->isVolatile() &&equivalentAddressValues(PrevSI->getOperand(1), | 
|  | 419 | SI.getOperand(1))) { | 
|  | 420 | ++NumDeadStore; | 
|  | 421 | ++BBI; | 
|  | 422 | EraseInstFromFunction(*PrevSI); | 
|  | 423 | continue; | 
|  | 424 | } | 
|  | 425 | break; | 
|  | 426 | } | 
|  | 427 |  | 
|  | 428 | // If this is a load, we have to stop.  However, if the loaded value is from | 
|  | 429 | // the pointer we're loading and is producing the pointer we're storing, | 
|  | 430 | // then *this* store is dead (X = load P; store X -> P). | 
|  | 431 | if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) { | 
| Jin-Gu Kang | b452db0 | 2011-03-14 01:21:00 +0000 | [diff] [blame] | 432 | if (LI == Val && equivalentAddressValues(LI->getOperand(0), Ptr) && | 
|  | 433 | !SI.isVolatile()) | 
|  | 434 | return EraseInstFromFunction(SI); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 435 |  | 
|  | 436 | // Otherwise, this is a load from some other location.  Stores before it | 
|  | 437 | // may not be dead. | 
|  | 438 | break; | 
|  | 439 | } | 
|  | 440 |  | 
|  | 441 | // Don't skip over loads or things that can modify memory. | 
|  | 442 | if (BBI->mayWriteToMemory() || BBI->mayReadFromMemory()) | 
|  | 443 | break; | 
|  | 444 | } | 
|  | 445 |  | 
|  | 446 |  | 
|  | 447 | if (SI.isVolatile()) return 0;  // Don't hack volatile stores. | 
|  | 448 |  | 
|  | 449 | // store X, null    -> turns into 'unreachable' in SimplifyCFG | 
|  | 450 | if (isa<ConstantPointerNull>(Ptr) && SI.getPointerAddressSpace() == 0) { | 
|  | 451 | if (!isa<UndefValue>(Val)) { | 
|  | 452 | SI.setOperand(0, UndefValue::get(Val->getType())); | 
|  | 453 | if (Instruction *U = dyn_cast<Instruction>(Val)) | 
|  | 454 | Worklist.Add(U);  // Dropped a use. | 
|  | 455 | } | 
|  | 456 | return 0;  // Do not modify these! | 
|  | 457 | } | 
|  | 458 |  | 
|  | 459 | // store undef, Ptr -> noop | 
|  | 460 | if (isa<UndefValue>(Val)) | 
|  | 461 | return EraseInstFromFunction(SI); | 
|  | 462 |  | 
|  | 463 | // If the pointer destination is a cast, see if we can fold the cast into the | 
|  | 464 | // source instead. | 
|  | 465 | if (isa<CastInst>(Ptr)) | 
|  | 466 | if (Instruction *Res = InstCombineStoreToCast(*this, SI)) | 
|  | 467 | return Res; | 
|  | 468 | if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr)) | 
|  | 469 | if (CE->isCast()) | 
|  | 470 | if (Instruction *Res = InstCombineStoreToCast(*this, SI)) | 
|  | 471 | return Res; | 
|  | 472 |  | 
|  | 473 |  | 
|  | 474 | // If this store is the last instruction in the basic block (possibly | 
| Victor Hernandez | 5f5abd5 | 2010-01-21 23:07:15 +0000 | [diff] [blame] | 475 | // excepting debug info instructions), and if the block ends with an | 
|  | 476 | // unconditional branch, try to move it to the successor block. | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 477 | BBI = &SI; | 
|  | 478 | do { | 
|  | 479 | ++BBI; | 
| Victor Hernandez | 5f8c8c0 | 2010-01-22 19:05:05 +0000 | [diff] [blame] | 480 | } while (isa<DbgInfoIntrinsic>(BBI) || | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 481 | (isa<BitCastInst>(BBI) && BBI->getType()->isPointerTy())); | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 482 | if (BranchInst *BI = dyn_cast<BranchInst>(BBI)) | 
|  | 483 | if (BI->isUnconditional()) | 
|  | 484 | if (SimplifyStoreAtEndOfBlock(SI)) | 
|  | 485 | return 0;  // xform done! | 
|  | 486 |  | 
|  | 487 | return 0; | 
|  | 488 | } | 
|  | 489 |  | 
|  | 490 | /// SimplifyStoreAtEndOfBlock - Turn things like: | 
|  | 491 | ///   if () { *P = v1; } else { *P = v2 } | 
|  | 492 | /// into a phi node with a store in the successor. | 
|  | 493 | /// | 
|  | 494 | /// Simplify things like: | 
|  | 495 | ///   *P = v1; if () { *P = v2; } | 
|  | 496 | /// into a phi node with a store in the successor. | 
|  | 497 | /// | 
|  | 498 | bool InstCombiner::SimplifyStoreAtEndOfBlock(StoreInst &SI) { | 
|  | 499 | BasicBlock *StoreBB = SI.getParent(); | 
|  | 500 |  | 
|  | 501 | // Check to see if the successor block has exactly two incoming edges.  If | 
|  | 502 | // so, see if the other predecessor contains a store to the same location. | 
|  | 503 | // if so, insert a PHI node (if needed) and move the stores down. | 
|  | 504 | BasicBlock *DestBB = StoreBB->getTerminator()->getSuccessor(0); | 
|  | 505 |  | 
|  | 506 | // Determine whether Dest has exactly two predecessors and, if so, compute | 
|  | 507 | // the other predecessor. | 
|  | 508 | pred_iterator PI = pred_begin(DestBB); | 
| Gabor Greif | 1b787df | 2010-07-12 15:48:26 +0000 | [diff] [blame] | 509 | BasicBlock *P = *PI; | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 510 | BasicBlock *OtherBB = 0; | 
| Gabor Greif | 1b787df | 2010-07-12 15:48:26 +0000 | [diff] [blame] | 511 |  | 
|  | 512 | if (P != StoreBB) | 
|  | 513 | OtherBB = P; | 
|  | 514 |  | 
|  | 515 | if (++PI == pred_end(DestBB)) | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 516 | return false; | 
|  | 517 |  | 
| Gabor Greif | 1b787df | 2010-07-12 15:48:26 +0000 | [diff] [blame] | 518 | P = *PI; | 
|  | 519 | if (P != StoreBB) { | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 520 | if (OtherBB) | 
|  | 521 | return false; | 
| Gabor Greif | 1b787df | 2010-07-12 15:48:26 +0000 | [diff] [blame] | 522 | OtherBB = P; | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 523 | } | 
|  | 524 | if (++PI != pred_end(DestBB)) | 
|  | 525 | return false; | 
|  | 526 |  | 
|  | 527 | // Bail out if all the relevant blocks aren't distinct (this can happen, | 
|  | 528 | // for example, if SI is in an infinite loop) | 
|  | 529 | if (StoreBB == DestBB || OtherBB == DestBB) | 
|  | 530 | return false; | 
|  | 531 |  | 
|  | 532 | // Verify that the other block ends in a branch and is not otherwise empty. | 
|  | 533 | BasicBlock::iterator BBI = OtherBB->getTerminator(); | 
|  | 534 | BranchInst *OtherBr = dyn_cast<BranchInst>(BBI); | 
|  | 535 | if (!OtherBr || BBI == OtherBB->begin()) | 
|  | 536 | return false; | 
|  | 537 |  | 
|  | 538 | // If the other block ends in an unconditional branch, check for the 'if then | 
|  | 539 | // else' case.  there is an instruction before the branch. | 
|  | 540 | StoreInst *OtherStore = 0; | 
|  | 541 | if (OtherBr->isUnconditional()) { | 
|  | 542 | --BBI; | 
|  | 543 | // Skip over debugging info. | 
| Victor Hernandez | 5f8c8c0 | 2010-01-22 19:05:05 +0000 | [diff] [blame] | 544 | while (isa<DbgInfoIntrinsic>(BBI) || | 
| Duncan Sands | 19d0b47 | 2010-02-16 11:11:14 +0000 | [diff] [blame] | 545 | (isa<BitCastInst>(BBI) && BBI->getType()->isPointerTy())) { | 
| Chris Lattner | a65e2f7 | 2010-01-05 05:57:49 +0000 | [diff] [blame] | 546 | if (BBI==OtherBB->begin()) | 
|  | 547 | return false; | 
|  | 548 | --BBI; | 
|  | 549 | } | 
|  | 550 | // If this isn't a store, isn't a store to the same location, or if the | 
|  | 551 | // alignments differ, bail out. | 
|  | 552 | OtherStore = dyn_cast<StoreInst>(BBI); | 
|  | 553 | if (!OtherStore || OtherStore->getOperand(1) != SI.getOperand(1) || | 
|  | 554 | OtherStore->getAlignment() != SI.getAlignment()) | 
|  | 555 | return false; | 
|  | 556 | } else { | 
|  | 557 | // Otherwise, the other block ended with a conditional branch. If one of the | 
|  | 558 | // destinations is StoreBB, then we have the if/then case. | 
|  | 559 | if (OtherBr->getSuccessor(0) != StoreBB && | 
|  | 560 | OtherBr->getSuccessor(1) != StoreBB) | 
|  | 561 | return false; | 
|  | 562 |  | 
|  | 563 | // Okay, we know that OtherBr now goes to Dest and StoreBB, so this is an | 
|  | 564 | // if/then triangle.  See if there is a store to the same ptr as SI that | 
|  | 565 | // lives in OtherBB. | 
|  | 566 | for (;; --BBI) { | 
|  | 567 | // Check to see if we find the matching store. | 
|  | 568 | if ((OtherStore = dyn_cast<StoreInst>(BBI))) { | 
|  | 569 | if (OtherStore->getOperand(1) != SI.getOperand(1) || | 
|  | 570 | OtherStore->getAlignment() != SI.getAlignment()) | 
|  | 571 | return false; | 
|  | 572 | break; | 
|  | 573 | } | 
|  | 574 | // If we find something that may be using or overwriting the stored | 
|  | 575 | // value, or if we run out of instructions, we can't do the xform. | 
|  | 576 | if (BBI->mayReadFromMemory() || BBI->mayWriteToMemory() || | 
|  | 577 | BBI == OtherBB->begin()) | 
|  | 578 | return false; | 
|  | 579 | } | 
|  | 580 |  | 
|  | 581 | // In order to eliminate the store in OtherBr, we have to | 
|  | 582 | // make sure nothing reads or overwrites the stored value in | 
|  | 583 | // StoreBB. | 
|  | 584 | for (BasicBlock::iterator I = StoreBB->begin(); &*I != &SI; ++I) { | 
|  | 585 | // FIXME: This should really be AA driven. | 
|  | 586 | if (I->mayReadFromMemory() || I->mayWriteToMemory()) | 
|  | 587 | return false; | 
|  | 588 | } | 
|  | 589 | } | 
|  | 590 |  | 
|  | 591 | // Insert a PHI node now if we need it. | 
|  | 592 | Value *MergedVal = OtherStore->getOperand(0); | 
|  | 593 | if (MergedVal != SI.getOperand(0)) { | 
|  | 594 | PHINode *PN = PHINode::Create(MergedVal->getType(), "storemerge"); | 
|  | 595 | PN->reserveOperandSpace(2); | 
|  | 596 | PN->addIncoming(SI.getOperand(0), SI.getParent()); | 
|  | 597 | PN->addIncoming(OtherStore->getOperand(0), OtherBB); | 
|  | 598 | MergedVal = InsertNewInstBefore(PN, DestBB->front()); | 
|  | 599 | } | 
|  | 600 |  | 
|  | 601 | // Advance to a place where it is safe to insert the new store and | 
|  | 602 | // insert it. | 
|  | 603 | BBI = DestBB->getFirstNonPHI(); | 
|  | 604 | InsertNewInstBefore(new StoreInst(MergedVal, SI.getOperand(1), | 
|  | 605 | OtherStore->isVolatile(), | 
|  | 606 | SI.getAlignment()), *BBI); | 
|  | 607 |  | 
|  | 608 | // Nuke the old stores. | 
|  | 609 | EraseInstFromFunction(SI); | 
|  | 610 | EraseInstFromFunction(*OtherStore); | 
|  | 611 | return true; | 
|  | 612 | } |