@@ -462,6 +462,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
462462 ReplacedValues[Extract] = HighBytes;
463463 }
464464 ToRemove.push_back (Extract);
465+ Extract->replaceAllUsesWith (ReplacedValues[Extract]);
465466 }
466467 }
467468 }
@@ -474,34 +475,42 @@ class DXILLegalizationPipeline {
474475 DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
475476
476477 bool runLegalizationPipeline (Function &F) {
477- SmallVector<Instruction *> ToRemove;
478- DenseMap<Value *, Value *> ReplacedValues;
479- for (auto &I : instructions (F)) {
480- for (auto &LegalizationFn : LegalizationPipeline)
481- LegalizationFn (I, ToRemove, ReplacedValues);
482- }
478+ bool MadeChange = false ;
479+ for (int Stage = 0 ; Stage < NumStages; ++Stage) {
480+ SmallVector<Instruction *> ToRemove;
481+ DenseMap<Value *, Value *> ReplacedValues;
482+ for (auto &I : instructions (F)) {
483+ for (auto &LegalizationFn : LegalizationPipeline[Stage])
484+ LegalizationFn (I, ToRemove, ReplacedValues);
485+ }
483486
484- for (auto *Inst : reverse (ToRemove))
485- Inst->eraseFromParent ();
487+ for (auto *Inst : reverse (ToRemove))
488+ Inst->eraseFromParent ();
486489
487- return !ToRemove.empty ();
490+ MadeChange |= !ToRemove.empty ();
491+ }
492+ return MadeChange;
488493 }
489494
490495private:
491- SmallVector<
496+ enum LegalizationStage { Stage1 = 0 , Stage2 = 1 , NumStages };
497+
498+ using LegalizationFnTy =
492499 std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
493- DenseMap<Value *, Value *> &)>>
494- LegalizationPipeline;
500+ DenseMap<Value *, Value *> &)>;
501+
502+ SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
495503
496504 void initializeLegalizationPipeline () {
497- LegalizationPipeline.push_back (upcastI8AllocasAndUses);
498- LegalizationPipeline.push_back (fixI8UseChain);
499- LegalizationPipeline.push_back (downcastI64toI32InsertExtractElements);
500- LegalizationPipeline.push_back (legalizeFreeze);
501- LegalizationPipeline.push_back (legalizeMemCpy);
502- LegalizationPipeline.push_back (removeMemSet);
503- LegalizationPipeline.push_back (updateFnegToFsub);
504- LegalizationPipeline.push_back (legalizeGetHighLowi64Bytes);
505+ LegalizationPipeline[Stage1].push_back (upcastI8AllocasAndUses);
506+ LegalizationPipeline[Stage1].push_back (fixI8UseChain);
507+ LegalizationPipeline[Stage1].push_back (legalizeGetHighLowi64Bytes);
508+ LegalizationPipeline[Stage1].push_back (legalizeFreeze);
509+ LegalizationPipeline[Stage1].push_back (legalizeMemCpy);
510+ LegalizationPipeline[Stage1].push_back (removeMemSet);
511+ LegalizationPipeline[Stage1].push_back (updateFnegToFsub);
512+ LegalizationPipeline[Stage2].push_back (
513+ downcastI64toI32InsertExtractElements);
505514 }
506515};
507516
0 commit comments