Skip to content

Commit fb6ef48

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

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
@@ -553,6 +553,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
553553
ReplacedValues[Extract] = HighBytes;
554554
}
555555
ToRemove.push_back(Extract);
556+
Extract->replaceAllUsesWith(ReplacedValues[Extract]);
556557
}
557558
}
558559
}
@@ -565,34 +566,42 @@ class DXILLegalizationPipeline {
565566
DXILLegalizationPipeline() { initializeLegalizationPipeline(); }
566567

567568
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+
}
574577

575-
for (auto *Inst : reverse(ToRemove))
576-
Inst->eraseFromParent();
578+
for (auto *Inst : reverse(ToRemove))
579+
Inst->eraseFromParent();
577580

578-
return !ToRemove.empty();
581+
MadeChange |= !ToRemove.empty();
582+
}
583+
return MadeChange;
579584
}
580585

581586
private:
582-
SmallVector<
587+
enum LegalizationStage { Stage1 = 0, Stage2 = 1, NumStages };
588+
589+
using LegalizationFnTy =
583590
std::function<void(Instruction &, SmallVectorImpl<Instruction *> &,
584-
DenseMap<Value *, Value *> &)>>
585-
LegalizationPipeline;
591+
DenseMap<Value *, Value *> &)>;
592+
593+
SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
586594

587595
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);
596605
}
597606
};
598607

0 commit comments

Comments
 (0)