diff options
author | Vedant Kumar <vsk@apple.com> | 2019-07-10 16:32:20 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2019-07-10 16:32:20 +0000 |
commit | 5eb6ba060a2fdb34ef92ab833b81ad183b2cbbfe (patch) | |
tree | 6795d4f0720e1c61269710f6ffca16e94d52e339 /llvm/lib/Transforms/Utils/CodeExtractor.cpp | |
parent | f65f302cc7af68e5bc7dc9ee8f6761ed6514fadb (diff) | |
download | bcm5719-llvm-5eb6ba060a2fdb34ef92ab833b81ad183b2cbbfe.tar.gz bcm5719-llvm-5eb6ba060a2fdb34ef92ab833b81ad183b2cbbfe.zip |
[CodeExtractor] Fix sinking of allocas with multiple bitcast uses (PR42451)
An alloca which can be sunk into the extraction region may have more
than one bitcast use. Move these uses along with the alloca to prevent
use-before-def.
Testing: check-llvm, stage2 build of clang
Fixes llvm.org/PR42451.
Differential Revision: https://reviews.llvm.org/D64463
llvm-svn: 365660
Diffstat (limited to 'llvm/lib/Transforms/Utils/CodeExtractor.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/CodeExtractor.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp index f70b09c7cad..27064d590bb 100644 --- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp +++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp @@ -519,18 +519,20 @@ void CodeExtractor::findAllocas(ValueSet &SinkCands, ValueSet &HoistCands, if (Bitcasts.empty()) continue; - Instruction *BitcastAddr = Bitcasts.back(); - const LifetimeMarkerInfo &LMI = BitcastLifetimeInfo.back(); - assert(LMI.LifeStart && - "Unsafe to sink bitcast without lifetime markers"); - moveOrIgnoreLifetimeMarkers(LMI); - if (!definedInRegion(Blocks, BitcastAddr)) { - LLVM_DEBUG(dbgs() << "Sinking bitcast-of-alloca: " << *BitcastAddr - << "\n"); - SinkCands.insert(BitcastAddr); - } LLVM_DEBUG(dbgs() << "Sinking alloca (via bitcast): " << *AI << "\n"); SinkCands.insert(AI); + for (unsigned I = 0, E = Bitcasts.size(); I != E; ++I) { + Instruction *BitcastAddr = Bitcasts[I]; + const LifetimeMarkerInfo &LMI = BitcastLifetimeInfo[I]; + assert(LMI.LifeStart && + "Unsafe to sink bitcast without lifetime markers"); + moveOrIgnoreLifetimeMarkers(LMI); + if (!definedInRegion(Blocks, BitcastAddr)) { + LLVM_DEBUG(dbgs() << "Sinking bitcast-of-alloca: " << *BitcastAddr + << "\n"); + SinkCands.insert(BitcastAddr); + } + } } } } @@ -1431,9 +1433,23 @@ Function *CodeExtractor::extractCodeRegion() { findInputsOutputs(inputs, outputs, SinkingCands); // Now sink all instructions which only have non-phi uses inside the region. - for (auto *II : SinkingCands) - cast<Instruction>(II)->moveBefore(*newFuncRoot, - newFuncRoot->getFirstInsertionPt()); + // Group the allocas at the start of the block, so that any bitcast uses of + // the allocas are well-defined. + AllocaInst *FirstSunkAlloca = nullptr; + for (auto *II : SinkingCands) { + if (auto *AI = dyn_cast<AllocaInst>(II)) { + AI->moveBefore(*newFuncRoot, newFuncRoot->getFirstInsertionPt()); + if (!FirstSunkAlloca) + FirstSunkAlloca = AI; + } + } + assert((SinkingCands.empty() || FirstSunkAlloca) && + "Did not expect a sink candidate without any allocas"); + for (auto *II : SinkingCands) { + if (!isa<AllocaInst>(II)) { + cast<Instruction>(II)->moveAfter(FirstSunkAlloca); + } + } if (!HoistingCands.empty()) { auto *HoistToBlock = findOrCreateBlockForHoisting(CommonExit); |