@@ -553,6 +553,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
553553 ReplacedValues[Extract] = HighBytes;
554554 }
555555 ToRemove.push_back (Extract);
556+ Extract->replaceAllUsesWith (ReplacedValues[Extract]);
556557 }
557558 }
558559 }
@@ -565,34 +566,42 @@ class DXILLegalizationPipeline {
565566 DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
566567
567568 bool runLegalizationPipeline (Function &F) {
568- SmallVector<Instruction *> ToRemove;
569- DenseMap<Value *, Value *> ReplacedValues;
570- for (auto &I : instructions (F)) {
571- for (auto &LegalizationFn : LegalizationPipeline)
572- LegalizationFn (I, ToRemove, ReplacedValues);
573- }
569+ bool MadeChange = false ;
570+ for (int Stage = 0 ; Stage < NumStages; ++Stage) {
571+ SmallVector<Instruction *> ToRemove;
572+ DenseMap<Value *, Value *> ReplacedValues;
573+ for (auto &I : instructions (F)) {
574+ for (auto &LegalizationFn : LegalizationPipeline[Stage])
575+ LegalizationFn (I, ToRemove, ReplacedValues);
576+ }
574577
575- for (auto *Inst : reverse (ToRemove))
576- Inst->eraseFromParent ();
578+ for (auto *Inst : reverse (ToRemove))
579+ Inst->eraseFromParent ();
577580
578- return !ToRemove.empty ();
581+ MadeChange |= !ToRemove.empty ();
582+ }
583+ return MadeChange;
579584 }
580585
581586private:
582- SmallVector<
587+ enum LegalizationStage { Stage1 = 0 , Stage2 = 1 , NumStages };
588+
589+ using LegalizationFnTy =
583590 std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
584- DenseMap<Value *, Value *> &)>>
585- LegalizationPipeline;
591+ DenseMap<Value *, Value *> &)>;
592+
593+ SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
586594
587595 void initializeLegalizationPipeline () {
588- LegalizationPipeline.push_back (upcastI8AllocasAndUses);
589- LegalizationPipeline.push_back (fixI8UseChain);
590- LegalizationPipeline.push_back (downcastI64toI32InsertExtractElements);
591- LegalizationPipeline.push_back (legalizeFreeze);
592- LegalizationPipeline.push_back (legalizeMemCpy);
593- LegalizationPipeline.push_back (removeMemSet);
594- LegalizationPipeline.push_back (updateFnegToFsub);
595- LegalizationPipeline.push_back (legalizeGetHighLowi64Bytes);
596+ LegalizationPipeline[Stage1].push_back (upcastI8AllocasAndUses);
597+ LegalizationPipeline[Stage1].push_back (fixI8UseChain);
598+ LegalizationPipeline[Stage1].push_back (legalizeGetHighLowi64Bytes);
599+ LegalizationPipeline[Stage1].push_back (legalizeFreeze);
600+ LegalizationPipeline[Stage1].push_back (legalizeMemCpy);
601+ LegalizationPipeline[Stage1].push_back (removeMemSet);
602+ LegalizationPipeline[Stage1].push_back (updateFnegToFsub);
603+ LegalizationPipeline[Stage2].push_back (
604+ downcastI64toI32InsertExtractElements);
596605 }
597606};
598607
0 commit comments