|
14 | 14 |
|
15 | 15 | #include "llvm/ADT/SetVector.h"
|
16 | 16 | #include "llvm/ADT/SmallVector.h"
|
17 |
| -#include "llvm/Analysis/ConstantFolding.h" |
18 | 17 | #include "llvm/Analysis/DomTreeUpdater.h"
|
19 | 18 | #include "llvm/Analysis/InstructionSimplify.h"
|
20 | 19 | #include "llvm/Analysis/LoopInfo.h"
|
@@ -541,13 +540,18 @@ void PruningFunctionCloner::CloneBlock(
|
541 | 540 | RemapInstruction(NewInst, VMap,
|
542 | 541 | ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges);
|
543 | 542 |
|
544 |
| - // Eagerly constant fold the newly cloned instruction. If successful, add |
545 |
| - // a mapping to the new value. Non-constant operands may be incomplete at |
546 |
| - // this stage, thus instruction simplification is performed after |
547 |
| - // processing phi-nodes. |
548 |
| - if (Value *V = ConstantFoldInstruction( |
549 |
| - NewInst, BB->getModule()->getDataLayout())) { |
550 |
| - if (isInstructionTriviallyDead(NewInst)) { |
| 543 | + // If we can simplify this instruction to some other value, simply add |
| 544 | + // a mapping to that value rather than inserting a new instruction into |
| 545 | + // the basic block. |
| 546 | + if (Value *V = |
| 547 | + simplifyInstruction(NewInst, BB->getModule()->getDataLayout())) { |
| 548 | + // On the off-chance that this simplifies to an instruction in the old |
| 549 | + // function, map it back into the new function. |
| 550 | + if (NewFunc != OldFunc) |
| 551 | + if (Value *MappedV = VMap.lookup(V)) |
| 552 | + V = MappedV; |
| 553 | + |
| 554 | + if (!NewInst->mayHaveSideEffects()) { |
551 | 555 | VMap[&*II] = V;
|
552 | 556 | NewInst->eraseFromParent();
|
553 | 557 | continue;
|
@@ -819,34 +823,52 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,
|
819 | 823 | }
|
820 | 824 | }
|
821 | 825 |
|
822 |
| - // As phi-nodes have been now remapped, allow incremental simplification of |
823 |
| - // newly-cloned instructions. |
| 826 | + // Make a second pass over the PHINodes now that all of them have been |
| 827 | + // remapped into the new function, simplifying the PHINode and performing any |
| 828 | + // recursive simplifications exposed. This will transparently update the |
| 829 | + // WeakTrackingVH in the VMap. Notably, we rely on that so that if we coalesce |
| 830 | + // two PHINodes, the iteration over the old PHIs remains valid, and the |
| 831 | + // mapping will just map us to the new node (which may not even be a PHI |
| 832 | + // node). |
824 | 833 | const DataLayout &DL = NewFunc->getParent()->getDataLayout();
|
825 |
| - for (const auto &BB : *OldFunc) { |
826 |
| - for (const auto &I : BB) { |
827 |
| - auto *NewI = dyn_cast_or_null<Instruction>(VMap.lookup(&I)); |
828 |
| - if (!NewI) |
829 |
| - continue; |
830 |
| - |
831 |
| - // Skip over non-intrinsic callsites, we don't want to remove any nodes |
832 |
| - // from the CGSCC. |
833 |
| - CallBase *CB = dyn_cast<CallBase>(NewI); |
834 |
| - if (CB && CB->getCalledFunction() && |
835 |
| - !CB->getCalledFunction()->isIntrinsic()) |
836 |
| - continue; |
837 |
| - |
838 |
| - if (Value *V = simplifyInstruction(NewI, DL)) { |
839 |
| - NewI->replaceAllUsesWith(V); |
840 |
| - |
841 |
| - if (isInstructionTriviallyDead(NewI)) { |
842 |
| - NewI->eraseFromParent(); |
843 |
| - } else { |
844 |
| - // Did not erase it? Restore the new instruction into VMap previously |
845 |
| - // dropped by `ValueIsRAUWd`. |
846 |
| - VMap[&I] = NewI; |
847 |
| - } |
848 |
| - } |
849 |
| - } |
| 834 | + SmallSetVector<const Value *, 8> Worklist; |
| 835 | + for (unsigned Idx = 0, Size = PHIToResolve.size(); Idx != Size; ++Idx) |
| 836 | + if (isa<PHINode>(VMap[PHIToResolve[Idx]])) |
| 837 | + Worklist.insert(PHIToResolve[Idx]); |
| 838 | + |
| 839 | + // Note that we must test the size on each iteration, the worklist can grow. |
| 840 | + for (unsigned Idx = 0; Idx != Worklist.size(); ++Idx) { |
| 841 | + const Value *OrigV = Worklist[Idx]; |
| 842 | + auto *I = dyn_cast_or_null<Instruction>(VMap.lookup(OrigV)); |
| 843 | + if (!I) |
| 844 | + continue; |
| 845 | + |
| 846 | + // Skip over non-intrinsic callsites, we don't want to remove any nodes from |
| 847 | + // the CGSCC. |
| 848 | + CallBase *CB = dyn_cast<CallBase>(I); |
| 849 | + if (CB && CB->getCalledFunction() && |
| 850 | + !CB->getCalledFunction()->isIntrinsic()) |
| 851 | + continue; |
| 852 | + |
| 853 | + // See if this instruction simplifies. |
| 854 | + Value *SimpleV = simplifyInstruction(I, DL); |
| 855 | + if (!SimpleV) |
| 856 | + continue; |
| 857 | + |
| 858 | + // Stash away all the uses of the old instruction so we can check them for |
| 859 | + // recursive simplifications after a RAUW. This is cheaper than checking all |
| 860 | + // uses of To on the recursive step in most cases. |
| 861 | + for (const User *U : OrigV->users()) |
| 862 | + Worklist.insert(cast<Instruction>(U)); |
| 863 | + |
| 864 | + // Replace the instruction with its simplified value. |
| 865 | + I->replaceAllUsesWith(SimpleV); |
| 866 | + |
| 867 | + // If the original instruction had no side effects, remove it. |
| 868 | + if (isInstructionTriviallyDead(I)) |
| 869 | + I->eraseFromParent(); |
| 870 | + else |
| 871 | + VMap[OrigV] = I; |
850 | 872 | }
|
851 | 873 |
|
852 | 874 | // Remap debug intrinsic operands now that all values have been mapped.
|
|
0 commit comments