@@ -360,6 +360,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
360
360
ReplacedValues[Extract] = HighBytes;
361
361
}
362
362
ToRemove.push_back (Extract);
363
+ Extract->replaceAllUsesWith (ReplacedValues[Extract]);
363
364
}
364
365
}
365
366
}
@@ -371,32 +372,40 @@ class DXILLegalizationPipeline {
371
372
DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
372
373
373
374
bool runLegalizationPipeline (Function &F) {
374
- SmallVector<Instruction *> ToRemove;
375
- DenseMap<Value *, Value *> ReplacedValues;
376
- for (auto &I : instructions (F)) {
377
- for (auto &LegalizationFn : LegalizationPipeline)
378
- LegalizationFn (I, ToRemove, ReplacedValues);
379
- }
375
+ bool MadeChange = false ;
376
+ for (int Stage = 0 ; Stage < NumStages; ++Stage) {
377
+ SmallVector<Instruction *> ToRemove;
378
+ DenseMap<Value *, Value *> ReplacedValues;
379
+ for (auto &I : instructions (F)) {
380
+ for (auto &LegalizationFn : LegalizationPipeline[Stage])
381
+ LegalizationFn (I, ToRemove, ReplacedValues);
382
+ }
380
383
381
- for (auto *Inst : reverse (ToRemove))
382
- Inst->eraseFromParent ();
384
+ for (auto *Inst : reverse (ToRemove))
385
+ Inst->eraseFromParent ();
383
386
384
- return !ToRemove.empty ();
387
+ MadeChange |= !ToRemove.empty ();
388
+ }
389
+ return MadeChange;
385
390
}
386
391
387
392
private:
388
- SmallVector<
393
+ enum LegalizationStage { Stage1 = 0 , Stage2 = 1 , NumStages };
394
+
395
+ using LegalizationFnTy =
389
396
std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
390
- DenseMap<Value *, Value *> &)>>
391
- LegalizationPipeline;
397
+ DenseMap<Value *, Value *> &)>;
398
+
399
+ SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
392
400
393
401
void initializeLegalizationPipeline () {
394
- LegalizationPipeline.push_back (upcastI8AllocasAndUses);
395
- LegalizationPipeline.push_back (fixI8UseChain);
396
- LegalizationPipeline.push_back (downcastI64toI32InsertExtractElements);
397
- LegalizationPipeline.push_back (legalizeFreeze);
398
- LegalizationPipeline.push_back (removeMemSet);
399
- LegalizationPipeline.push_back (legalizeGetHighLowi64Bytes);
402
+ LegalizationPipeline[Stage1].push_back (upcastI8AllocasAndUses);
403
+ LegalizationPipeline[Stage1].push_back (fixI8UseChain);
404
+ LegalizationPipeline[Stage1].push_back (legalizeGetHighLowi64Bytes);
405
+ LegalizationPipeline[Stage1].push_back (legalizeFreeze);
406
+ LegalizationPipeline[Stage1].push_back (removeMemSet);
407
+ LegalizationPipeline[Stage2].push_back (
408
+ downcastI64toI32InsertExtractElements);
400
409
}
401
410
};
402
411
0 commit comments