@@ -462,6 +462,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
462
462
ReplacedValues[Extract] = HighBytes;
463
463
}
464
464
ToRemove.push_back (Extract);
465
+ Extract->replaceAllUsesWith (ReplacedValues[Extract]);
465
466
}
466
467
}
467
468
}
@@ -474,34 +475,42 @@ class DXILLegalizationPipeline {
474
475
DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
475
476
476
477
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
+ }
483
486
484
- for (auto *Inst : reverse (ToRemove))
485
- Inst->eraseFromParent ();
487
+ for (auto *Inst : reverse (ToRemove))
488
+ Inst->eraseFromParent ();
486
489
487
- return !ToRemove.empty ();
490
+ MadeChange |= !ToRemove.empty ();
491
+ }
492
+ return MadeChange;
488
493
}
489
494
490
495
private:
491
- SmallVector<
496
+ enum LegalizationStage { Stage1 = 0 , Stage2 = 1 , NumStages };
497
+
498
+ using LegalizationFnTy =
492
499
std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
493
- DenseMap<Value *, Value *> &)>>
494
- LegalizationPipeline;
500
+ DenseMap<Value *, Value *> &)>;
501
+
502
+ SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
495
503
496
504
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);
505
514
}
506
515
};
507
516
0 commit comments