1 //===- SROA.cpp - Scalar Replacement Of Aggregates ------------------------===// 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 /// \file 10 /// This transformation implements the well known scalar replacement of 11 /// aggregates transformation. It tries to identify promotable elements of an 12 /// aggregate alloca, and promote them to registers. It will also try to 13 /// convert uses of an element (or set of elements) of an alloca into a vector 14 /// or bitfield-style integer scalar if appropriate. 15 /// 16 /// It works to do this with minimal slicing of the alloca so that regions 17 /// which are merely transferred in and out of external memory remain unchanged 18 /// and are not decomposed to scalar code. 19 /// 20 /// Because this also performs alloca promotion, it can be thought of as also 21 /// serving the purpose of SSA formation. The algorithm iterates on the 22 /// function until all opportunities for promotion have been realized. 23 /// 24 //===----------------------------------------------------------------------===// 25 26 #define DEBUG_TYPE "sroa" 27 #include "llvm/Transforms/Scalar.h" 28 #include "llvm/Constants.h" 29 #include "llvm/DIBuilder.h" 30 #include "llvm/DebugInfo.h" 31 #include "llvm/DerivedTypes.h" 32 #include "llvm/Function.h" 33 #include "llvm/IRBuilder.h" 34 #include "llvm/Instructions.h" 35 #include "llvm/IntrinsicInst.h" 36 #include "llvm/LLVMContext.h" 37 #include "llvm/Module.h" 38 #include "llvm/Operator.h" 39 #include "llvm/Pass.h" 40 #include "llvm/ADT/SetVector.h" 41 #include "llvm/ADT/SmallVector.h" 42 #include "llvm/ADT/Statistic.h" 43 #include "llvm/ADT/STLExtras.h" 44 #include "llvm/Analysis/Dominators.h" 45 #include "llvm/Analysis/Loads.h" 46 #include "llvm/Analysis/ValueTracking.h" 47 #include "llvm/Support/CommandLine.h" 48 #include "llvm/Support/Debug.h" 49 #include "llvm/Support/ErrorHandling.h" 50 #include "llvm/Support/GetElementPtrTypeIterator.h" 51 #include "llvm/Support/InstVisitor.h" 52 #include "llvm/Support/MathExtras.h" 53 #include "llvm/Support/raw_ostream.h" 54 #include "llvm/Target/TargetData.h" 55 #include "llvm/Transforms/Utils/Local.h" 56 #include "llvm/Transforms/Utils/PromoteMemToReg.h" 57 #include "llvm/Transforms/Utils/SSAUpdater.h" 58 using namespace llvm; 59 60 STATISTIC(NumAllocasAnalyzed, "Number of allocas analyzed for replacement"); 61 STATISTIC(NumNewAllocas, "Number of new, smaller allocas introduced"); 62 STATISTIC(NumPromoted, "Number of allocas promoted to SSA values"); 63 STATISTIC(NumLoadsSpeculated, "Number of loads speculated to allow promotion"); 64 STATISTIC(NumDeleted, "Number of instructions deleted"); 65 STATISTIC(NumVectorized, "Number of vectorized aggregates"); 66 67 /// Hidden option to force the pass to not use DomTree and mem2reg, instead 68 /// forming SSA values through the SSAUpdater infrastructure. 69 static cl::opt<bool> 70 ForceSSAUpdater("force-ssa-updater", cl::init(false), cl::Hidden); 71 72 namespace { 73 /// \brief Alloca partitioning representation. 74 /// 75 /// This class represents a partitioning of an alloca into slices, and 76 /// information about the nature of uses of each slice of the alloca. The goal 77 /// is that this information is sufficient to decide if and how to split the 78 /// alloca apart and replace slices with scalars. It is also intended that this 79 /// structure can capture the relevant information needed both to decide about 80 /// and to enact these transformations. 81 class AllocaPartitioning { 82 public: 83 /// \brief A common base class for representing a half-open byte range. 84 struct ByteRange { 85 /// \brief The beginning offset of the range. 86 uint64_t BeginOffset; 87 88 /// \brief The ending offset, not included in the range. 89 uint64_t EndOffset; 90 91 ByteRange() : BeginOffset(), EndOffset() {} 92 ByteRange(uint64_t BeginOffset, uint64_t EndOffset) 93 : BeginOffset(BeginOffset), EndOffset(EndOffset) {} 94 95 /// \brief Support for ordering ranges. 96 /// 97 /// This provides an ordering over ranges such that start offsets are 98 /// always increasing, and within equal start offsets, the end offsets are 99 /// decreasing. Thus the spanning range comes first in a cluster with the 100 /// same start position. 101 bool operator<(const ByteRange &RHS) const { 102 if (BeginOffset < RHS.BeginOffset) return true; 103 if (BeginOffset > RHS.BeginOffset) return false; 104 if (EndOffset > RHS.EndOffset) return true; 105 return false; 106 } 107 108 /// \brief Support comparison with a single offset to allow binary searches. 109 friend bool operator<(const ByteRange &LHS, uint64_t RHSOffset) { 110 return LHS.BeginOffset < RHSOffset; 111 } 112 113 friend LLVM_ATTRIBUTE_UNUSED bool operator<(uint64_t LHSOffset, 114 const ByteRange &RHS) { 115 return LHSOffset < RHS.BeginOffset; 116 } 117 118 bool operator==(const ByteRange &RHS) const { 119 return BeginOffset == RHS.BeginOffset && EndOffset == RHS.EndOffset; 120 } 121 bool operator!=(const ByteRange &RHS) const { return !operator==(RHS); } 122 }; 123 124 /// \brief A partition of an alloca. 125 /// 126 /// This structure represents a contiguous partition of the alloca. These are 127 /// formed by examining the uses of the alloca. During formation, they may 128 /// overlap but once an AllocaPartitioning is built, the Partitions within it 129 /// are all disjoint. 130 struct Partition : public ByteRange { 131 /// \brief Whether this partition is splittable into smaller partitions. 132 /// 133 /// We flag partitions as splittable when they are formed entirely due to 134 /// accesses by trivially splittable operations such as memset and memcpy. 135 /// 136 /// FIXME: At some point we should consider loads and stores of FCAs to be 137 /// splittable and eagerly split them into scalar values. 138 bool IsSplittable; 139 140 Partition() : ByteRange(), IsSplittable() {} 141 Partition(uint64_t BeginOffset, uint64_t EndOffset, bool IsSplittable) 142 : ByteRange(BeginOffset, EndOffset), IsSplittable(IsSplittable) {} 143 }; 144 145 /// \brief A particular use of a partition of the alloca. 146 /// 147 /// This structure is used to associate uses of a partition with it. They 148 /// mark the range of bytes which are referenced by a particular instruction, 149 /// and includes a handle to the user itself and the pointer value in use. 150 /// The bounds of these uses are determined by intersecting the bounds of the 151 /// memory use itself with a particular partition. As a consequence there is 152 /// intentionally overlap between various uses of the same partition. 153 struct PartitionUse : public ByteRange { 154 /// \brief The use in question. Provides access to both user and used value. 155 /// 156 /// Note that this may be null if the partition use is *dead*, that is, it 157 /// should be ignored. 158 Use *U; 159 160 PartitionUse() : ByteRange(), U() {} 161 PartitionUse(uint64_t BeginOffset, uint64_t EndOffset, Use *U) 162 : ByteRange(BeginOffset, EndOffset), U(U) {} 163 }; 164 165 /// \brief Construct a partitioning of a particular alloca. 166 /// 167 /// Construction does most of the work for partitioning the alloca. This 168 /// performs the necessary walks of users and builds a partitioning from it. 169 AllocaPartitioning(const TargetData &TD, AllocaInst &AI); 170 171 /// \brief Test whether a pointer to the allocation escapes our analysis. 172 /// 173 /// If this is true, the partitioning is never fully built and should be 174 /// ignored. 175 bool isEscaped() const { return PointerEscapingInstr; } 176 177 /// \brief Support for iterating over the partitions. 178 /// @{ 179 typedef SmallVectorImpl<Partition>::iterator iterator; 180 iterator begin() { return Partitions.begin(); } 181 iterator end() { return Partitions.end(); } 182 183 typedef SmallVectorImpl<Partition>::const_iterator const_iterator; 184 const_iterator begin() const { return Partitions.begin(); } 185 const_iterator end() const { return Partitions.end(); } 186 /// @} 187 188 /// \brief Support for iterating over and manipulating a particular 189 /// partition's uses. 190 /// 191 /// The iteration support provided for uses is more limited, but also 192 /// includes some manipulation routines to support rewriting the uses of 193 /// partitions during SROA. 194 /// @{ 195 typedef SmallVectorImpl<PartitionUse>::iterator use_iterator; 196 use_iterator use_begin(unsigned Idx) { return Uses[Idx].begin(); } 197 use_iterator use_begin(const_iterator I) { return Uses[I - begin()].begin(); } 198 use_iterator use_end(unsigned Idx) { return Uses[Idx].end(); } 199 use_iterator use_end(const_iterator I) { return Uses[I - begin()].end(); } 200 201 typedef SmallVectorImpl<PartitionUse>::const_iterator const_use_iterator; 202 const_use_iterator use_begin(unsigned Idx) const { return Uses[Idx].begin(); } 203 const_use_iterator use_begin(const_iterator I) const { 204 return Uses[I - begin()].begin(); 205 } 206 const_use_iterator use_end(unsigned Idx) const { return Uses[Idx].end(); } 207 const_use_iterator use_end(const_iterator I) const { 208 return Uses[I - begin()].end(); 209 } 210 211 unsigned use_size(unsigned Idx) const { return Uses[Idx].size(); } 212 unsigned use_size(const_iterator I) const { return Uses[I - begin()].size(); } 213 const PartitionUse &getUse(unsigned PIdx, unsigned UIdx) const { 214 return Uses[PIdx][UIdx]; 215 } 216 const PartitionUse &getUse(const_iterator I, unsigned UIdx) const { 217 return Uses[I - begin()][UIdx]; 218 } 219 220 void use_push_back(unsigned Idx, const PartitionUse &PU) { 221 Uses[Idx].push_back(PU); 222 } 223 void use_push_back(const_iterator I, const PartitionUse &PU) { 224 Uses[I - begin()].push_back(PU); 225 } 226 /// @} 227 228 /// \brief Allow iterating the dead users for this alloca. 229 /// 230 /// These are instructions which will never actually use the alloca as they 231 /// are outside the allocated range. They are safe to replace with undef and 232 /// delete. 233 /// @{ 234 typedef SmallVectorImpl<Instruction *>::const_iterator dead_user_iterator; 235 dead_user_iterator dead_user_begin() const { return DeadUsers.begin(); } 236 dead_user_iterator dead_user_end() const { return DeadUsers.end(); } 237 /// @} 238 239 /// \brief Allow iterating the dead expressions referring to this alloca. 240 /// 241 /// These are operands which have cannot actually be used to refer to the 242 /// alloca as they are outside its range and the user doesn't correct for 243 /// that. These mostly consist of PHI node inputs and the like which we just 244 /// need to replace with undef. 245 /// @{ 246 typedef SmallVectorImpl<Use *>::const_iterator dead_op_iterator; 247 dead_op_iterator dead_op_begin() const { return DeadOperands.begin(); } 248 dead_op_iterator dead_op_end() const { return DeadOperands.end(); } 249 /// @} 250 251 /// \brief MemTransferInst auxiliary data. 252 /// This struct provides some auxiliary data about memory transfer 253 /// intrinsics such as memcpy and memmove. These intrinsics can use two 254 /// different ranges within the same alloca, and provide other challenges to 255 /// correctly represent. We stash extra data to help us untangle this 256 /// after the partitioning is complete. 257 struct MemTransferOffsets { 258 uint64_t DestBegin, DestEnd; 259 uint64_t SourceBegin, SourceEnd; 260 bool IsSplittable; 261 }; 262 MemTransferOffsets getMemTransferOffsets(MemTransferInst &II) const { 263 return MemTransferInstData.lookup(&II); 264 } 265 266 /// \brief Map from a PHI or select operand back to a partition. 267 /// 268 /// When manipulating PHI nodes or selects, they can use more than one 269 /// partition of an alloca. We store a special mapping to allow finding the 270 /// partition referenced by each of these operands, if any. 271 iterator findPartitionForPHIOrSelectOperand(Use *U) { 272 SmallDenseMap<Use *, std::pair<unsigned, unsigned> >::const_iterator MapIt 273 = PHIOrSelectOpMap.find(U); 274 if (MapIt == PHIOrSelectOpMap.end()) 275 return end(); 276 277 return begin() + MapIt->second.first; 278 } 279 280 /// \brief Map from a PHI or select operand back to the specific use of 281 /// a partition. 282 /// 283 /// Similar to mapping these operands back to the partitions, this maps 284 /// directly to the use structure of that partition. 285 use_iterator findPartitionUseForPHIOrSelectOperand(Use *U) { 286 SmallDenseMap<Use *, std::pair<unsigned, unsigned> >::const_iterator MapIt 287 = PHIOrSelectOpMap.find(U); 288 assert(MapIt != PHIOrSelectOpMap.end()); 289 return Uses[MapIt->second.first].begin() + MapIt->second.second; 290 } 291 292 /// \brief Compute a common type among the uses of a particular partition. 293 /// 294 /// This routines walks all of the uses of a particular partition and tries 295 /// to find a common type between them. Untyped operations such as memset and 296 /// memcpy are ignored. 297 Type *getCommonType(iterator I) const; 298 299 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 300 void print(raw_ostream &OS, const_iterator I, StringRef Indent = " ") const; 301 void printUsers(raw_ostream &OS, const_iterator I, 302 StringRef Indent = " ") const; 303 void print(raw_ostream &OS) const; 304 void LLVM_ATTRIBUTE_NOINLINE LLVM_ATTRIBUTE_USED dump(const_iterator I) const; 305 void LLVM_ATTRIBUTE_NOINLINE LLVM_ATTRIBUTE_USED dump() const; 306 #endif 307 308 private: 309 template <typename DerivedT, typename RetT = void> class BuilderBase; 310 class PartitionBuilder; 311 friend class AllocaPartitioning::PartitionBuilder; 312 class UseBuilder; 313 friend class AllocaPartitioning::UseBuilder; 314 315 #ifndef NDEBUG 316 /// \brief Handle to alloca instruction to simplify method interfaces. 317 AllocaInst &AI; 318 #endif 319 320 /// \brief The instruction responsible for this alloca having no partitioning. 321 /// 322 /// When an instruction (potentially) escapes the pointer to the alloca, we 323 /// store a pointer to that here and abort trying to partition the alloca. 324 /// This will be null if the alloca is partitioned successfully. 325 Instruction *PointerEscapingInstr; 326 327 /// \brief The partitions of the alloca. 328 /// 329 /// We store a vector of the partitions over the alloca here. This vector is 330 /// sorted by increasing begin offset, and then by decreasing end offset. See 331 /// the Partition inner class for more details. Initially (during 332 /// construction) there are overlaps, but we form a disjoint sequence of 333 /// partitions while finishing construction and a fully constructed object is 334 /// expected to always have this as a disjoint space. 335 SmallVector<Partition, 8> Partitions; 336 337 /// \brief The uses of the partitions. 338 /// 339 /// This is essentially a mapping from each partition to a list of uses of 340 /// that partition. The mapping is done with a Uses vector that has the exact 341 /// same number of entries as the partition vector. Each entry is itself 342 /// a vector of the uses. 343 SmallVector<SmallVector<PartitionUse, 2>, 8> Uses; 344 345 /// \brief Instructions which will become dead if we rewrite the alloca. 346 /// 347 /// Note that these are not separated by partition. This is because we expect 348 /// a partitioned alloca to be completely rewritten or not rewritten at all. 349 /// If rewritten, all these instructions can simply be removed and replaced 350 /// with undef as they come from outside of the allocated space. 351 SmallVector<Instruction *, 8> DeadUsers; 352 353 /// \brief Operands which will become dead if we rewrite the alloca. 354 /// 355 /// These are operands that in their particular use can be replaced with 356 /// undef when we rewrite the alloca. These show up in out-of-bounds inputs 357 /// to PHI nodes and the like. They aren't entirely dead (there might be 358 /// a GEP back into the bounds using it elsewhere) and nor is the PHI, but we 359 /// want to swap this particular input for undef to simplify the use lists of 360 /// the alloca. 361 SmallVector<Use *, 8> DeadOperands; 362 363 /// \brief The underlying storage for auxiliary memcpy and memset info. 364 SmallDenseMap<MemTransferInst *, MemTransferOffsets, 4> MemTransferInstData; 365 366 /// \brief A side datastructure used when building up the partitions and uses. 367 /// 368 /// This mapping is only really used during the initial building of the 369 /// partitioning so that we can retain information about PHI and select nodes 370 /// processed. 371 SmallDenseMap<Instruction *, std::pair<uint64_t, bool> > PHIOrSelectSizes; 372 373 /// \brief Auxiliary information for particular PHI or select operands. 374 SmallDenseMap<Use *, std::pair<unsigned, unsigned>, 4> PHIOrSelectOpMap; 375 376 /// \brief A utility routine called from the constructor. 377 /// 378 /// This does what it says on the tin. It is the key of the alloca partition 379 /// splitting and merging. After it is called we have the desired disjoint 380 /// collection of partitions. 381 void splitAndMergePartitions(); 382 }; 383 } 384 385 template <typename DerivedT, typename RetT> 386 class AllocaPartitioning::BuilderBase 387 : public InstVisitor<DerivedT, RetT> { 388 public: 389 BuilderBase(const TargetData &TD, AllocaInst &AI, AllocaPartitioning &P) 390 : TD(TD), 391 AllocSize(TD.getTypeAllocSize(AI.getAllocatedType())), 392 P(P) { 393 enqueueUsers(AI, 0); 394 } 395 396 protected: 397 const TargetData &TD; 398 const uint64_t AllocSize; 399 AllocaPartitioning &P; 400 401 SmallPtrSet<Use *, 8> VisitedUses; 402 403 struct OffsetUse { 404 Use *U; 405 int64_t Offset; 406 }; 407 SmallVector<OffsetUse, 8> Queue; 408 409 // The active offset and use while visiting. 410 Use *U; 411 int64_t Offset; 412 413 void enqueueUsers(Instruction &I, int64_t UserOffset) { 414 for (Value::use_iterator UI = I.use_begin(), UE = I.use_end(); 415 UI != UE; ++UI) { 416 if (VisitedUses.insert(&UI.getUse())) { 417 OffsetUse OU = { &UI.getUse(), UserOffset }; 418 Queue.push_back(OU); 419 } 420 } 421 } 422 423 bool computeConstantGEPOffset(GetElementPtrInst &GEPI, int64_t &GEPOffset) { 424 GEPOffset = Offset; 425 for (gep_type_iterator GTI = gep_type_begin(GEPI), GTE = gep_type_end(GEPI); 426 GTI != GTE; ++GTI) { 427 ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand()); 428 if (!OpC) 429 return false; 430 if (OpC->isZero()) 431 continue; 432 433 // Handle a struct index, which adds its field offset to the pointer. 434 if (StructType *STy = dyn_cast<StructType>(*GTI)) { 435 unsigned ElementIdx = OpC->getZExtValue(); 436 const StructLayout *SL = TD.getStructLayout(STy); 437 uint64_t ElementOffset = SL->getElementOffset(ElementIdx); 438 // Check that we can continue to model this GEP in a signed 64-bit offset. 439 if (ElementOffset > INT64_MAX || 440 (GEPOffset >= 0 && 441 ((uint64_t)GEPOffset + ElementOffset) > INT64_MAX)) { 442 DEBUG(dbgs() << "WARNING: Encountered a cumulative offset exceeding " 443 << "what can be represented in an int64_t!\n" 444 << " alloca: " << P.AI << "\n"); 445 return false; 446 } 447 if (GEPOffset < 0) 448 GEPOffset = ElementOffset + (uint64_t)-GEPOffset; 449 else 450 GEPOffset += ElementOffset; 451 continue; 452 } 453 454 APInt Index = OpC->getValue().sextOrTrunc(TD.getPointerSizeInBits()); 455 Index *= APInt(Index.getBitWidth(), 456 TD.getTypeAllocSize(GTI.getIndexedType())); 457 Index += APInt(Index.getBitWidth(), (uint64_t)GEPOffset, 458 /*isSigned*/true); 459 // Check if the result can be stored in our int64_t offset. 460 if (!Index.isSignedIntN(sizeof(GEPOffset) * 8)) { 461 DEBUG(dbgs() << "WARNING: Encountered a cumulative offset exceeding " 462 << "what can be represented in an int64_t!\n" 463 << " alloca: " << P.AI << "\n"); 464 return false; 465 } 466 467 GEPOffset = Index.getSExtValue(); 468 } 469 return true; 470 } 471 472 Value *foldSelectInst(SelectInst &SI) { 473 // If the condition being selected on is a constant or the same value is 474 // being selected between, fold the select. Yes this does (rarely) happen 475 // early on. 476 if (ConstantInt *CI = dyn_cast<ConstantInt>(SI.getCondition())) 477 return SI.getOperand(1+CI->isZero()); 478 if (SI.getOperand(1) == SI.getOperand(2)) { 479 assert(*U == SI.getOperand(1)); 480 return SI.getOperand(1); 481 } 482 return 0; 483 } 484 }; 485 486 /// \brief Builder for the alloca partitioning. 487 /// 488 /// This class builds an alloca partitioning by recursively visiting the uses 489 /// of an alloca and splitting the partitions for each load and store at each 490 /// offset. 491 class AllocaPartitioning::PartitionBuilder 492 : public BuilderBase<PartitionBuilder, bool> { 493 friend class InstVisitor<PartitionBuilder, bool>; 494 495 SmallDenseMap<Instruction *, unsigned> MemTransferPartitionMap; 496 497 public: 498 PartitionBuilder(const TargetData &TD, AllocaInst &AI, AllocaPartitioning &P) 499 : BuilderBase<PartitionBuilder, bool>(TD, AI, P) {} 500 501 /// \brief Run the builder over the allocation. 502 bool operator()() { 503 // Note that we have to re-evaluate size on each trip through the loop as 504 // the queue grows at the tail. 505 for (unsigned Idx = 0; Idx < Queue.size(); ++Idx) { 506 U = Queue[Idx].U; 507 Offset = Queue[Idx].Offset; 508 if (!visit(cast<Instruction>(U->getUser()))) 509 return false; 510 } 511 return true; 512 } 513 514 private: 515 bool markAsEscaping(Instruction &I) { 516 P.PointerEscapingInstr = &I; 517 return false; 518 } 519 520 void insertUse(Instruction &I, int64_t Offset, uint64_t Size, 521 bool IsSplittable = false) { 522 // Completely skip uses which have a zero size or don't overlap the 523 // allocation. 524 if (Size == 0 || 525 (Offset >= 0 && (uint64_t)Offset >= AllocSize) || 526 (Offset < 0 && (uint64_t)-Offset >= Size)) { 527 DEBUG(dbgs() << "WARNING: Ignoring " << Size << " byte use @" << Offset 528 << " which starts past the end of the " << AllocSize 529 << " byte alloca:\n" 530 << " alloca: " << P.AI << "\n" 531 << " use: " << I << "\n"); 532 return; 533 } 534 535 // Clamp the start to the beginning of the allocation. 536 if (Offset < 0) { 537 DEBUG(dbgs() << "WARNING: Clamping a " << Size << " byte use @" << Offset 538 << " to start at the beginning of the alloca:\n" 539 << " alloca: " << P.AI << "\n" 540 << " use: " << I << "\n"); 541 Size -= (uint64_t)-Offset; 542 Offset = 0; 543 } 544 545 uint64_t BeginOffset = Offset, EndOffset = BeginOffset + Size; 546 547 // Clamp the end offset to the end of the allocation. Note that this is 548 // formulated to handle even the case where "BeginOffset + Size" overflows. 549 assert(AllocSize >= BeginOffset); // Established above. 550 if (Size > AllocSize - BeginOffset) { 551 DEBUG(dbgs() << "WARNING: Clamping a " << Size << " byte use @" << Offset 552 << " to remain within the " << AllocSize << " byte alloca:\n" 553 << " alloca: " << P.AI << "\n" 554 << " use: " << I << "\n"); 555 EndOffset = AllocSize; 556 } 557 558 // See if we can just add a user onto the last slot currently occupied. 559 if (!P.Partitions.empty() && 560 P.Partitions.back().BeginOffset == BeginOffset && 561 P.Partitions.back().EndOffset == EndOffset) { 562 P.Partitions.back().IsSplittable &= IsSplittable; 563 return; 564 } 565 566 Partition New(BeginOffset, EndOffset, IsSplittable); 567 P.Partitions.push_back(New); 568 } 569 570 bool handleLoadOrStore(Type *Ty, Instruction &I, int64_t Offset) { 571 uint64_t Size = TD.getTypeStoreSize(Ty); 572 573 // If this memory access can be shown to *statically* extend outside the 574 // bounds of of the allocation, it's behavior is undefined, so simply 575 // ignore it. Note that this is more strict than the generic clamping 576 // behavior of insertUse. We also try to handle cases which might run the 577 // risk of overflow. 578 // FIXME: We should instead consider the pointer to have escaped if this 579 // function is being instrumented for addressing bugs or race conditions. 580 if (Offset < 0 || (uint64_t)Offset >= AllocSize || 581 Size > (AllocSize - (uint64_t)Offset)) { 582 DEBUG(dbgs() << "WARNING: Ignoring " << Size << " byte " 583 << (isa<LoadInst>(I) ? "load" : "store") << " @" << Offset 584 << " which extends past the end of the " << AllocSize 585 << " byte alloca:\n" 586 << " alloca: " << P.AI << "\n" 587 << " use: " << I << "\n"); 588 return true; 589 } 590 591 insertUse(I, Offset, Size); 592 return true; 593 } 594 595 bool visitBitCastInst(BitCastInst &BC) { 596 enqueueUsers(BC, Offset); 597 return true; 598 } 599 600 bool visitGetElementPtrInst(GetElementPtrInst &GEPI) { 601 int64_t GEPOffset; 602 if (!computeConstantGEPOffset(GEPI, GEPOffset)) 603 return markAsEscaping(GEPI); 604 605 enqueueUsers(GEPI, GEPOffset); 606 return true; 607 } 608 609 bool visitLoadInst(LoadInst &LI) { 610 assert((!LI.isSimple() || LI.getType()->isSingleValueType()) && 611 "All simple FCA loads should have been pre-split"); 612 return handleLoadOrStore(LI.getType(), LI, Offset); 613 } 614 615 bool visitStoreInst(StoreInst &SI) { 616 Value *ValOp = SI.getValueOperand(); 617 if (ValOp == *U) 618 return markAsEscaping(SI); 619 620 assert((!SI.isSimple() || ValOp->getType()->isSingleValueType()) && 621 "All simple FCA stores should have been pre-split"); 622 return handleLoadOrStore(ValOp->getType(), SI, Offset); 623 } 624 625 626 bool visitMemSetInst(MemSetInst &II) { 627 assert(II.getRawDest() == *U && "Pointer use is not the destination?"); 628 ConstantInt *Length = dyn_cast<ConstantInt>(II.getLength()); 629 uint64_t Size = Length ? Length->getZExtValue() : AllocSize - Offset; 630 insertUse(II, Offset, Size, Length); 631 return true; 632 } 633 634 bool visitMemTransferInst(MemTransferInst &II) { 635 ConstantInt *Length = dyn_cast<ConstantInt>(II.getLength()); 636 uint64_t Size = Length ? Length->getZExtValue() : AllocSize - Offset; 637 if (!Size) 638 // Zero-length mem transfer intrinsics can be ignored entirely. 639 return true; 640 641 MemTransferOffsets &Offsets = P.MemTransferInstData[&II]; 642 643 // Only intrinsics with a constant length can be split. 644 Offsets.IsSplittable = Length; 645 646 if (*U != II.getRawDest()) { 647 assert(*U == II.getRawSource()); 648 Offsets.SourceBegin = Offset; 649 Offsets.SourceEnd = Offset + Size; 650 } else { 651 Offsets.DestBegin = Offset; 652 Offsets.DestEnd = Offset + Size; 653 } 654 655 insertUse(II, Offset, Size, Offsets.IsSplittable); 656 unsigned NewIdx = P.Partitions.size() - 1; 657 658 SmallDenseMap<Instruction *, unsigned>::const_iterator PMI; 659 bool Inserted = false; 660 llvm::tie(PMI, Inserted) 661 = MemTransferPartitionMap.insert(std::make_pair(&II, NewIdx)); 662 if (Offsets.IsSplittable && 663 (!Inserted || II.getRawSource() == II.getRawDest())) { 664 // We've found a memory transfer intrinsic which refers to the alloca as 665 // both a source and dest. This is detected either by direct equality of 666 // the operand values, or when we visit the intrinsic twice due to two 667 // different chains of values leading to it. We refuse to split these to 668 // simplify splitting logic. If possible, SROA will still split them into 669 // separate allocas and then re-analyze. 670 Offsets.IsSplittable = false; 671 P.Partitions[PMI->second].IsSplittable = false; 672 P.Partitions[NewIdx].IsSplittable = false; 673 } 674 675 return true; 676 } 677 678 // Disable SRoA for any intrinsics except for lifetime invariants. 679 // FIXME: What about debug instrinsics? This matches old behavior, but 680 // doesn't make sense. 681 bool visitIntrinsicInst(IntrinsicInst &II) { 682 if (II.getIntrinsicID() == Intrinsic::lifetime_start || 683 II.getIntrinsicID() == Intrinsic::lifetime_end) { 684 ConstantInt *Length = cast<ConstantInt>(II.getArgOperand(0)); 685 uint64_t Size = std::min(AllocSize - Offset, Length->getLimitedValue()); 686 insertUse(II, Offset, Size, true); 687 return true; 688 } 689 690 return markAsEscaping(II); 691 } 692 693 Instruction *hasUnsafePHIOrSelectUse(Instruction *Root, uint64_t &Size) { 694 // We consider any PHI or select that results in a direct load or store of 695 // the same offset to be a viable use for partitioning purposes. These uses 696 // are considered unsplittable and the size is the maximum loaded or stored 697 // size. 698 SmallPtrSet<Instruction *, 4> Visited; 699 SmallVector<std::pair<Instruction *, Instruction *>, 4> Uses; 700 Visited.insert(Root); 701 Uses.push_back(std::make_pair(cast<Instruction>(*U), Root)); 702 // If there are no loads or stores, the access is dead. We mark that as 703 // a size zero access. 704 Size = 0; 705 do { 706 Instruction *I, *UsedI; 707 llvm::tie(UsedI, I) = Uses.pop_back_val(); 708 709 if (LoadInst *LI = dyn_cast<LoadInst>(I)) { 710 Size = std::max(Size, TD.getTypeStoreSize(LI->getType())); 711 continue; 712 } 713 if (StoreInst *SI = dyn_cast<StoreInst>(I)) { 714 Value *Op = SI->getOperand(0); 715 if (Op == UsedI) 716 return SI; 717 Size = std::max(Size, TD.getTypeStoreSize(Op->getType())); 718 continue; 719 } 720 721 if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I)) { 722 if (!GEP->hasAllZeroIndices()) 723 return GEP; 724 } else if (!isa<BitCastInst>(I) && !isa<PHINode>(I) && 725 !isa<SelectInst>(I)) { 726 return I; 727 } 728 729 for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); UI != UE; 730 ++UI) 731 if (Visited.insert(cast<Instruction>(*UI))) 732 Uses.push_back(std::make_pair(I, cast<Instruction>(*UI))); 733 } while (!Uses.empty()); 734 735 return 0; 736 } 737 738 bool visitPHINode(PHINode &PN) { 739 // See if we already have computed info on this node. 740 std::pair<uint64_t, bool> &PHIInfo = P.PHIOrSelectSizes[&PN]; 741 if (PHIInfo.first) { 742 PHIInfo.second = true; 743 insertUse(PN, Offset, PHIInfo.first); 744 return true; 745 } 746 747 // Check for an unsafe use of the PHI node. 748 if (Instruction *EscapingI = hasUnsafePHIOrSelectUse(&PN, PHIInfo.first)) 749 return markAsEscaping(*EscapingI); 750 751 insertUse(PN, Offset, PHIInfo.first); 752 return true; 753 } 754 755 bool visitSelectInst(SelectInst &SI) { 756 if (Value *Result = foldSelectInst(SI)) { 757 if (Result == *U) 758 // If the result of the constant fold will be the pointer, recurse 759 // through the select as if we had RAUW'ed it. 760 enqueueUsers(SI, Offset); 761 762 return true; 763 } 764 765 // See if we already have computed info on this node. 766 std::pair<uint64_t, bool> &SelectInfo = P.PHIOrSelectSizes[&SI]; 767 if (SelectInfo.first) { 768 SelectInfo.second = true; 769 insertUse(SI, Offset, SelectInfo.first); 770 return true; 771 } 772 773 // Check for an unsafe use of the PHI node. 774 if (Instruction *EscapingI = hasUnsafePHIOrSelectUse(&SI, SelectInfo.first)) 775 return markAsEscaping(*EscapingI); 776 777 insertUse(SI, Offset, SelectInfo.first); 778 return true; 779 } 780 781 /// \brief Disable SROA entirely if there are unhandled users of the alloca. 782 bool visitInstruction(Instruction &I) { return markAsEscaping(I); } 783 }; 784 785 786 /// \brief Use adder for the alloca partitioning. 787 /// 788 /// This class adds the uses of an alloca to all of the partitions which they 789 /// use. For splittable partitions, this can end up doing essentially a linear 790 /// walk of the partitions, but the number of steps remains bounded by the 791 /// total result instruction size: 792 /// - The number of partitions is a result of the number unsplittable 793 /// instructions using the alloca. 794 /// - The number of users of each partition is at worst the total number of 795 /// splittable instructions using the alloca. 796 /// Thus we will produce N * M instructions in the end, where N are the number 797 /// of unsplittable uses and M are the number of splittable. This visitor does 798 /// the exact same number of updates to the partitioning. 799 /// 800 /// In the more common case, this visitor will leverage the fact that the 801 /// partition space is pre-sorted, and do a logarithmic search for the 802 /// partition needed, making the total visit a classical ((N + M) * log(N)) 803 /// complexity operation. 804 class AllocaPartitioning::UseBuilder : public BuilderBase<UseBuilder> { 805 friend class InstVisitor<UseBuilder>; 806 807 /// \brief Set to de-duplicate dead instructions found in the use walk. 808 SmallPtrSet<Instruction *, 4> VisitedDeadInsts; 809 810 public: 811 UseBuilder(const TargetData &TD, AllocaInst &AI, AllocaPartitioning &P) 812 : BuilderBase<UseBuilder>(TD, AI, P) {} 813 814 /// \brief Run the builder over the allocation. 815 void operator()() { 816 // Note that we have to re-evaluate size on each trip through the loop as 817 // the queue grows at the tail. 818 for (unsigned Idx = 0; Idx < Queue.size(); ++Idx) { 819 U = Queue[Idx].U; 820 Offset = Queue[Idx].Offset; 821 this->visit(cast<Instruction>(U->getUser())); 822 } 823 } 824 825 private: 826 void markAsDead(Instruction &I) { 827 if (VisitedDeadInsts.insert(&I)) 828 P.DeadUsers.push_back(&I); 829 } 830 831 void insertUse(Instruction &User, int64_t Offset, uint64_t Size) { 832 // If the use has a zero size or extends outside of the allocation, record 833 // it as a dead use for elimination later. 834 if (Size == 0 || (uint64_t)Offset >= AllocSize || 835 (Offset < 0 && (uint64_t)-Offset >= Size)) 836 return markAsDead(User); 837 838 // Clamp the start to the beginning of the allocation. 839 if (Offset < 0) { 840 Size -= (uint64_t)-Offset; 841 Offset = 0; 842 } 843 844 uint64_t BeginOffset = Offset, EndOffset = BeginOffset + Size; 845 846 // Clamp the end offset to the end of the allocation. Note that this is 847 // formulated to handle even the case where "BeginOffset + Size" overflows. 848 assert(AllocSize >= BeginOffset); // Established above. 849 if (Size > AllocSize - BeginOffset) 850 EndOffset = AllocSize; 851 852 // NB: This only works if we have zero overlapping partitions. 853 iterator B = std::lower_bound(P.begin(), P.end(), BeginOffset); 854 if (B != P.begin() && llvm::prior(B)->EndOffset > BeginOffset) 855 B = llvm::prior(B); 856 for (iterator I = B, E = P.end(); I != E && I->BeginOffset < EndOffset; 857 ++I) { 858 PartitionUse NewPU(std::max(I->BeginOffset, BeginOffset), 859 std::min(I->EndOffset, EndOffset), U); 860 P.use_push_back(I, NewPU); 861 if (isa<PHINode>(U->getUser()) || isa<SelectInst>(U->getUser())) 862 P.PHIOrSelectOpMap[U] 863 = std::make_pair(I - P.begin(), P.Uses[I - P.begin()].size() - 1); 864 } 865 } 866 867 void handleLoadOrStore(Type *Ty, Instruction &I, int64_t Offset) { 868 uint64_t Size = TD.getTypeStoreSize(Ty); 869 870 // If this memory access can be shown to *statically* extend outside the 871 // bounds of of the allocation, it's behavior is undefined, so simply 872 // ignore it. Note that this is more strict than the generic clamping 873 // behavior of insertUse. 874 if (Offset < 0 || (uint64_t)Offset >= AllocSize || 875 Size > (AllocSize - (uint64_t)Offset)) 876 return markAsDead(I); 877 878 insertUse(I, Offset, Size); 879 } 880 881 void visitBitCastInst(BitCastInst &BC) { 882 if (BC.use_empty()) 883 return markAsDead(BC); 884 885 enqueueUsers(BC, Offset); 886 } 887 888 void visitGetElementPtrInst(GetElementPtrInst &GEPI) { 889 if (GEPI.use_empty()) 890 return markAsDead(GEPI); 891 892 int64_t GEPOffset; 893 if (!computeConstantGEPOffset(GEPI, GEPOffset)) 894 llvm_unreachable("Unable to compute constant offset for use"); 895 896 enqueueUsers(GEPI, GEPOffset); 897 } 898 899 void visitLoadInst(LoadInst &LI) { 900 handleLoadOrStore(LI.getType(), LI, Offset); 901 } 902 903 void visitStoreInst(StoreInst &SI) { 904 handleLoadOrStore(SI.getOperand(0)->getType(), SI, Offset); 905 } 906 907 void visitMemSetInst(MemSetInst &II) { 908 ConstantInt *Length = dyn_cast<ConstantInt>(II.getLength()); 909 uint64_t Size = Length ? Length->getZExtValue() : AllocSize - Offset; 910 insertUse(II, Offset, Size); 911 } 912 913 void visitMemTransferInst(MemTransferInst &II) { 914 ConstantInt *Length = dyn_cast<ConstantInt>(II.getLength()); 915 uint64_t Size = Length ? Length->getZExtValue() : AllocSize - Offset; 916 insertUse(II, Offset, Size); 917 } 918 919 void visitIntrinsicInst(IntrinsicInst &II) { 920 assert(II.getIntrinsicID() == Intrinsic::lifetime_start || 921 II.getIntrinsicID() == Intrinsic::lifetime_end); 922 923 ConstantInt *Length = cast<ConstantInt>(II.getArgOperand(0)); 924 insertUse(II, Offset, 925 std::min(AllocSize - Offset, Length->getLimitedValue())); 926 } 927 928 void insertPHIOrSelect(Instruction &User, uint64_t Offset) { 929 uint64_t Size = P.PHIOrSelectSizes.lookup(&User).first; 930 931 // For PHI and select operands outside the alloca, we can't nuke the entire 932 // phi or select -- the other side might still be relevant, so we special 933 // case them here and use a separate structure to track the operands 934 // themselves which should be replaced with undef. 935 if (Offset >= AllocSize) { 936 P.DeadOperands.push_back(U); 937 return; 938 } 939 940 insertUse(User, Offset, Size); 941 } 942 void visitPHINode(PHINode &PN) { 943 if (PN.use_empty()) 944 return markAsDead(PN); 945 946 insertPHIOrSelect(PN, Offset); 947 } 948 void visitSelectInst(SelectInst &SI) { 949 if (SI.use_empty()) 950 return markAsDead(SI); 951 952 if (Value *Result = foldSelectInst(SI)) { 953 if (Result == *U) 954 // If the result of the constant fold will be the pointer, recurse 955 // through the select as if we had RAUW'ed it. 956 enqueueUsers(SI, Offset); 957 else 958 // Otherwise the operand to the select is dead, and we can replace it 959 // with undef. 960 P.DeadOperands.push_back(U); 961 962 return; 963 } 964 965 insertPHIOrSelect(SI, Offset); 966 } 967 968 /// \brief Unreachable, we've already visited the alloca once. 969 void visitInstruction(Instruction &I) { 970 llvm_unreachable("Unhandled instruction in use builder."); 971 } 972 }; 973 974 void AllocaPartitioning::splitAndMergePartitions() { 975 size_t NumDeadPartitions = 0; 976 977 // Track the range of splittable partitions that we pass when accumulating 978 // overlapping unsplittable partitions. 979 uint64_t SplitEndOffset = 0ull; 980 981 Partition New(0ull, 0ull, false); 982 983 for (unsigned i = 0, j = i, e = Partitions.size(); i != e; i = j) { 984 ++j; 985 986 if (!Partitions[i].IsSplittable || New.BeginOffset == New.EndOffset) { 987 assert(New.BeginOffset == New.EndOffset); 988 New = Partitions[i]; 989 } else { 990 assert(New.IsSplittable); 991 New.EndOffset = std::max(New.EndOffset, Partitions[i].EndOffset); 992 } 993 assert(New.BeginOffset != New.EndOffset); 994 995 // Scan the overlapping partitions. 996 while (j != e && New.EndOffset > Partitions[j].BeginOffset) { 997 // If the new partition we are forming is splittable, stop at the first 998 // unsplittable partition. 999 if (New.IsSplittable && !Partitions[j].IsSplittable) 1000 break; 1001 1002 // Grow the new partition to include any equally splittable range. 'j' is 1003 // always equally splittable when New is splittable, but when New is not 1004 // splittable, we may subsume some (or part of some) splitable partition 1005 // without growing the new one. 1006 if (New.IsSplittable == Partitions[j].IsSplittable) { 1007 New.EndOffset = std::max(New.EndOffset, Partitions[j].EndOffset); 1008 } else { 1009 assert(!New.IsSplittable); 1010 assert(Partitions[j].IsSplittable); 1011 SplitEndOffset = std::max(SplitEndOffset, Partitions[j].EndOffset); 1012 } 1013 1014 Partitions[j].BeginOffset = Partitions[j].EndOffset = UINT64_MAX; 1015 ++NumDeadPartitions; 1016 ++j; 1017 } 1018 1019 // If the new partition is splittable, chop off the end as soon as the 1020 // unsplittable subsequent partition starts and ensure we eventually cover 1021 // the splittable area. 1022 if (j != e && New.IsSplittable) { 1023 SplitEndOffset = std::max(SplitEndOffset, New.EndOffset); 1024 New.EndOffset = std::min(New.EndOffset, Partitions[j].BeginOffset); 1025 } 1026 1027 // Add the new partition if it differs from the original one and is 1028 // non-empty. We can end up with an empty partition here if it was 1029 // splittable but there is an unsplittable one that starts at the same 1030 // offset. 1031 if (New != Partitions[i]) { 1032 if (New.BeginOffset != New.EndOffset) 1033 Partitions.push_back(New); 1034 // Mark the old one for removal. 1035 Partitions[i].BeginOffset = Partitions[i].EndOffset = UINT64_MAX; 1036 ++NumDeadPartitions; 1037 } 1038 1039 New.BeginOffset = New.EndOffset; 1040 if (!New.IsSplittable) { 1041 New.EndOffset = std::max(New.EndOffset, SplitEndOffset); 1042 if (j != e && !Partitions[j].IsSplittable) 1043 New.EndOffset = std::min(New.EndOffset, Partitions[j].BeginOffset); 1044 New.IsSplittable = true; 1045 // If there is a trailing splittable partition which won't be fused into 1046 // the next splittable partition go ahead and add it onto the partitions 1047 // list. 1048 if (New.BeginOffset < New.EndOffset && 1049 (j == e || !Partitions[j].IsSplittable || 1050 New.EndOffset < Partitions[j].BeginOffset)) { 1051 Partitions.push_back(New); 1052 New.BeginOffset = New.EndOffset = 0ull; 1053 } 1054 } 1055 } 1056 1057 // Re-sort the partitions now that they have been split and merged into 1058 // disjoint set of partitions. Also remove any of the dead partitions we've 1059 // replaced in the process. 1060 std::sort(Partitions.begin(), Partitions.end()); 1061 if (NumDeadPartitions) { 1062 assert(Partitions.back().BeginOffset == UINT64_MAX); 1063 assert(Partitions.back().EndOffset == UINT64_MAX); 1064 assert((ptrdiff_t)NumDeadPartitions == 1065 std::count(Partitions.begin(), Partitions.end(), Partitions.back())); 1066 } 1067 Partitions.erase(Partitions.end() - NumDeadPartitions, Partitions.end()); 1068 } 1069 1070 AllocaPartitioning::AllocaPartitioning(const TargetData &TD, AllocaInst &AI) 1071 : 1072 #ifndef NDEBUG 1073 AI(AI), 1074 #endif 1075 PointerEscapingInstr(0) { 1076 PartitionBuilder PB(TD, AI, *this); 1077 if (!PB()) 1078 return; 1079 1080 if (Partitions.size() > 1) { 1081 // Sort the uses. This arranges for the offsets to be in ascending order, 1082 // and the sizes to be in descending order. 1083 std::sort(Partitions.begin(), Partitions.end()); 1084 1085 // Intersect splittability for all partitions with equal offsets and sizes. 1086 // Then remove all but the first so that we have a sequence of non-equal but 1087 // potentially overlapping partitions. 1088 for (iterator I = Partitions.begin(), J = I, E = Partitions.end(); I != E; 1089 I = J) { 1090 ++J; 1091 while (J != E && *I == *J) { 1092 I->IsSplittable &= J->IsSplittable; 1093 ++J; 1094 } 1095 } 1096 Partitions.erase(std::unique(Partitions.begin(), Partitions.end()), 1097 Partitions.end()); 1098 1099 // Split splittable and merge unsplittable partitions into a disjoint set 1100 // of partitions over the used space of the allocation. 1101 splitAndMergePartitions(); 1102 } 1103 1104 // Now build up the user lists for each of these disjoint partitions by 1105 // re-walking the recursive users of the alloca. 1106 Uses.resize(Partitions.size()); 1107 UseBuilder UB(TD, AI, *this); 1108 UB(); 1109 } 1110 1111 Type *AllocaPartitioning::getCommonType(iterator I) const { 1112 Type *Ty = 0; 1113 for (const_use_iterator UI = use_begin(I), UE = use_end(I); UI != UE; ++UI) { 1114 if (!UI->U) 1115 continue; // Skip dead uses. 1116 if (isa<IntrinsicInst>(*UI->U->getUser())) 1117 continue; 1118 if (UI->BeginOffset != I->BeginOffset || UI->EndOffset != I->EndOffset) 1119 continue; 1120 1121 Type *UserTy = 0; 1122 if (LoadInst *LI = dyn_cast<LoadInst>(UI->U->getUser())) { 1123 UserTy = LI->getType(); 1124 } else if (StoreInst *SI = dyn_cast<StoreInst>(UI->U->getUser())) { 1125 UserTy = SI->getValueOperand()->getType(); 1126 } 1127 1128 if (Ty && Ty != UserTy) 1129 return 0; 1130 1131 Ty = UserTy; 1132 } 1133 return Ty; 1134 } 1135 1136 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1137 1138 void AllocaPartitioning::print(raw_ostream &OS, const_iterator I, 1139 StringRef Indent) const { 1140 OS << Indent << "partition #" << (I - begin()) 1141 << " [" << I->BeginOffset << "," << I->EndOffset << ")" 1142 << (I->IsSplittable ? " (splittable)" : "") 1143 << (Uses[I - begin()].empty() ? " (zero uses)" : "") 1144 << "\n"; 1145 } 1146 1147 void AllocaPartitioning::printUsers(raw_ostream &OS, const_iterator I, 1148 StringRef Indent) const { 1149 for (const_use_iterator UI = use_begin(I), UE = use_end(I); 1150 UI != UE; ++UI) { 1151 if (!UI->U) 1152 continue; // Skip dead uses. 1153 OS << Indent << " [" << UI->BeginOffset << "," << UI->EndOffset << ") " 1154 << "used by: " << *UI->U->getUser() << "\n"; 1155 if (MemTransferInst *II = dyn_cast<MemTransferInst>(UI->U->getUser())) { 1156 const MemTransferOffsets &MTO = MemTransferInstData.lookup(II); 1157 bool IsDest; 1158 if (!MTO.IsSplittable) 1159 IsDest = UI->BeginOffset == MTO.DestBegin; 1160 else 1161 IsDest = MTO.DestBegin != 0u; 1162 OS << Indent << " (original " << (IsDest ? "dest" : "source") << ": " 1163 << "[" << (IsDest ? MTO.DestBegin : MTO.SourceBegin) 1164 << "," << (IsDest ? MTO.DestEnd : MTO.SourceEnd) << ")\n"; 1165 } 1166 } 1167 } 1168 1169 void AllocaPartitioning::print(raw_ostream &OS) const { 1170 if (PointerEscapingInstr) { 1171 OS << "No partitioning for alloca: " << AI << "\n" 1172 << " A pointer to this alloca escaped by:\n" 1173 << " " << *PointerEscapingInstr << "\n"; 1174 return; 1175 } 1176 1177 OS << "Partitioning of alloca: " << AI << "\n"; 1178 unsigned Num = 0; 1179 for (const_iterator I = begin(), E = end(); I != E; ++I, ++Num) { 1180 print(OS, I); 1181 printUsers(OS, I); 1182 } 1183 } 1184 1185 void AllocaPartitioning::dump(const_iterator I) const { print(dbgs(), I); } 1186 void AllocaPartitioning::dump() const { print(dbgs()); } 1187 1188 #endif // !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1189 1190 1191 namespace { 1192 /// \brief Implementation of LoadAndStorePromoter for promoting allocas. 1193 /// 1194 /// This subclass of LoadAndStorePromoter adds overrides to handle promoting 1195 /// the loads and stores of an alloca instruction, as well as updating its 1196 /// debug information. This is used when a domtree is unavailable and thus 1197 /// mem2reg in its full form can't be used to handle promotion of allocas to 1198 /// scalar values. 1199 class AllocaPromoter : public LoadAndStorePromoter { 1200 AllocaInst &AI; 1201 DIBuilder &DIB; 1202 1203 SmallVector<DbgDeclareInst *, 4> DDIs; 1204 SmallVector<DbgValueInst *, 4> DVIs; 1205 1206 public: 1207 AllocaPromoter(const SmallVectorImpl<Instruction*> &Insts, SSAUpdater &S, 1208 AllocaInst &AI, DIBuilder &DIB) 1209 : LoadAndStorePromoter(Insts, S), AI(AI), DIB(DIB) {} 1210 1211 void run(const SmallVectorImpl<Instruction*> &Insts) { 1212 // Remember which alloca we're promoting (for isInstInList). 1213 if (MDNode *DebugNode = MDNode::getIfExists(AI.getContext(), &AI)) { 1214 for (Value::use_iterator UI = DebugNode->use_begin(), 1215 UE = DebugNode->use_end(); 1216 UI != UE; ++UI) 1217 if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(*UI)) 1218 DDIs.push_back(DDI); 1219 else if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(*UI)) 1220 DVIs.push_back(DVI); 1221 } 1222 1223 LoadAndStorePromoter::run(Insts); 1224 AI.eraseFromParent(); 1225 while (!DDIs.empty()) 1226 DDIs.pop_back_val()->eraseFromParent(); 1227 while (!DVIs.empty()) 1228 DVIs.pop_back_val()->eraseFromParent(); 1229 } 1230 1231 virtual bool isInstInList(Instruction *I, 1232 const SmallVectorImpl<Instruction*> &Insts) const { 1233 if (LoadInst *LI = dyn_cast<LoadInst>(I)) 1234 return LI->getOperand(0) == &AI; 1235 return cast<StoreInst>(I)->getPointerOperand() == &AI; 1236 } 1237 1238 virtual void updateDebugInfo(Instruction *Inst) const { 1239 for (SmallVector<DbgDeclareInst *, 4>::const_iterator I = DDIs.begin(), 1240 E = DDIs.end(); I != E; ++I) { 1241 DbgDeclareInst *DDI = *I; 1242 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) 1243 ConvertDebugDeclareToDebugValue(DDI, SI, DIB); 1244 else if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) 1245 ConvertDebugDeclareToDebugValue(DDI, LI, DIB); 1246 } 1247 for (SmallVector<DbgValueInst *, 4>::const_iterator I = DVIs.begin(), 1248 E = DVIs.end(); I != E; ++I) { 1249 DbgValueInst *DVI = *I; 1250 Value *Arg = NULL; 1251 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { 1252 // If an argument is zero extended then use argument directly. The ZExt 1253 // may be zapped by an optimization pass in future. 1254 if (ZExtInst *ZExt = dyn_cast<ZExtInst>(SI->getOperand(0))) 1255 Arg = dyn_cast<Argument>(ZExt->getOperand(0)); 1256 if (SExtInst *SExt = dyn_cast<SExtInst>(SI->getOperand(0))) 1257 Arg = dyn_cast<Argument>(SExt->getOperand(0)); 1258 if (!Arg) 1259 Arg = SI->getOperand(0); 1260 } else if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) { 1261 Arg = LI->getOperand(0); 1262 } else { 1263 continue; 1264 } 1265 Instruction *DbgVal = 1266 DIB.insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()), 1267 Inst); 1268 DbgVal->setDebugLoc(DVI->getDebugLoc()); 1269 } 1270 } 1271 }; 1272 } // end anon namespace 1273 1274 1275 namespace { 1276 /// \brief An optimization pass providing Scalar Replacement of Aggregates. 1277 /// 1278 /// This pass takes allocations which can be completely analyzed (that is, they 1279 /// don't escape) and tries to turn them into scalar SSA values. There are 1280 /// a few steps to this process. 1281 /// 1282 /// 1) It takes allocations of aggregates and analyzes the ways in which they 1283 /// are used to try to split them into smaller allocations, ideally of 1284 /// a single scalar data type. It will split up memcpy and memset accesses 1285 /// as necessary and try to isolate invidual scalar accesses. 1286 /// 2) It will transform accesses into forms which are suitable for SSA value 1287 /// promotion. This can be replacing a memset with a scalar store of an 1288 /// integer value, or it can involve speculating operations on a PHI or 1289 /// select to be a PHI or select of the results. 1290 /// 3) Finally, this will try to detect a pattern of accesses which map cleanly 1291 /// onto insert and extract operations on a vector value, and convert them to 1292 /// this form. By doing so, it will enable promotion of vector aggregates to 1293 /// SSA vector values. 1294 class SROA : public FunctionPass { 1295 const bool RequiresDomTree; 1296 1297 LLVMContext *C; 1298 const TargetData *TD; 1299 DominatorTree *DT; 1300 1301 /// \brief Worklist of alloca instructions to simplify. 1302 /// 1303 /// Each alloca in the function is added to this. Each new alloca formed gets 1304 /// added to it as well to recursively simplify unless that alloca can be 1305 /// directly promoted. Finally, each time we rewrite a use of an alloca other 1306 /// the one being actively rewritten, we add it back onto the list if not 1307 /// already present to ensure it is re-visited. 1308 SetVector<AllocaInst *, SmallVector<AllocaInst *, 16> > Worklist; 1309 1310 /// \brief A collection of instructions to delete. 1311 /// We try to batch deletions to simplify code and make things a bit more 1312 /// efficient. 1313 SmallVector<Instruction *, 8> DeadInsts; 1314 1315 /// \brief A set to prevent repeatedly marking an instruction split into many 1316 /// uses as dead. Only used to guard insertion into DeadInsts. 1317 SmallPtrSet<Instruction *, 4> DeadSplitInsts; 1318 1319 /// \brief A collection of alloca instructions we can directly promote. 1320 std::vector<AllocaInst *> PromotableAllocas; 1321 1322 public: 1323 SROA(bool RequiresDomTree = true) 1324 : FunctionPass(ID), RequiresDomTree(RequiresDomTree), 1325 C(0), TD(0), DT(0) { 1326 initializeSROAPass(*PassRegistry::getPassRegistry()); 1327 } 1328 bool runOnFunction(Function &F); 1329 void getAnalysisUsage(AnalysisUsage &AU) const; 1330 1331 const char *getPassName() const { return "SROA"; } 1332 static char ID; 1333 1334 private: 1335 friend class PHIOrSelectSpeculator; 1336 friend class AllocaPartitionRewriter; 1337 friend class AllocaPartitionVectorRewriter; 1338 1339 bool rewriteAllocaPartition(AllocaInst &AI, 1340 AllocaPartitioning &P, 1341 AllocaPartitioning::iterator PI); 1342 bool splitAlloca(AllocaInst &AI, AllocaPartitioning &P); 1343 bool runOnAlloca(AllocaInst &AI); 1344 void deleteDeadInstructions(SmallPtrSet<AllocaInst *, 4> &DeletedAllocas); 1345 bool promoteAllocas(Function &F); 1346 }; 1347 } 1348 1349 char SROA::ID = 0; 1350 1351 FunctionPass *llvm::createSROAPass(bool RequiresDomTree) { 1352 return new SROA(RequiresDomTree); 1353 } 1354 1355 INITIALIZE_PASS_BEGIN(SROA, "sroa", "Scalar Replacement Of Aggregates", 1356 false, false) 1357 INITIALIZE_PASS_DEPENDENCY(DominatorTree) 1358 INITIALIZE_PASS_END(SROA, "sroa", "Scalar Replacement Of Aggregates", 1359 false, false) 1360 1361 /// \brief Accumulate the constant offsets in a GEP into a single APInt offset. 1362 /// 1363 /// If the provided GEP is all-constant, the total byte offset formed by the 1364 /// GEP is computed and Offset is set to it. If the GEP has any non-constant 1365 /// operands, the function returns false and the value of Offset is unmodified. 1366 static bool accumulateGEPOffsets(const TargetData &TD, GEPOperator &GEP, 1367 APInt &Offset) { 1368 APInt GEPOffset(Offset.getBitWidth(), 0); 1369 for (gep_type_iterator GTI = gep_type_begin(GEP), GTE = gep_type_end(GEP); 1370 GTI != GTE; ++GTI) { 1371 ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand()); 1372 if (!OpC) 1373 return false; 1374 if (OpC->isZero()) continue; 1375 1376 // Handle a struct index, which adds its field offset to the pointer. 1377 if (StructType *STy = dyn_cast<StructType>(*GTI)) { 1378 unsigned ElementIdx = OpC->getZExtValue(); 1379 const StructLayout *SL = TD.getStructLayout(STy); 1380 GEPOffset += APInt(Offset.getBitWidth(), 1381 SL->getElementOffset(ElementIdx)); 1382 continue; 1383 } 1384 1385 APInt TypeSize(Offset.getBitWidth(), 1386 TD.getTypeAllocSize(GTI.getIndexedType())); 1387 if (VectorType *VTy = dyn_cast<VectorType>(*GTI)) { 1388 assert((VTy->getScalarSizeInBits() % 8) == 0 && 1389 "vector element size is not a multiple of 8, cannot GEP over it"); 1390 TypeSize = VTy->getScalarSizeInBits() / 8; 1391 } 1392 1393 GEPOffset += OpC->getValue().sextOrTrunc(Offset.getBitWidth()) * TypeSize; 1394 } 1395 Offset = GEPOffset; 1396 return true; 1397 } 1398 1399 /// \brief Build a GEP out of a base pointer and indices. 1400 /// 1401 /// This will return the BasePtr if that is valid, or build a new GEP 1402 /// instruction using the IRBuilder if GEP-ing is needed. 1403 static Value *buildGEP(IRBuilder<> &IRB, Value *BasePtr, 1404 SmallVectorImpl<Value *> &Indices, 1405 const Twine &Prefix) { 1406 if (Indices.empty()) 1407 return BasePtr; 1408 1409 // A single zero index is a no-op, so check for this and avoid building a GEP 1410 // in that case. 1411 if (Indices.size() == 1 && cast<ConstantInt>(Indices.back())->isZero()) 1412 return BasePtr; 1413 1414 return IRB.CreateInBoundsGEP(BasePtr, Indices, Prefix + ".idx"); 1415 } 1416 1417 /// \brief Get a natural GEP off of the BasePtr walking through Ty toward 1418 /// TargetTy without changing the offset of the pointer. 1419 /// 1420 /// This routine assumes we've already established a properly offset GEP with 1421 /// Indices, and arrived at the Ty type. The goal is to continue to GEP with 1422 /// zero-indices down through type layers until we find one the same as 1423 /// TargetTy. If we can't find one with the same type, we at least try to use 1424 /// one with the same size. If none of that works, we just produce the GEP as 1425 /// indicated by Indices to have the correct offset. 1426 static Value *getNaturalGEPWithType(IRBuilder<> &IRB, const TargetData &TD, 1427 Value *BasePtr, Type *Ty, Type *TargetTy, 1428 SmallVectorImpl<Value *> &Indices, 1429 const Twine &Prefix) { 1430 if (Ty == TargetTy) 1431 return buildGEP(IRB, BasePtr, Indices, Prefix); 1432 1433 // See if we can descend into a struct and locate a field with the correct 1434 // type. 1435 unsigned NumLayers = 0; 1436 Type *ElementTy = Ty; 1437 do { 1438 if (ElementTy->isPointerTy()) 1439 break; 1440 if (SequentialType *SeqTy = dyn_cast<SequentialType>(ElementTy)) { 1441 ElementTy = SeqTy->getElementType(); 1442 Indices.push_back(IRB.getInt(APInt(TD.getPointerSizeInBits(), 0))); 1443 } else if (StructType *STy = dyn_cast<StructType>(ElementTy)) { 1444 ElementTy = *STy->element_begin(); 1445 Indices.push_back(IRB.getInt32(0)); 1446 } else { 1447 break; 1448 } 1449 ++NumLayers; 1450 } while (ElementTy != TargetTy); 1451 if (ElementTy != TargetTy) 1452 Indices.erase(Indices.end() - NumLayers, Indices.end()); 1453 1454 return buildGEP(IRB, BasePtr, Indices, Prefix); 1455 } 1456 1457 /// \brief Recursively compute indices for a natural GEP. 1458 /// 1459 /// This is the recursive step for getNaturalGEPWithOffset that walks down the 1460 /// element types adding appropriate indices for the GEP. 1461 static Value *getNaturalGEPRecursively(IRBuilder<> &IRB, const TargetData &TD, 1462 Value *Ptr, Type *Ty, APInt &Offset, 1463 Type *TargetTy, 1464 SmallVectorImpl<Value *> &Indices, 1465 const Twine &Prefix) { 1466 if (Offset == 0) 1467 return getNaturalGEPWithType(IRB, TD, Ptr, Ty, TargetTy, Indices, Prefix); 1468 1469 // We can't recurse through pointer types. 1470 if (Ty->isPointerTy()) 1471 return 0; 1472 1473 // We try to analyze GEPs over vectors here, but note that these GEPs are 1474 // extremely poorly defined currently. The long-term goal is to remove GEPing 1475 // over a vector from the IR completely. 1476 if (VectorType *VecTy = dyn_cast<VectorType>(Ty)) { 1477 unsigned ElementSizeInBits = VecTy->getScalarSizeInBits(); 1478 if (ElementSizeInBits % 8) 1479 return 0; // GEPs over non-multiple of 8 size vector elements are invalid. 1480 APInt ElementSize(Offset.getBitWidth(), ElementSizeInBits / 8); 1481 APInt NumSkippedElements = Offset.udiv(ElementSize); 1482 if (NumSkippedElements.ugt(VecTy->getNumElements())) 1483 return 0; 1484 Offset -= NumSkippedElements * ElementSize; 1485 Indices.push_back(IRB.getInt(NumSkippedElements)); 1486 return getNaturalGEPRecursively(IRB, TD, Ptr, VecTy->getElementType(), 1487 Offset, TargetTy, Indices, Prefix); 1488 } 1489 1490 if (ArrayType *ArrTy = dyn_cast<ArrayType>(Ty)) { 1491 Type *ElementTy = ArrTy->getElementType(); 1492 APInt ElementSize(Offset.getBitWidth(), TD.getTypeAllocSize(ElementTy)); 1493 APInt NumSkippedElements = Offset.udiv(ElementSize); 1494 if (NumSkippedElements.ugt(ArrTy->getNumElements())) 1495 return 0; 1496 1497 Offset -= NumSkippedElements * ElementSize; 1498 Indices.push_back(IRB.getInt(NumSkippedElements)); 1499 return getNaturalGEPRecursively(IRB, TD, Ptr, ElementTy, Offset, TargetTy, 1500 Indices, Prefix); 1501 } 1502 1503 StructType *STy = dyn_cast<StructType>(Ty); 1504 if (!STy) 1505 return 0; 1506 1507 const StructLayout *SL = TD.getStructLayout(STy); 1508 uint64_t StructOffset = Offset.getZExtValue(); 1509 if (StructOffset >= SL->getSizeInBytes()) 1510 return 0; 1511 unsigned Index = SL->getElementContainingOffset(StructOffset); 1512 Offset -= APInt(Offset.getBitWidth(), SL->getElementOffset(Index)); 1513 Type *ElementTy = STy->getElementType(Index); 1514 if (Offset.uge(TD.getTypeAllocSize(ElementTy))) 1515 return 0; // The offset points into alignment padding. 1516 1517 Indices.push_back(IRB.getInt32(Index)); 1518 return getNaturalGEPRecursively(IRB, TD, Ptr, ElementTy, Offset, TargetTy, 1519 Indices, Prefix); 1520 } 1521 1522 /// \brief Get a natural GEP from a base pointer to a particular offset and 1523 /// resulting in a particular type. 1524 /// 1525 /// The goal is to produce a "natural" looking GEP that works with the existing 1526 /// composite types to arrive at the appropriate offset and element type for 1527 /// a pointer. TargetTy is the element type the returned GEP should point-to if 1528 /// possible. We recurse by decreasing Offset, adding the appropriate index to 1529 /// Indices, and setting Ty to the result subtype. 1530 /// 1531 /// If no natural GEP can be constructed, this function returns null. 1532 static Value *getNaturalGEPWithOffset(IRBuilder<> &IRB, const TargetData &TD, 1533 Value *Ptr, APInt Offset, Type *TargetTy, 1534 SmallVectorImpl<Value *> &Indices, 1535 const Twine &Prefix) { 1536 PointerType *Ty = cast<PointerType>(Ptr->getType()); 1537 1538 // Don't consider any GEPs through an i8* as natural unless the TargetTy is 1539 // an i8. 1540 if (Ty == IRB.getInt8PtrTy() && TargetTy->isIntegerTy(8)) 1541 return 0; 1542 1543 Type *ElementTy = Ty->getElementType(); 1544 if (!ElementTy->isSized()) 1545 return 0; // We can't GEP through an unsized element. 1546 APInt ElementSize(Offset.getBitWidth(), TD.getTypeAllocSize(ElementTy)); 1547 if (ElementSize == 0) 1548 return 0; // Zero-length arrays can't help us build a natural GEP. 1549 APInt NumSkippedElements = Offset.udiv(ElementSize); 1550 1551 Offset -= NumSkippedElements * ElementSize; 1552 Indices.push_back(IRB.getInt(NumSkippedElements)); 1553 return getNaturalGEPRecursively(IRB, TD, Ptr, ElementTy, Offset, TargetTy, 1554 Indices, Prefix); 1555 } 1556 1557 /// \brief Compute an adjusted pointer from Ptr by Offset bytes where the 1558 /// resulting pointer has PointerTy. 1559 /// 1560 /// This tries very hard to compute a "natural" GEP which arrives at the offset 1561 /// and produces the pointer type desired. Where it cannot, it will try to use 1562 /// the natural GEP to arrive at the offset and bitcast to the type. Where that 1563 /// fails, it will try to use an existing i8* and GEP to the byte offset and 1564 /// bitcast to the type. 1565 /// 1566 /// The strategy for finding the more natural GEPs is to peel off layers of the 1567 /// pointer, walking back through bit casts and GEPs, searching for a base 1568 /// pointer from which we can compute a natural GEP with the desired 1569 /// properities. The algorithm tries to fold as many constant indices into 1570 /// a single GEP as possible, thus making each GEP more independent of the 1571 /// surrounding code. 1572 static Value *getAdjustedPtr(IRBuilder<> &IRB, const TargetData &TD, 1573 Value *Ptr, APInt Offset, Type *PointerTy, 1574 const Twine &Prefix) { 1575 // Even though we don't look through PHI nodes, we could be called on an 1576 // instruction in an unreachable block, which may be on a cycle. 1577 SmallPtrSet<Value *, 4> Visited; 1578 Visited.insert(Ptr); 1579 SmallVector<Value *, 4> Indices; 1580 1581 // We may end up computing an offset pointer that has the wrong type. If we 1582 // never are able to compute one directly that has the correct type, we'll 1583 // fall back to it, so keep it around here. 1584 Value *OffsetPtr = 0; 1585 1586 // Remember any i8 pointer we come across to re-use if we need to do a raw 1587 // byte offset. 1588 Value *Int8Ptr = 0; 1589 APInt Int8PtrOffset(Offset.getBitWidth(), 0); 1590 1591 Type *TargetTy = PointerTy->getPointerElementType(); 1592 1593 do { 1594 // First fold any existing GEPs into the offset. 1595 while (GEPOperator *GEP = dyn_cast<GEPOperator>(Ptr)) { 1596 APInt GEPOffset(Offset.getBitWidth(), 0); 1597 if (!accumulateGEPOffsets(TD, *GEP, GEPOffset)) 1598 break; 1599 Offset += GEPOffset; 1600 Ptr = GEP->getPointerOperand(); 1601 if (!Visited.insert(Ptr)) 1602 break; 1603 } 1604 1605 // See if we can perform a natural GEP here. 1606 Indices.clear(); 1607 if (Value *P = getNaturalGEPWithOffset(IRB, TD, Ptr, Offset, TargetTy, 1608 Indices, Prefix)) { 1609 if (P->getType() == PointerTy) { 1610 // Zap any offset pointer that we ended up computing in previous rounds. 1611 if (OffsetPtr && OffsetPtr->use_empty()) 1612 if (Instruction *I = dyn_cast<Instruction>(OffsetPtr)) 1613 I->eraseFromParent(); 1614 return P; 1615 } 1616 if (!OffsetPtr) { 1617 OffsetPtr = P; 1618 } 1619 } 1620 1621 // Stash this pointer if we've found an i8*. 1622 if (Ptr->getType()->isIntegerTy(8)) { 1623 Int8Ptr = Ptr; 1624 Int8PtrOffset = Offset; 1625 } 1626 1627 // Peel off a layer of the pointer and update the offset appropriately. 1628 if (Operator::getOpcode(Ptr) == Instruction::BitCast) { 1629 Ptr = cast<Operator>(Ptr)->getOperand(0); 1630 } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(Ptr)) { 1631 if (GA->mayBeOverridden()) 1632 break; 1633 Ptr = GA->getAliasee(); 1634 } else { 1635 break; 1636 } 1637 assert(Ptr->getType()->isPointerTy() && "Unexpected operand type!"); 1638 } while (Visited.insert(Ptr)); 1639 1640 if (!OffsetPtr) { 1641 if (!Int8Ptr) { 1642 Int8Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy(), 1643 Prefix + ".raw_cast"); 1644 Int8PtrOffset = Offset; 1645 } 1646 1647 OffsetPtr = Int8PtrOffset == 0 ? Int8Ptr : 1648 IRB.CreateInBoundsGEP(Int8Ptr, IRB.getInt(Int8PtrOffset), 1649 Prefix + ".raw_idx"); 1650 } 1651 Ptr = OffsetPtr; 1652 1653 // On the off chance we were targeting i8*, guard the bitcast here. 1654 if (Ptr->getType() != PointerTy) 1655 Ptr = IRB.CreateBitCast(Ptr, PointerTy, Prefix + ".cast"); 1656 1657 return Ptr; 1658 } 1659 1660 /// \brief Test whether the given alloca partition can be promoted to a vector. 1661 /// 1662 /// This is a quick test to check whether we can rewrite a particular alloca 1663 /// partition (and its newly formed alloca) into a vector alloca with only 1664 /// whole-vector loads and stores such that it could be promoted to a vector 1665 /// SSA value. We only can ensure this for a limited set of operations, and we 1666 /// don't want to do the rewrites unless we are confident that the result will 1667 /// be promotable, so we have an early test here. 1668 static bool isVectorPromotionViable(const TargetData &TD, 1669 Type *AllocaTy, 1670 AllocaPartitioning &P, 1671 uint64_t PartitionBeginOffset, 1672 uint64_t PartitionEndOffset, 1673 AllocaPartitioning::const_use_iterator I, 1674 AllocaPartitioning::const_use_iterator E) { 1675 VectorType *Ty = dyn_cast<VectorType>(AllocaTy); 1676 if (!Ty) 1677 return false; 1678 1679 uint64_t VecSize = TD.getTypeSizeInBits(Ty); 1680 uint64_t ElementSize = Ty->getScalarSizeInBits(); 1681 1682 // While the definition of LLVM vectors is bitpacked, we don't support sizes 1683 // that aren't byte sized. 1684 if (ElementSize % 8) 1685 return false; 1686 assert((VecSize % 8) == 0 && "vector size not a multiple of element size?"); 1687 VecSize /= 8; 1688 ElementSize /= 8; 1689 1690 for (; I != E; ++I) { 1691 if (!I->U) 1692 continue; // Skip dead use. 1693 1694 uint64_t BeginOffset = I->BeginOffset - PartitionBeginOffset; 1695 uint64_t BeginIndex = BeginOffset / ElementSize; 1696 if (BeginIndex * ElementSize != BeginOffset || 1697 BeginIndex >= Ty->getNumElements()) 1698 return false; 1699 uint64_t EndOffset = I->EndOffset - PartitionBeginOffset; 1700 uint64_t EndIndex = EndOffset / ElementSize; 1701 if (EndIndex * ElementSize != EndOffset || 1702 EndIndex > Ty->getNumElements()) 1703 return false; 1704 1705 // FIXME: We should build shuffle vector instructions to handle 1706 // non-element-sized accesses. 1707 if ((EndOffset - BeginOffset) != ElementSize && 1708 (EndOffset - BeginOffset) != VecSize) 1709 return false; 1710 1711 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I->U->getUser())) { 1712 if (MI->isVolatile()) 1713 return false; 1714 if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(I->U->getUser())) { 1715 const AllocaPartitioning::MemTransferOffsets &MTO 1716 = P.getMemTransferOffsets(*MTI); 1717 if (!MTO.IsSplittable) 1718 return false; 1719 } 1720 } else if (I->U->get()->getType()->getPointerElementType()->isStructTy()) { 1721 // Disable vector promotion when there are loads or stores of an FCA. 1722 return false; 1723 } else if (!isa<LoadInst>(I->U->getUser()) && 1724 !isa<StoreInst>(I->U->getUser())) { 1725 return false; 1726 } 1727 } 1728 return true; 1729 } 1730 1731 /// \brief Test whether the given alloca partition can be promoted to an int. 1732 /// 1733 /// This is a quick test to check whether we can rewrite a particular alloca 1734 /// partition (and its newly formed alloca) into an integer alloca suitable for 1735 /// promotion to an SSA value. We only can ensure this for a limited set of 1736 /// operations, and we don't want to do the rewrites unless we are confident 1737 /// that the result will be promotable, so we have an early test here. 1738 static bool isIntegerPromotionViable(const TargetData &TD, 1739 Type *AllocaTy, 1740 AllocaPartitioning &P, 1741 AllocaPartitioning::const_use_iterator I, 1742 AllocaPartitioning::const_use_iterator E) { 1743 IntegerType *Ty = dyn_cast<IntegerType>(AllocaTy); 1744 if (!Ty) 1745 return false; 1746 1747 // Check the uses to ensure the uses are (likely) promoteable integer uses. 1748 // Also ensure that the alloca has a covering load or store. We don't want 1749 // promote because of some other unsplittable entry (which we may make 1750 // splittable later) and lose the ability to promote each element access. 1751 bool WholeAllocaOp = false; 1752 for (; I != E; ++I) { 1753 if (!I->U) 1754 continue; // Skip dead use. 1755 if (LoadInst *LI = dyn_cast<LoadInst>(I->U->getUser())) { 1756 if (LI->isVolatile() || !LI->getType()->isIntegerTy()) 1757 return false; 1758 if (LI->getType() == Ty) 1759 WholeAllocaOp = true; 1760 } else if (StoreInst *SI = dyn_cast<StoreInst>(I->U->getUser())) { 1761 if (SI->isVolatile() || !SI->getValueOperand()->getType()->isIntegerTy()) 1762 return false; 1763 if (SI->getValueOperand()->getType() == Ty) 1764 WholeAllocaOp = true; 1765 } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I->U->getUser())) { 1766 if (MI->isVolatile()) 1767 return false; 1768 if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(I->U->getUser())) { 1769 const AllocaPartitioning::MemTransferOffsets &MTO 1770 = P.getMemTransferOffsets(*MTI); 1771 if (!MTO.IsSplittable) 1772 return false; 1773 } 1774 } else { 1775 return false; 1776 } 1777 } 1778 return WholeAllocaOp; 1779 } 1780 1781 namespace { 1782 /// \brief Visitor to speculate PHIs and Selects where possible. 1783 class PHIOrSelectSpeculator : public InstVisitor<PHIOrSelectSpeculator> { 1784 // Befriend the base class so it can delegate to private visit methods. 1785 friend class llvm::InstVisitor<PHIOrSelectSpeculator>; 1786 1787 const TargetData &TD; 1788 AllocaPartitioning &P; 1789 SROA &Pass; 1790 1791 public: 1792 PHIOrSelectSpeculator(const TargetData &TD, AllocaPartitioning &P, SROA &Pass) 1793 : TD(TD), P(P), Pass(Pass) {} 1794 1795 /// \brief Visit the users of an alloca partition and rewrite them. 1796 void visitUsers(AllocaPartitioning::const_iterator PI) { 1797 // Note that we need to use an index here as the underlying vector of uses 1798 // may be grown during speculation. However, we never need to re-visit the 1799 // new uses, and so we can use the initial size bound. 1800 for (unsigned Idx = 0, Size = P.use_size(PI); Idx != Size; ++Idx) { 1801 const AllocaPartitioning::PartitionUse &PU = P.getUse(PI, Idx); 1802 if (!PU.U) 1803 continue; // Skip dead use. 1804 1805 visit(cast<Instruction>(PU.U->getUser())); 1806 } 1807 } 1808 1809 private: 1810 // By default, skip this instruction. 1811 void visitInstruction(Instruction &I) {} 1812 1813 /// PHI instructions that use an alloca and are subsequently loaded can be 1814 /// rewritten to load both input pointers in the pred blocks and then PHI the 1815 /// results, allowing the load of the alloca to be promoted. 1816 /// From this: 1817 /// %P2 = phi [i32* %Alloca, i32* %Other] 1818 /// %V = load i32* %P2 1819 /// to: 1820 /// %V1 = load i32* %Alloca -> will be mem2reg'd 1821 /// ... 1822 /// %V2 = load i32* %Other 1823 /// ... 1824 /// %V = phi [i32 %V1, i32 %V2] 1825 /// 1826 /// We can do this to a select if its only uses are loads and if the operands 1827 /// to the select can be loaded unconditionally. 1828 /// 1829 /// FIXME: This should be hoisted into a generic utility, likely in 1830 /// Transforms/Util/Local.h 1831 bool isSafePHIToSpeculate(PHINode &PN, SmallVectorImpl<LoadInst *> &Loads) { 1832 // For now, we can only do this promotion if the load is in the same block 1833 // as the PHI, and if there are no stores between the phi and load. 1834 // TODO: Allow recursive phi users. 1835 // TODO: Allow stores. 1836 BasicBlock *BB = PN.getParent(); 1837 unsigned MaxAlign = 0; 1838 for (Value::use_iterator UI = PN.use_begin(), UE = PN.use_end(); 1839 UI != UE; ++UI) { 1840 LoadInst *LI = dyn_cast<LoadInst>(*UI); 1841 if (LI == 0 || !LI->isSimple()) return false; 1842 1843 // For now we only allow loads in the same block as the PHI. This is 1844 // a common case that happens when instcombine merges two loads through 1845 // a PHI. 1846 if (LI->getParent() != BB) return false; 1847 1848 // Ensure that there are no instructions between the PHI and the load that 1849 // could store. 1850 for (BasicBlock::iterator BBI = &PN; &*BBI != LI; ++BBI) 1851 if (BBI->mayWriteToMemory()) 1852 return false; 1853 1854 MaxAlign = std::max(MaxAlign, LI->getAlignment()); 1855 Loads.push_back(LI); 1856 } 1857 1858 // We can only transform this if it is safe to push the loads into the 1859 // predecessor blocks. The only thing to watch out for is that we can't put 1860 // a possibly trapping load in the predecessor if it is a critical edge. 1861 for (unsigned Idx = 0, Num = PN.getNumIncomingValues(); Idx != Num; 1862 ++Idx) { 1863 TerminatorInst *TI = PN.getIncomingBlock(Idx)->getTerminator(); 1864 Value *InVal = PN.getIncomingValue(Idx); 1865 1866 // If the value is produced by the terminator of the predecessor (an 1867 // invoke) or it has side-effects, there is no valid place to put a load 1868 // in the predecessor. 1869 if (TI == InVal || TI->mayHaveSideEffects()) 1870 return false; 1871 1872 // If the predecessor has a single successor, then the edge isn't 1873 // critical. 1874 if (TI->getNumSuccessors() == 1) 1875 continue; 1876 1877 // If this pointer is always safe to load, or if we can prove that there 1878 // is already a load in the block, then we can move the load to the pred 1879 // block. 1880 if (InVal->isDereferenceablePointer() || 1881 isSafeToLoadUnconditionally(InVal, TI, MaxAlign, &TD)) 1882 continue; 1883 1884 return false; 1885 } 1886 1887 return true; 1888 } 1889 1890 void visitPHINode(PHINode &PN) { 1891 DEBUG(dbgs() << " original: " << PN << "\n"); 1892 1893 SmallVector<LoadInst *, 4> Loads; 1894 if (!isSafePHIToSpeculate(PN, Loads)) 1895 return; 1896 1897 assert(!Loads.empty()); 1898 1899 Type *LoadTy = cast<PointerType>(PN.getType())->getElementType(); 1900 IRBuilder<> PHIBuilder(&PN); 1901 PHINode *NewPN = PHIBuilder.CreatePHI(LoadTy, PN.getNumIncomingValues(), 1902 PN.getName() + ".sroa.speculated"); 1903 1904 // Get the TBAA tag and alignment to use from one of the loads. It doesn't 1905 // matter which one we get and if any differ, it doesn't matter. 1906 LoadInst *SomeLoad = cast<LoadInst>(Loads.back()); 1907 MDNode *TBAATag = SomeLoad->getMetadata(LLVMContext::MD_tbaa); 1908 unsigned Align = SomeLoad->getAlignment(); 1909 1910 // Rewrite all loads of the PN to use the new PHI. 1911 do { 1912 LoadInst *LI = Loads.pop_back_val(); 1913 LI->replaceAllUsesWith(NewPN); 1914 Pass.DeadInsts.push_back(LI); 1915 } while (!Loads.empty()); 1916 1917 // Inject loads into all of the pred blocks. 1918 for (unsigned Idx = 0, Num = PN.getNumIncomingValues(); Idx != Num; ++Idx) { 1919 BasicBlock *Pred = PN.getIncomingBlock(Idx); 1920 TerminatorInst *TI = Pred->getTerminator(); 1921 Use *InUse = &PN.getOperandUse(PN.getOperandNumForIncomingValue(Idx)); 1922 Value *InVal = PN.getIncomingValue(Idx); 1923 IRBuilder<> PredBuilder(TI); 1924 1925 LoadInst *Load 1926 = PredBuilder.CreateLoad(InVal, (PN.getName() + ".sroa.speculate.load." + 1927 Pred->getName())); 1928 ++NumLoadsSpeculated; 1929 Load->setAlignment(Align); 1930 if (TBAATag) 1931 Load->setMetadata(LLVMContext::MD_tbaa, TBAATag); 1932 NewPN->addIncoming(Load, Pred); 1933 1934 Instruction *Ptr = dyn_cast<Instruction>(InVal); 1935 if (!Ptr) 1936 // No uses to rewrite. 1937 continue; 1938 1939 // Try to lookup and rewrite any partition uses corresponding to this phi 1940 // input. 1941 AllocaPartitioning::iterator PI 1942 = P.findPartitionForPHIOrSelectOperand(InUse); 1943 if (PI == P.end()) 1944 continue; 1945 1946 // Replace the Use in the PartitionUse for this operand with the Use 1947 // inside the load. 1948 AllocaPartitioning::use_iterator UI 1949 = P.findPartitionUseForPHIOrSelectOperand(InUse); 1950 assert(isa<PHINode>(*UI->U->getUser())); 1951 UI->U = &Load->getOperandUse(Load->getPointerOperandIndex()); 1952 } 1953 DEBUG(dbgs() << " speculated to: " << *NewPN << "\n"); 1954 } 1955 1956 /// Select instructions that use an alloca and are subsequently loaded can be 1957 /// rewritten to load both input pointers and then select between the result, 1958 /// allowing the load of the alloca to be promoted. 1959 /// From this: 1960 /// %P2 = select i1 %cond, i32* %Alloca, i32* %Other 1961 /// %V = load i32* %P2 1962 /// to: 1963 /// %V1 = load i32* %Alloca -> will be mem2reg'd 1964 /// %V2 = load i32* %Other 1965 /// %V = select i1 %cond, i32 %V1, i32 %V2 1966 /// 1967 /// We can do this to a select if its only uses are loads and if the operand 1968 /// to the select can be loaded unconditionally. 1969 bool isSafeSelectToSpeculate(SelectInst &SI, 1970 SmallVectorImpl<LoadInst *> &Loads) { 1971 Value *TValue = SI.getTrueValue(); 1972 Value *FValue = SI.getFalseValue(); 1973 bool TDerefable = TValue->isDereferenceablePointer(); 1974 bool FDerefable = FValue->isDereferenceablePointer(); 1975 1976 for (Value::use_iterator UI = SI.use_begin(), UE = SI.use_end(); 1977 UI != UE; ++UI) { 1978 LoadInst *LI = dyn_cast<LoadInst>(*UI); 1979 if (LI == 0 || !LI->isSimple()) return false; 1980 1981 // Both operands to the select need to be dereferencable, either 1982 // absolutely (e.g. allocas) or at this point because we can see other 1983 // accesses to it. 1984 if (!TDerefable && !isSafeToLoadUnconditionally(TValue, LI, 1985 LI->getAlignment(), &TD)) 1986 return false; 1987 if (!FDerefable && !isSafeToLoadUnconditionally(FValue, LI, 1988 LI->getAlignment(), &TD)) 1989 return false; 1990 Loads.push_back(LI); 1991 } 1992 1993 return true; 1994 } 1995 1996 void visitSelectInst(SelectInst &SI) { 1997 DEBUG(dbgs() << " original: " << SI << "\n"); 1998 IRBuilder<> IRB(&SI); 1999 2000 // If the select isn't safe to speculate, just use simple logic to emit it. 2001 SmallVector<LoadInst *, 4> Loads; 2002 if (!isSafeSelectToSpeculate(SI, Loads)) 2003 return; 2004 2005 Use *Ops[2] = { &SI.getOperandUse(1), &SI.getOperandUse(2) }; 2006 AllocaPartitioning::iterator PIs[2]; 2007 AllocaPartitioning::PartitionUse PUs[2]; 2008 for (unsigned i = 0, e = 2; i != e; ++i) { 2009 PIs[i] = P.findPartitionForPHIOrSelectOperand(Ops[i]); 2010 if (PIs[i] != P.end()) { 2011 // If the pointer is within the partitioning, remove the select from 2012 // its uses. We'll add in the new loads below. 2013 AllocaPartitioning::use_iterator UI 2014 = P.findPartitionUseForPHIOrSelectOperand(Ops[i]); 2015 PUs[i] = *UI; 2016 // Clear out the use here so that the offsets into the use list remain 2017 // stable but this use is ignored when rewriting. 2018 UI->U = 0; 2019 } 2020 } 2021 2022 Value *TV = SI.getTrueValue(); 2023 Value *FV = SI.getFalseValue(); 2024 // Replace the loads of the select with a select of two loads. 2025 while (!Loads.empty()) { 2026 LoadInst *LI = Loads.pop_back_val(); 2027 2028 IRB.SetInsertPoint(LI); 2029 LoadInst *TL = 2030 IRB.CreateLoad(TV, LI->getName() + ".sroa.speculate.load.true"); 2031 LoadInst *FL = 2032 IRB.CreateLoad(FV, LI->getName() + ".sroa.speculate.load.false"); 2033 NumLoadsSpeculated += 2; 2034 2035 // Transfer alignment and TBAA info if present. 2036 TL->setAlignment(LI->getAlignment()); 2037 FL->setAlignment(LI->getAlignment()); 2038 if (MDNode *Tag = LI->getMetadata(LLVMContext::MD_tbaa)) { 2039 TL->setMetadata(LLVMContext::MD_tbaa, Tag); 2040 FL->setMetadata(LLVMContext::MD_tbaa, Tag); 2041 } 2042 2043 Value *V = IRB.CreateSelect(SI.getCondition(), TL, FL, 2044 LI->getName() + ".sroa.speculated"); 2045 2046 LoadInst *Loads[2] = { TL, FL }; 2047 for (unsigned i = 0, e = 2; i != e; ++i) { 2048 if (PIs[i] != P.end()) { 2049 Use *LoadUse = &Loads[i]->getOperandUse(0); 2050 assert(PUs[i].U->get() == LoadUse->get()); 2051 PUs[i].U = LoadUse; 2052 P.use_push_back(PIs[i], PUs[i]); 2053 } 2054 } 2055 2056 DEBUG(dbgs() << " speculated to: " << *V << "\n"); 2057 LI->replaceAllUsesWith(V); 2058 Pass.DeadInsts.push_back(LI); 2059 } 2060 } 2061 }; 2062 2063 /// \brief Visitor to rewrite instructions using a partition of an alloca to 2064 /// use a new alloca. 2065 /// 2066 /// Also implements the rewriting to vector-based accesses when the partition 2067 /// passes the isVectorPromotionViable predicate. Most of the rewriting logic 2068 /// lives here. 2069 class AllocaPartitionRewriter : public InstVisitor<AllocaPartitionRewriter, 2070 bool> { 2071 // Befriend the base class so it can delegate to private visit methods. 2072 friend class llvm::InstVisitor<AllocaPartitionRewriter, bool>; 2073 2074 const TargetData &TD; 2075 AllocaPartitioning &P; 2076 SROA &Pass; 2077 AllocaInst &OldAI, &NewAI; 2078 const uint64_t NewAllocaBeginOffset, NewAllocaEndOffset; 2079 2080 // If we are rewriting an alloca partition which can be written as pure 2081 // vector operations, we stash extra information here. When VecTy is 2082 // non-null, we have some strict guarantees about the rewriten alloca: 2083 // - The new alloca is exactly the size of the vector type here. 2084 // - The accesses all either map to the entire vector or to a single 2085 // element. 2086 // - The set of accessing instructions is only one of those handled above 2087 // in isVectorPromotionViable. Generally these are the same access kinds 2088 // which are promotable via mem2reg. 2089 VectorType *VecTy; 2090 Type *ElementTy; 2091 uint64_t ElementSize; 2092 2093 // This is a convenience and flag variable that will be null unless the new 2094 // alloca has a promotion-targeted integer type due to passing 2095 // isIntegerPromotionViable above. If it is non-null does, the desired 2096 // integer type will be stored here for easy access during rewriting. 2097 IntegerType *IntPromotionTy; 2098 2099 // The offset of the partition user currently being rewritten. 2100 uint64_t BeginOffset, EndOffset; 2101 Use *OldUse; 2102 Instruction *OldPtr; 2103 2104 // The name prefix to use when rewriting instructions for this alloca. 2105 std::string NamePrefix; 2106 2107 public: 2108 AllocaPartitionRewriter(const TargetData &TD, AllocaPartitioning &P, 2109 AllocaPartitioning::iterator PI, 2110 SROA &Pass, AllocaInst &OldAI, AllocaInst &NewAI, 2111 uint64_t NewBeginOffset, uint64_t NewEndOffset) 2112 : TD(TD), P(P), Pass(Pass), 2113 OldAI(OldAI), NewAI(NewAI), 2114 NewAllocaBeginOffset(NewBeginOffset), 2115 NewAllocaEndOffset(NewEndOffset), 2116 VecTy(), ElementTy(), ElementSize(), IntPromotionTy(), 2117 BeginOffset(), EndOffset() { 2118 } 2119 2120 /// \brief Visit the users of the alloca partition and rewrite them. 2121 bool visitUsers(AllocaPartitioning::const_use_iterator I, 2122 AllocaPartitioning::const_use_iterator E) { 2123 if (isVectorPromotionViable(TD, NewAI.getAllocatedType(), P, 2124 NewAllocaBeginOffset, NewAllocaEndOffset, 2125 I, E)) { 2126 ++NumVectorized; 2127 VecTy = cast<VectorType>(NewAI.getAllocatedType()); 2128 ElementTy = VecTy->getElementType(); 2129 assert((VecTy->getScalarSizeInBits() % 8) == 0 && 2130 "Only multiple-of-8 sized vector elements are viable"); 2131 ElementSize = VecTy->getScalarSizeInBits() / 8; 2132 } else if (isIntegerPromotionViable(TD, NewAI.getAllocatedType(), 2133 P, I, E)) { 2134 IntPromotionTy = cast<IntegerType>(NewAI.getAllocatedType()); 2135 } 2136 bool CanSROA = true; 2137 for (; I != E; ++I) { 2138 if (!I->U) 2139 continue; // Skip dead uses. 2140 BeginOffset = I->BeginOffset; 2141 EndOffset = I->EndOffset; 2142 OldUse = I->U; 2143 OldPtr = cast<Instruction>(I->U->get()); 2144 NamePrefix = (Twine(NewAI.getName()) + "." + Twine(BeginOffset)).str(); 2145 CanSROA &= visit(cast<Instruction>(I->U->getUser())); 2146 } 2147 if (VecTy) { 2148 assert(CanSROA); 2149 VecTy = 0; 2150 ElementTy = 0; 2151 ElementSize = 0; 2152 } 2153 return CanSROA; 2154 } 2155 2156 private: 2157 // Every instruction which can end up as a user must have a rewrite rule. 2158 bool visitInstruction(Instruction &I) { 2159 DEBUG(dbgs() << " !!!! Cannot rewrite: " << I << "\n"); 2160 llvm_unreachable("No rewrite rule for this instruction!"); 2161 } 2162 2163 Twine getName(const Twine &Suffix) { 2164 return NamePrefix + Suffix; 2165 } 2166 2167 Value *getAdjustedAllocaPtr(IRBuilder<> &IRB, Type *PointerTy) { 2168 assert(BeginOffset >= NewAllocaBeginOffset); 2169 APInt Offset(TD.getPointerSizeInBits(), BeginOffset - NewAllocaBeginOffset); 2170 return getAdjustedPtr(IRB, TD, &NewAI, Offset, PointerTy, getName("")); 2171 } 2172 2173 /// \brief Compute suitable alignment to access an offset into the new alloca. 2174 unsigned getOffsetAlign(uint64_t Offset) { 2175 unsigned NewAIAlign = NewAI.getAlignment(); 2176 if (!NewAIAlign) 2177 NewAIAlign = TD.getABITypeAlignment(NewAI.getAllocatedType()); 2178 return MinAlign(NewAIAlign, Offset); 2179 } 2180 2181 /// \brief Compute suitable alignment to access this partition of the new 2182 /// alloca. 2183 unsigned getPartitionAlign() { 2184 return getOffsetAlign(BeginOffset - NewAllocaBeginOffset); 2185 } 2186 2187 /// \brief Compute suitable alignment to access a type at an offset of the 2188 /// new alloca. 2189 /// 2190 /// \returns zero if the type's ABI alignment is a suitable alignment, 2191 /// otherwise returns the maximal suitable alignment. 2192 unsigned getOffsetTypeAlign(Type *Ty, uint64_t Offset) { 2193 unsigned Align = getOffsetAlign(Offset); 2194 return Align == TD.getABITypeAlignment(Ty) ? 0 : Align; 2195 } 2196 2197 /// \brief Compute suitable alignment to access a type at the beginning of 2198 /// this partition of the new alloca. 2199 /// 2200 /// See \c getOffsetTypeAlign for details; this routine delegates to it. 2201 unsigned getPartitionTypeAlign(Type *Ty) { 2202 return getOffsetTypeAlign(Ty, BeginOffset - NewAllocaBeginOffset); 2203 } 2204 2205 ConstantInt *getIndex(IRBuilder<> &IRB, uint64_t Offset) { 2206 assert(VecTy && "Can only call getIndex when rewriting a vector"); 2207 uint64_t RelOffset = Offset - NewAllocaBeginOffset; 2208 assert(RelOffset / ElementSize < UINT32_MAX && "Index out of bounds"); 2209 uint32_t Index = RelOffset / ElementSize; 2210 assert(Index * ElementSize == RelOffset); 2211 return IRB.getInt32(Index); 2212 } 2213 2214 Value *extractInteger(IRBuilder<> &IRB, IntegerType *TargetTy, 2215 uint64_t Offset) { 2216 assert(IntPromotionTy && "Alloca is not an integer we can extract from"); 2217 Value *V = IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(), 2218 getName(".load")); 2219 assert(Offset >= NewAllocaBeginOffset && "Out of bounds offset"); 2220 uint64_t RelOffset = Offset - NewAllocaBeginOffset; 2221 if (RelOffset) 2222 V = IRB.CreateLShr(V, RelOffset*8, getName(".shift")); 2223 if (TargetTy != IntPromotionTy) { 2224 assert(TargetTy->getBitWidth() < IntPromotionTy->getBitWidth() && 2225 "Cannot extract to a larger integer!"); 2226 V = IRB.CreateTrunc(V, TargetTy, getName(".trunc")); 2227 } 2228 return V; 2229 } 2230 2231 StoreInst *insertInteger(IRBuilder<> &IRB, Value *V, uint64_t Offset) { 2232 IntegerType *Ty = cast<IntegerType>(V->getType()); 2233 if (Ty == IntPromotionTy) 2234 return IRB.CreateAlignedStore(V, &NewAI, NewAI.getAlignment()); 2235 2236 assert(Ty->getBitWidth() < IntPromotionTy->getBitWidth() && 2237 "Cannot insert a larger integer!"); 2238 V = IRB.CreateZExt(V, IntPromotionTy, getName(".ext")); 2239 assert(Offset >= NewAllocaBeginOffset && "Out of bounds offset"); 2240 uint64_t RelOffset = Offset - NewAllocaBeginOffset; 2241 if (RelOffset) 2242 V = IRB.CreateShl(V, RelOffset*8, getName(".shift")); 2243 2244 APInt Mask = ~Ty->getMask().zext(IntPromotionTy->getBitWidth()) 2245 .shl(RelOffset*8); 2246 Value *Old = IRB.CreateAnd(IRB.CreateAlignedLoad(&NewAI, 2247 NewAI.getAlignment(), 2248 getName(".oldload")), 2249 Mask, getName(".mask")); 2250 return IRB.CreateAlignedStore(IRB.CreateOr(Old, V, getName(".insert")), 2251 &NewAI, NewAI.getAlignment()); 2252 } 2253 2254 void deleteIfTriviallyDead(Value *V) { 2255 Instruction *I = cast<Instruction>(V); 2256 if (isInstructionTriviallyDead(I)) 2257 Pass.DeadInsts.push_back(I); 2258 } 2259 2260 Value *getValueCast(IRBuilder<> &IRB, Value *V, Type *Ty) { 2261 if (V->getType()->isIntegerTy() && Ty->isPointerTy()) 2262 return IRB.CreateIntToPtr(V, Ty); 2263 if (V->getType()->isPointerTy() && Ty->isIntegerTy()) 2264 return IRB.CreatePtrToInt(V, Ty); 2265 2266 return IRB.CreateBitCast(V, Ty); 2267 } 2268 2269 bool rewriteVectorizedLoadInst(IRBuilder<> &IRB, LoadInst &LI, Value *OldOp) { 2270 Value *Result; 2271 if (LI.getType() == VecTy->getElementType() || 2272 BeginOffset > NewAllocaBeginOffset || EndOffset < NewAllocaEndOffset) { 2273 Result = IRB.CreateExtractElement( 2274 IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(), getName(".load")), 2275 getIndex(IRB, BeginOffset), getName(".extract")); 2276 } else { 2277 Result = IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(), 2278 getName(".load")); 2279 } 2280 if (Result->getType() != LI.getType()) 2281 Result = getValueCast(IRB, Result, LI.getType()); 2282 LI.replaceAllUsesWith(Result); 2283 Pass.DeadInsts.push_back(&LI); 2284 2285 DEBUG(dbgs() << " to: " << *Result << "\n"); 2286 return true; 2287 } 2288 2289 bool rewriteIntegerLoad(IRBuilder<> &IRB, LoadInst &LI) { 2290 assert(!LI.isVolatile()); 2291 Value *Result = extractInteger(IRB, cast<IntegerType>(LI.getType()), 2292 BeginOffset); 2293 LI.replaceAllUsesWith(Result); 2294 Pass.DeadInsts.push_back(&LI); 2295 DEBUG(dbgs() << " to: " << *Result << "\n"); 2296 return true; 2297 } 2298 2299 bool visitLoadInst(LoadInst &LI) { 2300 DEBUG(dbgs() << " original: " << LI << "\n"); 2301 Value *OldOp = LI.getOperand(0); 2302 assert(OldOp == OldPtr); 2303 IRBuilder<> IRB(&LI); 2304 2305 if (VecTy) 2306 return rewriteVectorizedLoadInst(IRB, LI, OldOp); 2307 if (IntPromotionTy) 2308 return rewriteIntegerLoad(IRB, LI); 2309 2310 Value *NewPtr = getAdjustedAllocaPtr(IRB, 2311 LI.getPointerOperand()->getType()); 2312 LI.setOperand(0, NewPtr); 2313 LI.setAlignment(getPartitionTypeAlign(LI.getType())); 2314 DEBUG(dbgs() << " to: " << LI << "\n"); 2315 2316 deleteIfTriviallyDead(OldOp); 2317 return NewPtr == &NewAI && !LI.isVolatile(); 2318 } 2319 2320 bool rewriteVectorizedStoreInst(IRBuilder<> &IRB, StoreInst &SI, 2321 Value *OldOp) { 2322 Value *V = SI.getValueOperand(); 2323 if (V->getType() == ElementTy || 2324 BeginOffset > NewAllocaBeginOffset || EndOffset < NewAllocaEndOffset) { 2325 if (V->getType() != ElementTy) 2326 V = getValueCast(IRB, V, ElementTy); 2327 LoadInst *LI = IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(), 2328 getName(".load")); 2329 V = IRB.CreateInsertElement(LI, V, getIndex(IRB, BeginOffset), 2330 getName(".insert")); 2331 } else if (V->getType() != VecTy) { 2332 V = getValueCast(IRB, V, VecTy); 2333 } 2334 StoreInst *Store = IRB.CreateAlignedStore(V, &NewAI, NewAI.getAlignment()); 2335 Pass.DeadInsts.push_back(&SI); 2336 2337 (void)Store; 2338 DEBUG(dbgs() << " to: " << *Store << "\n"); 2339 return true; 2340 } 2341 2342 bool rewriteIntegerStore(IRBuilder<> &IRB, StoreInst &SI) { 2343 assert(!SI.isVolatile()); 2344 StoreInst *Store = insertInteger(IRB, SI.getValueOperand(), BeginOffset); 2345 Pass.DeadInsts.push_back(&SI); 2346 (void)Store; 2347 DEBUG(dbgs() << " to: " << *Store << "\n"); 2348 return true; 2349 } 2350 2351 bool visitStoreInst(StoreInst &SI) { 2352 DEBUG(dbgs() << " original: " << SI << "\n"); 2353 Value *OldOp = SI.getOperand(1); 2354 assert(OldOp == OldPtr); 2355 IRBuilder<> IRB(&SI); 2356 2357 if (VecTy) 2358 return rewriteVectorizedStoreInst(IRB, SI, OldOp); 2359 if (IntPromotionTy) 2360 return rewriteIntegerStore(IRB, SI); 2361 2362 Value *NewPtr = getAdjustedAllocaPtr(IRB, 2363 SI.getPointerOperand()->getType()); 2364 SI.setOperand(1, NewPtr); 2365 SI.setAlignment(getPartitionTypeAlign(SI.getValueOperand()->getType())); 2366 DEBUG(dbgs() << " to: " << SI << "\n"); 2367 2368 deleteIfTriviallyDead(OldOp); 2369 return NewPtr == &NewAI && !SI.isVolatile(); 2370 } 2371 2372 bool visitMemSetInst(MemSetInst &II) { 2373 DEBUG(dbgs() << " original: " << II << "\n"); 2374 IRBuilder<> IRB(&II); 2375 assert(II.getRawDest() == OldPtr); 2376 2377 // If the memset has a variable size, it cannot be split, just adjust the 2378 // pointer to the new alloca. 2379 if (!isa<Constant>(II.getLength())) { 2380 II.setDest(getAdjustedAllocaPtr(IRB, II.getRawDest()->getType())); 2381 Type *CstTy = II.getAlignmentCst()->getType(); 2382 II.setAlignment(ConstantInt::get(CstTy, getPartitionAlign())); 2383 2384 deleteIfTriviallyDead(OldPtr); 2385 return false; 2386 } 2387 2388 // Record this instruction for deletion. 2389 if (Pass.DeadSplitInsts.insert(&II)) 2390 Pass.DeadInsts.push_back(&II); 2391 2392 Type *AllocaTy = NewAI.getAllocatedType(); 2393 Type *ScalarTy = AllocaTy->getScalarType(); 2394 2395 // If this doesn't map cleanly onto the alloca type, and that type isn't 2396 // a single value type, just emit a memset. 2397 if (!VecTy && (BeginOffset != NewAllocaBeginOffset || 2398 EndOffset != NewAllocaEndOffset || 2399 !AllocaTy->isSingleValueType() || 2400 !TD.isLegalInteger(TD.getTypeSizeInBits(ScalarTy)))) { 2401 Type *SizeTy = II.getLength()->getType(); 2402 Constant *Size = ConstantInt::get(SizeTy, EndOffset - BeginOffset); 2403 CallInst *New 2404 = IRB.CreateMemSet(getAdjustedAllocaPtr(IRB, 2405 II.getRawDest()->getType()), 2406 II.getValue(), Size, getPartitionAlign(), 2407 II.isVolatile()); 2408 (void)New; 2409 DEBUG(dbgs() << " to: " << *New << "\n"); 2410 return false; 2411 } 2412 2413 // If we can represent this as a simple value, we have to build the actual 2414 // value to store, which requires expanding the byte present in memset to 2415 // a sensible representation for the alloca type. This is essentially 2416 // splatting the byte to a sufficiently wide integer, bitcasting to the 2417 // desired scalar type, and splatting it across any desired vector type. 2418 Value *V = II.getValue(); 2419 IntegerType *VTy = cast<IntegerType>(V->getType()); 2420 Type *IntTy = Type::getIntNTy(VTy->getContext(), 2421 TD.getTypeSizeInBits(ScalarTy)); 2422 if (TD.getTypeSizeInBits(ScalarTy) > VTy->getBitWidth()) 2423 V = IRB.CreateMul(IRB.CreateZExt(V, IntTy, getName(".zext")), 2424 ConstantExpr::getUDiv( 2425 Constant::getAllOnesValue(IntTy), 2426 ConstantExpr::getZExt( 2427 Constant::getAllOnesValue(V->getType()), 2428 IntTy)), 2429 getName(".isplat")); 2430 if (V->getType() != ScalarTy) { 2431 if (ScalarTy->isPointerTy()) 2432 V = IRB.CreateIntToPtr(V, ScalarTy); 2433 else if (ScalarTy->isPrimitiveType() || ScalarTy->isVectorTy()) 2434 V = IRB.CreateBitCast(V, ScalarTy); 2435 else if (ScalarTy->isIntegerTy()) 2436 llvm_unreachable("Computed different integer types with equal widths"); 2437 else 2438 llvm_unreachable("Invalid scalar type"); 2439 } 2440 2441 // If this is an element-wide memset of a vectorizable alloca, insert it. 2442 if (VecTy && (BeginOffset > NewAllocaBeginOffset || 2443 EndOffset < NewAllocaEndOffset)) { 2444 StoreInst *Store = IRB.CreateAlignedStore( 2445 IRB.CreateInsertElement(IRB.CreateAlignedLoad(&NewAI, 2446 NewAI.getAlignment(), 2447 getName(".load")), 2448 V, getIndex(IRB, BeginOffset), 2449 getName(".insert")), 2450 &NewAI, NewAI.getAlignment()); 2451 (void)Store; 2452 DEBUG(dbgs() << " to: " << *Store << "\n"); 2453 return true; 2454 } 2455 2456 // Splat to a vector if needed. 2457 if (VectorType *VecTy = dyn_cast<VectorType>(AllocaTy)) { 2458 VectorType *SplatSourceTy = VectorType::get(V->getType(), 1); 2459 V = IRB.CreateShuffleVector( 2460 IRB.CreateInsertElement(UndefValue::get(SplatSourceTy), V, 2461 IRB.getInt32(0), getName(".vsplat.insert")), 2462 UndefValue::get(SplatSourceTy), 2463 ConstantVector::getSplat(VecTy->getNumElements(), IRB.getInt32(0)), 2464 getName(".vsplat.shuffle")); 2465 assert(V->getType() == VecTy); 2466 } 2467 2468 Value *New = IRB.CreateAlignedStore(V, &NewAI, NewAI.getAlignment(), 2469 II.isVolatile()); 2470 (void)New; 2471 DEBUG(dbgs() << " to: " << *New << "\n"); 2472 return !II.isVolatile(); 2473 } 2474 2475 bool visitMemTransferInst(MemTransferInst &II) { 2476 // Rewriting of memory transfer instructions can be a bit tricky. We break 2477 // them into two categories: split intrinsics and unsplit intrinsics. 2478 2479 DEBUG(dbgs() << " original: " << II << "\n"); 2480 IRBuilder<> IRB(&II); 2481 2482 assert(II.getRawSource() == OldPtr || II.getRawDest() == OldPtr); 2483 bool IsDest = II.getRawDest() == OldPtr; 2484 2485 const AllocaPartitioning::MemTransferOffsets &MTO 2486 = P.getMemTransferOffsets(II); 2487 2488 // Compute the relative offset within the transfer. 2489 unsigned IntPtrWidth = TD.getPointerSizeInBits(); 2490 APInt RelOffset(IntPtrWidth, BeginOffset - (IsDest ? MTO.DestBegin 2491 : MTO.SourceBegin)); 2492 2493 unsigned Align = II.getAlignment(); 2494 if (Align > 1) 2495 Align = MinAlign(RelOffset.zextOrTrunc(64).getZExtValue(), 2496 MinAlign(II.getAlignment(), getPartitionAlign())); 2497 2498 // For unsplit intrinsics, we simply modify the source and destination 2499 // pointers in place. This isn't just an optimization, it is a matter of 2500 // correctness. With unsplit intrinsics we may be dealing with transfers 2501 // within a single alloca before SROA ran, or with transfers that have 2502 // a variable length. We may also be dealing with memmove instead of 2503 // memcpy, and so simply updating the pointers is the necessary for us to 2504 // update both source and dest of a single call. 2505 if (!MTO.IsSplittable) { 2506 Value *OldOp = IsDest ? II.getRawDest() : II.getRawSource(); 2507 if (IsDest) 2508 II.setDest(getAdjustedAllocaPtr(IRB, II.getRawDest()->getType())); 2509 else 2510 II.setSource(getAdjustedAllocaPtr(IRB, II.getRawSource()->getType())); 2511 2512 Type *CstTy = II.getAlignmentCst()->getType(); 2513 II.setAlignment(ConstantInt::get(CstTy, Align)); 2514 2515 DEBUG(dbgs() << " to: " << II << "\n"); 2516 deleteIfTriviallyDead(OldOp); 2517 return false; 2518 } 2519 // For split transfer intrinsics we have an incredibly useful assurance: 2520 // the source and destination do not reside within the same alloca, and at 2521 // least one of them does not escape. This means that we can replace 2522 // memmove with memcpy, and we don't need to worry about all manner of 2523 // downsides to splitting and transforming the operations. 2524 2525 // If this doesn't map cleanly onto the alloca type, and that type isn't 2526 // a single value type, just emit a memcpy. 2527 bool EmitMemCpy 2528 = !VecTy && (BeginOffset != NewAllocaBeginOffset || 2529 EndOffset != NewAllocaEndOffset || 2530 !NewAI.getAllocatedType()->isSingleValueType()); 2531 2532 // If we're just going to emit a memcpy, the alloca hasn't changed, and the 2533 // size hasn't been shrunk based on analysis of the viable range, this is 2534 // a no-op. 2535 if (EmitMemCpy && &OldAI == &NewAI) { 2536 uint64_t OrigBegin = IsDest ? MTO.DestBegin : MTO.SourceBegin; 2537 uint64_t OrigEnd = IsDest ? MTO.DestEnd : MTO.SourceEnd; 2538 // Ensure the start lines up. 2539 assert(BeginOffset == OrigBegin); 2540 (void)OrigBegin; 2541 2542 // Rewrite the size as needed. 2543 if (EndOffset != OrigEnd) 2544 II.setLength(ConstantInt::get(II.getLength()->getType(), 2545 EndOffset - BeginOffset)); 2546 return false; 2547 } 2548 // Record this instruction for deletion. 2549 if (Pass.DeadSplitInsts.insert(&II)) 2550 Pass.DeadInsts.push_back(&II); 2551 2552 bool IsVectorElement = VecTy && (BeginOffset > NewAllocaBeginOffset || 2553 EndOffset < NewAllocaEndOffset); 2554 2555 Type *OtherPtrTy = IsDest ? II.getRawSource()->getType() 2556 : II.getRawDest()->getType(); 2557 if (!EmitMemCpy) 2558 OtherPtrTy = IsVectorElement ? VecTy->getElementType()->getPointerTo() 2559 : NewAI.getType(); 2560 2561 // Compute the other pointer, folding as much as possible to produce 2562 // a single, simple GEP in most cases. 2563 Value *OtherPtr = IsDest ? II.getRawSource() : II.getRawDest(); 2564 OtherPtr = getAdjustedPtr(IRB, TD, OtherPtr, RelOffset, OtherPtrTy, 2565 getName("." + OtherPtr->getName())); 2566 2567 // Strip all inbounds GEPs and pointer casts to try to dig out any root 2568 // alloca that should be re-examined after rewriting this instruction. 2569 if (AllocaInst *AI 2570 = dyn_cast<AllocaInst>(OtherPtr->stripInBoundsOffsets())) 2571 Pass.Worklist.insert(AI); 2572 2573 if (EmitMemCpy) { 2574 Value *OurPtr 2575 = getAdjustedAllocaPtr(IRB, IsDest ? II.getRawDest()->getType() 2576 : II.getRawSource()->getType()); 2577 Type *SizeTy = II.getLength()->getType(); 2578 Constant *Size = ConstantInt::get(SizeTy, EndOffset - BeginOffset); 2579 2580 CallInst *New = IRB.CreateMemCpy(IsDest ? OurPtr : OtherPtr, 2581 IsDest ? OtherPtr : OurPtr, 2582 Size, Align, II.isVolatile()); 2583 (void)New; 2584 DEBUG(dbgs() << " to: " << *New << "\n"); 2585 return false; 2586 } 2587 2588 // Note that we clamp the alignment to 1 here as a 0 alignment for a memcpy 2589 // is equivalent to 1, but that isn't true if we end up rewriting this as 2590 // a load or store. 2591 if (!Align) 2592 Align = 1; 2593 2594 Value *SrcPtr = OtherPtr; 2595 Value *DstPtr = &NewAI; 2596 if (!IsDest) 2597 std::swap(SrcPtr, DstPtr); 2598 2599 Value *Src; 2600 if (IsVectorElement && !IsDest) { 2601 // We have to extract rather than load. 2602 Src = IRB.CreateExtractElement( 2603 IRB.CreateAlignedLoad(SrcPtr, Align, getName(".copyload")), 2604 getIndex(IRB, BeginOffset), 2605 getName(".copyextract")); 2606 } else { 2607 Src = IRB.CreateAlignedLoad(SrcPtr, Align, II.isVolatile(), 2608 getName(".copyload")); 2609 } 2610 2611 if (IsVectorElement && IsDest) { 2612 // We have to insert into a loaded copy before storing. 2613 Src = IRB.CreateInsertElement( 2614 IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(), getName(".load")), 2615 Src, getIndex(IRB, BeginOffset), 2616 getName(".insert")); 2617 } 2618 2619 StoreInst *Store = cast<StoreInst>( 2620 IRB.CreateAlignedStore(Src, DstPtr, Align, II.isVolatile())); 2621 (void)Store; 2622 DEBUG(dbgs() << " to: " << *Store << "\n"); 2623 return !II.isVolatile(); 2624 } 2625 2626 bool visitIntrinsicInst(IntrinsicInst &II) { 2627 assert(II.getIntrinsicID() == Intrinsic::lifetime_start || 2628 II.getIntrinsicID() == Intrinsic::lifetime_end); 2629 DEBUG(dbgs() << " original: " << II << "\n"); 2630 IRBuilder<> IRB(&II); 2631 assert(II.getArgOperand(1) == OldPtr); 2632 2633 // Record this instruction for deletion. 2634 if (Pass.DeadSplitInsts.insert(&II)) 2635 Pass.DeadInsts.push_back(&II); 2636 2637 ConstantInt *Size 2638 = ConstantInt::get(cast<IntegerType>(II.getArgOperand(0)->getType()), 2639 EndOffset - BeginOffset); 2640 Value *Ptr = getAdjustedAllocaPtr(IRB, II.getArgOperand(1)->getType()); 2641 Value *New; 2642 if (II.getIntrinsicID() == Intrinsic::lifetime_start) 2643 New = IRB.CreateLifetimeStart(Ptr, Size); 2644 else 2645 New = IRB.CreateLifetimeEnd(Ptr, Size); 2646 2647 DEBUG(dbgs() << " to: " << *New << "\n"); 2648 return true; 2649 } 2650 2651 bool visitPHINode(PHINode &PN) { 2652 DEBUG(dbgs() << " original: " << PN << "\n"); 2653 2654 // We would like to compute a new pointer in only one place, but have it be 2655 // as local as possible to the PHI. To do that, we re-use the location of 2656 // the old pointer, which necessarily must be in the right position to 2657 // dominate the PHI. 2658 IRBuilder<> PtrBuilder(cast<Instruction>(OldPtr)); 2659 2660 Value *NewPtr = getAdjustedAllocaPtr(PtrBuilder, OldPtr->getType()); 2661 // Replace the operands which were using the old pointer. 2662 User::op_iterator OI = PN.op_begin(), OE = PN.op_end(); 2663 for (; OI != OE; ++OI) 2664 if (*OI == OldPtr) 2665 *OI = NewPtr; 2666 2667 DEBUG(dbgs() << " to: " << PN << "\n"); 2668 deleteIfTriviallyDead(OldPtr); 2669 return false; 2670 } 2671 2672 bool visitSelectInst(SelectInst &SI) { 2673 DEBUG(dbgs() << " original: " << SI << "\n"); 2674 IRBuilder<> IRB(&SI); 2675 2676 // Find the operand we need to rewrite here. 2677 bool IsTrueVal = SI.getTrueValue() == OldPtr; 2678 if (IsTrueVal) 2679 assert(SI.getFalseValue() != OldPtr && "Pointer is both operands!"); 2680 else 2681 assert(SI.getFalseValue() == OldPtr && "Pointer isn't an operand!"); 2682 2683 Value *NewPtr = getAdjustedAllocaPtr(IRB, OldPtr->getType()); 2684 SI.setOperand(IsTrueVal ? 1 : 2, NewPtr); 2685 DEBUG(dbgs() << " to: " << SI << "\n"); 2686 deleteIfTriviallyDead(OldPtr); 2687 return false; 2688 } 2689 2690 }; 2691 } 2692 2693 namespace { 2694 /// \brief Visitor to rewrite aggregate loads and stores as scalar. 2695 /// 2696 /// This pass aggressively rewrites all aggregate loads and stores on 2697 /// a particular pointer (or any pointer derived from it which we can identify) 2698 /// with scalar loads and stores. 2699 class AggLoadStoreRewriter : public InstVisitor<AggLoadStoreRewriter, bool> { 2700 // Befriend the base class so it can delegate to private visit methods. 2701 friend class llvm::InstVisitor<AggLoadStoreRewriter, bool>; 2702 2703 const TargetData &TD; 2704 2705 /// Queue of pointer uses to analyze and potentially rewrite. 2706 SmallVector<Use *, 8> Queue; 2707 2708 /// Set to prevent us from cycling with phi nodes and loops. 2709 SmallPtrSet<User *, 8> Visited; 2710 2711 /// The current pointer use being rewritten. This is used to dig up the used 2712 /// value (as opposed to the user). 2713 Use *U; 2714 2715 public: 2716 AggLoadStoreRewriter(const TargetData &TD) : TD(TD) {} 2717 2718 /// Rewrite loads and stores through a pointer and all pointers derived from 2719 /// it. 2720 bool rewrite(Instruction &I) { 2721 DEBUG(dbgs() << " Rewriting FCA loads and stores...\n"); 2722 enqueueUsers(I); 2723 bool Changed = false; 2724 while (!Queue.empty()) { 2725 U = Queue.pop_back_val(); 2726 Changed |= visit(cast<Instruction>(U->getUser())); 2727 } 2728 return Changed; 2729 } 2730 2731 private: 2732 /// Enqueue all the users of the given instruction for further processing. 2733 /// This uses a set to de-duplicate users. 2734 void enqueueUsers(Instruction &I) { 2735 for (Value::use_iterator UI = I.use_begin(), UE = I.use_end(); UI != UE; 2736 ++UI) 2737 if (Visited.insert(*UI)) 2738 Queue.push_back(&UI.getUse()); 2739 } 2740 2741 // Conservative default is to not rewrite anything. 2742 bool visitInstruction(Instruction &I) { return false; } 2743 2744 /// \brief Generic recursive split emission class. 2745 template <typename Derived> 2746 class OpSplitter { 2747 protected: 2748 /// The builder used to form new instructions. 2749 IRBuilder<> IRB; 2750 /// The indices which to be used with insert- or extractvalue to select the 2751 /// appropriate value within the aggregate. 2752 SmallVector<unsigned, 4> Indices; 2753 /// The indices to a GEP instruction which will move Ptr to the correct slot 2754 /// within the aggregate. 2755 SmallVector<Value *, 4> GEPIndices; 2756 /// The base pointer of the original op, used as a base for GEPing the 2757 /// split operations. 2758 Value *Ptr; 2759 2760 /// Initialize the splitter with an insertion point, Ptr and start with a 2761 /// single zero GEP index. 2762 OpSplitter(Instruction *InsertionPoint, Value *Ptr) 2763 : IRB(InsertionPoint), GEPIndices(1, IRB.getInt32(0)), Ptr(Ptr) {} 2764 2765 public: 2766 /// \brief Generic recursive split emission routine. 2767 /// 2768 /// This method recursively splits an aggregate op (load or store) into 2769 /// scalar or vector ops. It splits recursively until it hits a single value 2770 /// and emits that single value operation via the template argument. 2771 /// 2772 /// The logic of this routine relies on GEPs and insertvalue and 2773 /// extractvalue all operating with the same fundamental index list, merely 2774 /// formatted differently (GEPs need actual values). 2775 /// 2776 /// \param Ty The type being split recursively into smaller ops. 2777 /// \param Agg The aggregate value being built up or stored, depending on 2778 /// whether this is splitting a load or a store respectively. 2779 void emitSplitOps(Type *Ty, Value *&Agg, const Twine &Name) { 2780 if (Ty->isSingleValueType()) 2781 return static_cast<Derived *>(this)->emitFunc(Ty, Agg, Name); 2782 2783 if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { 2784 unsigned OldSize = Indices.size(); 2785 (void)OldSize; 2786 for (unsigned Idx = 0, Size = ATy->getNumElements(); Idx != Size; 2787 ++Idx) { 2788 assert(Indices.size() == OldSize && "Did not return to the old size"); 2789 Indices.push_back(Idx); 2790 GEPIndices.push_back(IRB.getInt32(Idx)); 2791 emitSplitOps(ATy->getElementType(), Agg, Name + "." + Twine(Idx)); 2792 GEPIndices.pop_back(); 2793 Indices.pop_back(); 2794 } 2795 return; 2796 } 2797 2798 if (StructType *STy = dyn_cast<StructType>(Ty)) { 2799 unsigned OldSize = Indices.size(); 2800 (void)OldSize; 2801 for (unsigned Idx = 0, Size = STy->getNumElements(); Idx != Size; 2802 ++Idx) { 2803 assert(Indices.size() == OldSize && "Did not return to the old size"); 2804 Indices.push_back(Idx); 2805 GEPIndices.push_back(IRB.getInt32(Idx)); 2806 emitSplitOps(STy->getElementType(Idx), Agg, Name + "." + Twine(Idx)); 2807 GEPIndices.pop_back(); 2808 Indices.pop_back(); 2809 } 2810 return; 2811 } 2812 2813 llvm_unreachable("Only arrays and structs are aggregate loadable types"); 2814 } 2815 }; 2816 2817 struct LoadOpSplitter : public OpSplitter<LoadOpSplitter> { 2818 LoadOpSplitter(Instruction *InsertionPoint, Value *Ptr) 2819 : OpSplitter<LoadOpSplitter>(InsertionPoint, Ptr) {} 2820 2821 /// Emit a leaf load of a single value. This is called at the leaves of the 2822 /// recursive emission to actually load values. 2823 void emitFunc(Type *Ty, Value *&Agg, const Twine &Name) { 2824 assert(Ty->isSingleValueType()); 2825 // Load the single value and insert it using the indices. 2826 Value *Load = IRB.CreateLoad(IRB.CreateInBoundsGEP(Ptr, GEPIndices, 2827 Name + ".gep"), 2828 Name + ".load"); 2829 Agg = IRB.CreateInsertValue(Agg, Load, Indices, Name + ".insert"); 2830 DEBUG(dbgs() << " to: " << *Load << "\n"); 2831 } 2832 }; 2833 2834 bool visitLoadInst(LoadInst &LI) { 2835 assert(LI.getPointerOperand() == *U); 2836 if (!LI.isSimple() || LI.getType()->isSingleValueType()) 2837 return false; 2838 2839 // We have an aggregate being loaded, split it apart. 2840 DEBUG(dbgs() << " original: " << LI << "\n"); 2841 LoadOpSplitter Splitter(&LI, *U); 2842 Value *V = UndefValue::get(LI.getType()); 2843 Splitter.emitSplitOps(LI.getType(), V, LI.getName() + ".fca"); 2844 LI.replaceAllUsesWith(V); 2845 LI.eraseFromParent(); 2846 return true; 2847 } 2848 2849 struct StoreOpSplitter : public OpSplitter<StoreOpSplitter> { 2850 StoreOpSplitter(Instruction *InsertionPoint, Value *Ptr) 2851 : OpSplitter<StoreOpSplitter>(InsertionPoint, Ptr) {} 2852 2853 /// Emit a leaf store of a single value. This is called at the leaves of the 2854 /// recursive emission to actually produce stores. 2855 void emitFunc(Type *Ty, Value *&Agg, const Twine &Name) { 2856 assert(Ty->isSingleValueType()); 2857 // Extract the single value and store it using the indices. 2858 Value *Store = IRB.CreateStore( 2859 IRB.CreateExtractValue(Agg, Indices, Name + ".extract"), 2860 IRB.CreateInBoundsGEP(Ptr, GEPIndices, Name + ".gep")); 2861 (void)Store; 2862 DEBUG(dbgs() << " to: " << *Store << "\n"); 2863 } 2864 }; 2865 2866 bool visitStoreInst(StoreInst &SI) { 2867 if (!SI.isSimple() || SI.getPointerOperand() != *U) 2868 return false; 2869 Value *V = SI.getValueOperand(); 2870 if (V->getType()->isSingleValueType()) 2871 return false; 2872 2873 // We have an aggregate being stored, split it apart. 2874 DEBUG(dbgs() << " original: " << SI << "\n"); 2875 StoreOpSplitter Splitter(&SI, *U); 2876 Splitter.emitSplitOps(V->getType(), V, V->getName() + ".fca"); 2877 SI.eraseFromParent(); 2878 return true; 2879 } 2880 2881 bool visitBitCastInst(BitCastInst &BC) { 2882 enqueueUsers(BC); 2883 return false; 2884 } 2885 2886 bool visitGetElementPtrInst(GetElementPtrInst &GEPI) { 2887 enqueueUsers(GEPI); 2888 return false; 2889 } 2890 2891 bool visitPHINode(PHINode &PN) { 2892 enqueueUsers(PN); 2893 return false; 2894 } 2895 2896 bool visitSelectInst(SelectInst &SI) { 2897 enqueueUsers(SI); 2898 return false; 2899 } 2900 }; 2901 } 2902 2903 /// \brief Try to find a partition of the aggregate type passed in for a given 2904 /// offset and size. 2905 /// 2906 /// This recurses through the aggregate type and tries to compute a subtype 2907 /// based on the offset and size. When the offset and size span a sub-section 2908 /// of an array, it will even compute a new array type for that sub-section, 2909 /// and the same for structs. 2910 /// 2911 /// Note that this routine is very strict and tries to find a partition of the 2912 /// type which produces the *exact* right offset and size. It is not forgiving 2913 /// when the size or offset cause either end of type-based partition to be off. 2914 /// Also, this is a best-effort routine. It is reasonable to give up and not 2915 /// return a type if necessary. 2916 static Type *getTypePartition(const TargetData &TD, Type *Ty, 2917 uint64_t Offset, uint64_t Size) { 2918 if (Offset == 0 && TD.getTypeAllocSize(Ty) == Size) 2919 return Ty; 2920 2921 if (SequentialType *SeqTy = dyn_cast<SequentialType>(Ty)) { 2922 // We can't partition pointers... 2923 if (SeqTy->isPointerTy()) 2924 return 0; 2925 2926 Type *ElementTy = SeqTy->getElementType(); 2927 uint64_t ElementSize = TD.getTypeAllocSize(ElementTy); 2928 uint64_t NumSkippedElements = Offset / ElementSize; 2929 if (ArrayType *ArrTy = dyn_cast<ArrayType>(SeqTy)) 2930 if (NumSkippedElements >= ArrTy->getNumElements()) 2931 return 0; 2932 if (VectorType *VecTy = dyn_cast<VectorType>(SeqTy)) 2933 if (NumSkippedElements >= VecTy->getNumElements()) 2934 return 0; 2935 Offset -= NumSkippedElements * ElementSize; 2936 2937 // First check if we need to recurse. 2938 if (Offset > 0 || Size < ElementSize) { 2939 // Bail if the partition ends in a different array element. 2940 if ((Offset + Size) > ElementSize) 2941 return 0; 2942 // Recurse through the element type trying to peel off offset bytes. 2943 return getTypePartition(TD, ElementTy, Offset, Size); 2944 } 2945 assert(Offset == 0); 2946 2947 if (Size == ElementSize) 2948 return ElementTy; 2949 assert(Size > ElementSize); 2950 uint64_t NumElements = Size / ElementSize; 2951 if (NumElements * ElementSize != Size) 2952 return 0; 2953 return ArrayType::get(ElementTy, NumElements); 2954 } 2955 2956 StructType *STy = dyn_cast<StructType>(Ty); 2957 if (!STy) 2958 return 0; 2959 2960 const StructLayout *SL = TD.getStructLayout(STy); 2961 if (Offset >= SL->getSizeInBytes()) 2962 return 0; 2963 uint64_t EndOffset = Offset + Size; 2964 if (EndOffset > SL->getSizeInBytes()) 2965 return 0; 2966 2967 unsigned Index = SL->getElementContainingOffset(Offset); 2968 Offset -= SL->getElementOffset(Index); 2969 2970 Type *ElementTy = STy->getElementType(Index); 2971 uint64_t ElementSize = TD.getTypeAllocSize(ElementTy); 2972 if (Offset >= ElementSize) 2973 return 0; // The offset points into alignment padding. 2974 2975 // See if any partition must be contained by the element. 2976 if (Offset > 0 || Size < ElementSize) { 2977 if ((Offset + Size) > ElementSize) 2978 return 0; 2979 return getTypePartition(TD, ElementTy, Offset, Size); 2980 } 2981 assert(Offset == 0); 2982 2983 if (Size == ElementSize) 2984 return ElementTy; 2985 2986 StructType::element_iterator EI = STy->element_begin() + Index, 2987 EE = STy->element_end(); 2988 if (EndOffset < SL->getSizeInBytes()) { 2989 unsigned EndIndex = SL->getElementContainingOffset(EndOffset); 2990 if (Index == EndIndex) 2991 return 0; // Within a single element and its padding. 2992 2993 // Don't try to form "natural" types if the elements don't line up with the 2994 // expected size. 2995 // FIXME: We could potentially recurse down through the last element in the 2996 // sub-struct to find a natural end point. 2997 if (SL->getElementOffset(EndIndex) != EndOffset) 2998 return 0; 2999 3000 assert(Index < EndIndex); 3001 EE = STy->element_begin() + EndIndex; 3002 } 3003 3004 // Try to build up a sub-structure. 3005 SmallVector<Type *, 4> ElementTys; 3006 do { 3007 ElementTys.push_back(*EI++); 3008 } while (EI != EE); 3009 StructType *SubTy = StructType::get(STy->getContext(), ElementTys, 3010 STy->isPacked()); 3011 const StructLayout *SubSL = TD.getStructLayout(SubTy); 3012 if (Size != SubSL->getSizeInBytes()) 3013 return 0; // The sub-struct doesn't have quite the size needed. 3014 3015 return SubTy; 3016 } 3017 3018 /// \brief Rewrite an alloca partition's users. 3019 /// 3020 /// This routine drives both of the rewriting goals of the SROA pass. It tries 3021 /// to rewrite uses of an alloca partition to be conducive for SSA value 3022 /// promotion. If the partition needs a new, more refined alloca, this will 3023 /// build that new alloca, preserving as much type information as possible, and 3024 /// rewrite the uses of the old alloca to point at the new one and have the 3025 /// appropriate new offsets. It also evaluates how successful the rewrite was 3026 /// at enabling promotion and if it was successful queues the alloca to be 3027 /// promoted. 3028 bool SROA::rewriteAllocaPartition(AllocaInst &AI, 3029 AllocaPartitioning &P, 3030 AllocaPartitioning::iterator PI) { 3031 uint64_t AllocaSize = PI->EndOffset - PI->BeginOffset; 3032 bool IsLive = false; 3033 for (AllocaPartitioning::use_iterator UI = P.use_begin(PI), 3034 UE = P.use_end(PI); 3035 UI != UE && !IsLive; ++UI) 3036 if (UI->U) 3037 IsLive = true; 3038 if (!IsLive) 3039 return false; // No live uses left of this partition. 3040 3041 DEBUG(dbgs() << "Speculating PHIs and selects in partition " 3042 << "[" << PI->BeginOffset << "," << PI->EndOffset << ")\n"); 3043 3044 PHIOrSelectSpeculator Speculator(*TD, P, *this); 3045 DEBUG(dbgs() << " speculating "); 3046 DEBUG(P.print(dbgs(), PI, "")); 3047 Speculator.visitUsers(PI); 3048 3049 // Try to compute a friendly type for this partition of the alloca. This 3050 // won't always succeed, in which case we fall back to a legal integer type 3051 // or an i8 array of an appropriate size. 3052 Type *AllocaTy = 0; 3053 if (Type *PartitionTy = P.getCommonType(PI)) 3054 if (TD->getTypeAllocSize(PartitionTy) >= AllocaSize) 3055 AllocaTy = PartitionTy; 3056 if (!AllocaTy) 3057 if (Type *PartitionTy = getTypePartition(*TD, AI.getAllocatedType(), 3058 PI->BeginOffset, AllocaSize)) 3059 AllocaTy = PartitionTy; 3060 if ((!AllocaTy || 3061 (AllocaTy->isArrayTy() && 3062 AllocaTy->getArrayElementType()->isIntegerTy())) && 3063 TD->isLegalInteger(AllocaSize * 8)) 3064 AllocaTy = Type::getIntNTy(*C, AllocaSize * 8); 3065 if (!AllocaTy) 3066 AllocaTy = ArrayType::get(Type::getInt8Ty(*C), AllocaSize); 3067 assert(TD->getTypeAllocSize(AllocaTy) >= AllocaSize); 3068 3069 // Check for the case where we're going to rewrite to a new alloca of the 3070 // exact same type as the original, and with the same access offsets. In that 3071 // case, re-use the existing alloca, but still run through the rewriter to 3072 // performe phi and select speculation. 3073 AllocaInst *NewAI; 3074 if (AllocaTy == AI.getAllocatedType()) { 3075 assert(PI->BeginOffset == 0 && 3076 "Non-zero begin offset but same alloca type"); 3077 assert(PI == P.begin() && "Begin offset is zero on later partition"); 3078 NewAI = &AI; 3079 } else { 3080 unsigned Alignment = AI.getAlignment(); 3081 if (!Alignment) { 3082 // The minimum alignment which users can rely on when the explicit 3083 // alignment is omitted or zero is that required by the ABI for this 3084 // type. 3085 Alignment = TD->getABITypeAlignment(AI.getAllocatedType()); 3086 } 3087 Alignment = MinAlign(Alignment, PI->BeginOffset); 3088 // If we will get at least this much alignment from the type alone, leave 3089 // the alloca's alignment unconstrained. 3090 if (Alignment <= TD->getABITypeAlignment(AllocaTy)) 3091 Alignment = 0; 3092 NewAI = new AllocaInst(AllocaTy, 0, Alignment, 3093 AI.getName() + ".sroa." + Twine(PI - P.begin()), 3094 &AI); 3095 ++NumNewAllocas; 3096 } 3097 3098 DEBUG(dbgs() << "Rewriting alloca partition " 3099 << "[" << PI->BeginOffset << "," << PI->EndOffset << ") to: " 3100 << *NewAI << "\n"); 3101 3102 AllocaPartitionRewriter Rewriter(*TD, P, PI, *this, AI, *NewAI, 3103 PI->BeginOffset, PI->EndOffset); 3104 DEBUG(dbgs() << " rewriting "); 3105 DEBUG(P.print(dbgs(), PI, "")); 3106 if (Rewriter.visitUsers(P.use_begin(PI), P.use_end(PI))) { 3107 DEBUG(dbgs() << " and queuing for promotion\n"); 3108 PromotableAllocas.push_back(NewAI); 3109 } else if (NewAI != &AI) { 3110 // If we can't promote the alloca, iterate on it to check for new 3111 // refinements exposed by splitting the current alloca. Don't iterate on an 3112 // alloca which didn't actually change and didn't get promoted. 3113 Worklist.insert(NewAI); 3114 } 3115 return true; 3116 } 3117 3118 /// \brief Walks the partitioning of an alloca rewriting uses of each partition. 3119 bool SROA::splitAlloca(AllocaInst &AI, AllocaPartitioning &P) { 3120 bool Changed = false; 3121 for (AllocaPartitioning::iterator PI = P.begin(), PE = P.end(); PI != PE; 3122 ++PI) 3123 Changed |= rewriteAllocaPartition(AI, P, PI); 3124 3125 return Changed; 3126 } 3127 3128 /// \brief Analyze an alloca for SROA. 3129 /// 3130 /// This analyzes the alloca to ensure we can reason about it, builds 3131 /// a partitioning of the alloca, and then hands it off to be split and 3132 /// rewritten as needed. 3133 bool SROA::runOnAlloca(AllocaInst &AI) { 3134 DEBUG(dbgs() << "SROA alloca: " << AI << "\n"); 3135 ++NumAllocasAnalyzed; 3136 3137 // Special case dead allocas, as they're trivial. 3138 if (AI.use_empty()) { 3139 AI.eraseFromParent(); 3140 return true; 3141 } 3142 3143 // Skip alloca forms that this analysis can't handle. 3144 if (AI.isArrayAllocation() || !AI.getAllocatedType()->isSized() || 3145 TD->getTypeAllocSize(AI.getAllocatedType()) == 0) 3146 return false; 3147 3148 // First check if this is a non-aggregate type that we should simply promote. 3149 if (!AI.getAllocatedType()->isAggregateType() && isAllocaPromotable(&AI)) { 3150 DEBUG(dbgs() << " Trivially scalar type, queuing for promotion...\n"); 3151 PromotableAllocas.push_back(&AI); 3152 return false; 3153 } 3154 3155 bool Changed = false; 3156 3157 // First, split any FCA loads and stores touching this alloca to promote 3158 // better splitting and promotion opportunities. 3159 AggLoadStoreRewriter AggRewriter(*TD); 3160 Changed |= AggRewriter.rewrite(AI); 3161 3162 // Build the partition set using a recursive instruction-visiting builder. 3163 AllocaPartitioning P(*TD, AI); 3164 DEBUG(P.print(dbgs())); 3165 if (P.isEscaped()) 3166 return Changed; 3167 3168 // No partitions to split. Leave the dead alloca for a later pass to clean up. 3169 if (P.begin() == P.end()) 3170 return Changed; 3171 3172 // Delete all the dead users of this alloca before splitting and rewriting it. 3173 for (AllocaPartitioning::dead_user_iterator DI = P.dead_user_begin(), 3174 DE = P.dead_user_end(); 3175 DI != DE; ++DI) { 3176 Changed = true; 3177 (*DI)->replaceAllUsesWith(UndefValue::get((*DI)->getType())); 3178 DeadInsts.push_back(*DI); 3179 } 3180 for (AllocaPartitioning::dead_op_iterator DO = P.dead_op_begin(), 3181 DE = P.dead_op_end(); 3182 DO != DE; ++DO) { 3183 Value *OldV = **DO; 3184 // Clobber the use with an undef value. 3185 **DO = UndefValue::get(OldV->getType()); 3186 if (Instruction *OldI = dyn_cast<Instruction>(OldV)) 3187 if (isInstructionTriviallyDead(OldI)) { 3188 Changed = true; 3189 DeadInsts.push_back(OldI); 3190 } 3191 } 3192 3193 return splitAlloca(AI, P) || Changed; 3194 } 3195 3196 /// \brief Delete the dead instructions accumulated in this run. 3197 /// 3198 /// Recursively deletes the dead instructions we've accumulated. This is done 3199 /// at the very end to maximize locality of the recursive delete and to 3200 /// minimize the problems of invalidated instruction pointers as such pointers 3201 /// are used heavily in the intermediate stages of the algorithm. 3202 /// 3203 /// We also record the alloca instructions deleted here so that they aren't 3204 /// subsequently handed to mem2reg to promote. 3205 void SROA::deleteDeadInstructions(SmallPtrSet<AllocaInst*, 4> &DeletedAllocas) { 3206 DeadSplitInsts.clear(); 3207 while (!DeadInsts.empty()) { 3208 Instruction *I = DeadInsts.pop_back_val(); 3209 DEBUG(dbgs() << "Deleting dead instruction: " << *I << "\n"); 3210 3211 for (User::op_iterator OI = I->op_begin(), E = I->op_end(); OI != E; ++OI) 3212 if (Instruction *U = dyn_cast<Instruction>(*OI)) { 3213 // Zero out the operand and see if it becomes trivially dead. 3214 *OI = 0; 3215 if (isInstructionTriviallyDead(U)) 3216 DeadInsts.push_back(U); 3217 } 3218 3219 if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) 3220 DeletedAllocas.insert(AI); 3221 3222 ++NumDeleted; 3223 I->eraseFromParent(); 3224 } 3225 } 3226 3227 /// \brief Promote the allocas, using the best available technique. 3228 /// 3229 /// This attempts to promote whatever allocas have been identified as viable in 3230 /// the PromotableAllocas list. If that list is empty, there is nothing to do. 3231 /// If there is a domtree available, we attempt to promote using the full power 3232 /// of mem2reg. Otherwise, we build and use the AllocaPromoter above which is 3233 /// based on the SSAUpdater utilities. This function returns whether any 3234 /// promotion occured. 3235 bool SROA::promoteAllocas(Function &F) { 3236 if (PromotableAllocas.empty()) 3237 return false; 3238 3239 NumPromoted += PromotableAllocas.size(); 3240 3241 if (DT && !ForceSSAUpdater) { 3242 DEBUG(dbgs() << "Promoting allocas with mem2reg...\n"); 3243 PromoteMemToReg(PromotableAllocas, *DT); 3244 PromotableAllocas.clear(); 3245 return true; 3246 } 3247 3248 DEBUG(dbgs() << "Promoting allocas with SSAUpdater...\n"); 3249 SSAUpdater SSA; 3250 DIBuilder DIB(*F.getParent()); 3251 SmallVector<Instruction*, 64> Insts; 3252 3253 for (unsigned Idx = 0, Size = PromotableAllocas.size(); Idx != Size; ++Idx) { 3254 AllocaInst *AI = PromotableAllocas[Idx]; 3255 for (Value::use_iterator UI = AI->use_begin(), UE = AI->use_end(); 3256 UI != UE;) { 3257 Instruction *I = cast<Instruction>(*UI++); 3258 // FIXME: Currently the SSAUpdater infrastructure doesn't reason about 3259 // lifetime intrinsics and so we strip them (and the bitcasts+GEPs 3260 // leading to them) here. Eventually it should use them to optimize the 3261 // scalar values produced. 3262 if (isa<BitCastInst>(I) || isa<GetElementPtrInst>(I)) { 3263 assert(onlyUsedByLifetimeMarkers(I) && 3264 "Found a bitcast used outside of a lifetime marker."); 3265 while (!I->use_empty()) 3266 cast<Instruction>(*I->use_begin())->eraseFromParent(); 3267 I->eraseFromParent(); 3268 continue; 3269 } 3270 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { 3271 assert(II->getIntrinsicID() == Intrinsic::lifetime_start || 3272 II->getIntrinsicID() == Intrinsic::lifetime_end); 3273 II->eraseFromParent(); 3274 continue; 3275 } 3276 3277 Insts.push_back(I); 3278 } 3279 AllocaPromoter(Insts, SSA, *AI, DIB).run(Insts); 3280 Insts.clear(); 3281 } 3282 3283 PromotableAllocas.clear(); 3284 return true; 3285 } 3286 3287 namespace { 3288 /// \brief A predicate to test whether an alloca belongs to a set. 3289 class IsAllocaInSet { 3290 typedef SmallPtrSet<AllocaInst *, 4> SetType; 3291 const SetType &Set; 3292 3293 public: 3294 typedef AllocaInst *argument_type; 3295 3296 IsAllocaInSet(const SetType &Set) : Set(Set) {} 3297 bool operator()(AllocaInst *AI) const { return Set.count(AI); } 3298 }; 3299 } 3300 3301 bool SROA::runOnFunction(Function &F) { 3302 DEBUG(dbgs() << "SROA function: " << F.getName() << "\n"); 3303 C = &F.getContext(); 3304 TD = getAnalysisIfAvailable<TargetData>(); 3305 if (!TD) { 3306 DEBUG(dbgs() << " Skipping SROA -- no target data!\n"); 3307 return false; 3308 } 3309 DT = getAnalysisIfAvailable<DominatorTree>(); 3310 3311 BasicBlock &EntryBB = F.getEntryBlock(); 3312 for (BasicBlock::iterator I = EntryBB.begin(), E = llvm::prior(EntryBB.end()); 3313 I != E; ++I) 3314 if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) 3315 Worklist.insert(AI); 3316 3317 bool Changed = false; 3318 // A set of deleted alloca instruction pointers which should be removed from 3319 // the list of promotable allocas. 3320 SmallPtrSet<AllocaInst *, 4> DeletedAllocas; 3321 3322 while (!Worklist.empty()) { 3323 Changed |= runOnAlloca(*Worklist.pop_back_val()); 3324 deleteDeadInstructions(DeletedAllocas); 3325 3326 // Remove the deleted allocas from various lists so that we don't try to 3327 // continue processing them. 3328 if (!DeletedAllocas.empty()) { 3329 Worklist.remove_if(IsAllocaInSet(DeletedAllocas)); 3330 PromotableAllocas.erase(std::remove_if(PromotableAllocas.begin(), 3331 PromotableAllocas.end(), 3332 IsAllocaInSet(DeletedAllocas)), 3333 PromotableAllocas.end()); 3334 DeletedAllocas.clear(); 3335 } 3336 } 3337 3338 Changed |= promoteAllocas(F); 3339 3340 return Changed; 3341 } 3342 3343 void SROA::getAnalysisUsage(AnalysisUsage &AU) const { 3344 if (RequiresDomTree) 3345 AU.addRequired<DominatorTree>(); 3346 AU.setPreservesCFG(); 3347 } 3348