Skip to content

Commit ba88ccb

Browse files
committed
Add Legalization stages. Passes that change the same instructions need to be staggered.
1 parent 70cc62a commit ba88ccb

File tree

1 file changed

+29
-20
lines changed

1 file changed

+29
-20
lines changed

llvm/lib/Target/DirectX/DXILLegalizePass.cpp

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

490495
private:
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

Comments
 (0)