|
14 | 14 |
|
15 | 15 | #include "llvm/ADT/SetVector.h" |
16 | 16 | #include "llvm/ADT/SmallVector.h" |
| 17 | +#include "llvm/Analysis/ConstantFolding.h" |
17 | 18 | #include "llvm/Analysis/DomTreeUpdater.h" |
18 | 19 | #include "llvm/Analysis/InstructionSimplify.h" |
19 | 20 | #include "llvm/Analysis/LoopInfo.h" |
@@ -540,18 +541,13 @@ void PruningFunctionCloner::CloneBlock( |
540 | 541 | RemapInstruction(NewInst, VMap, |
541 | 542 | ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges); |
542 | 543 |
|
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()) { |
| 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)) { |
555 | 551 | VMap[&*II] = V; |
556 | 552 | NewInst->eraseFromParent(); |
557 | 553 | continue; |
@@ -823,52 +819,34 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc, |
823 | 819 | } |
824 | 820 | } |
825 | 821 |
|
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). |
| 822 | + // As phi-nodes have been now remapped, allow incremental simplification of |
| 823 | + // newly-cloned instructions. |
833 | 824 | const DataLayout &DL = NewFunc->getParent()->getDataLayout(); |
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; |
| 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 | + } |
872 | 850 | } |
873 | 851 |
|
874 | 852 | // Remap debug intrinsic operands now that all values have been mapped. |
|
0 commit comments