|
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