@@ -553,6 +553,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
553
553
ReplacedValues[Extract] = HighBytes;
554
554
}
555
555
ToRemove.push_back (Extract);
556
+ Extract->replaceAllUsesWith (ReplacedValues[Extract]);
556
557
}
557
558
}
558
559
}
@@ -565,34 +566,42 @@ class DXILLegalizationPipeline {
565
566
DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
566
567
567
568
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
+ }
574
577
575
- for (auto *Inst : reverse (ToRemove))
576
- Inst->eraseFromParent ();
578
+ for (auto *Inst : reverse (ToRemove))
579
+ Inst->eraseFromParent ();
577
580
578
- return !ToRemove.empty ();
581
+ MadeChange |= !ToRemove.empty ();
582
+ }
583
+ return MadeChange;
579
584
}
580
585
581
586
private:
582
- SmallVector<
587
+ enum LegalizationStage { Stage1 = 0 , Stage2 = 1 , NumStages };
588
+
589
+ using LegalizationFnTy =
583
590
std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
584
- DenseMap<Value *, Value *> &)>>
585
- LegalizationPipeline;
591
+ DenseMap<Value *, Value *> &)>;
592
+
593
+ SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
586
594
587
595
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);
596
605
}
597
606
};
598
607
0 commit comments