Skip to content

Commit 0f83129

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

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

llvm/lib/Target/DirectX/DXILLegalizePass.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ legalizeGetHighLowi64Bytes(Instruction &I,
360360
ReplacedValues[Extract] = HighBytes;
361361
}
362362
ToRemove.push_back(Extract);
363+
Extract->replaceAllUsesWith(ReplacedValues[Extract]);
363364
}
364365
}
365366
}
@@ -371,32 +372,40 @@ class DXILLegalizationPipeline {
371372
DXILLegalizationPipeline() { initializeLegalizationPipeline(); }
372373

373374
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+
}
380383

381-
for (auto *Inst : reverse(ToRemove))
382-
Inst->eraseFromParent();
384+
for (auto *Inst : reverse(ToRemove))
385+
Inst->eraseFromParent();
383386

384-
return !ToRemove.empty();
387+
MadeChange |= !ToRemove.empty();
388+
}
389+
return MadeChange;
385390
}
386391

387392
private:
388-
SmallVector<
393+
enum LegalizationStage { Stage1 = 0, Stage2 = 1, NumStages };
394+
395+
using LegalizationFnTy =
389396
std::function<void(Instruction &, SmallVectorImpl<Instruction *> &,
390-
DenseMap<Value *, Value *> &)>>
391-
LegalizationPipeline;
397+
DenseMap<Value *, Value *> &)>;
398+
399+
SmallVector<LegalizationFnTy> LegalizationPipeline[NumStages];
392400

393401
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);
400409
}
401410
};
402411

0 commit comments

Comments
 (0)