diff options
author | Tiehu Zhang <zhangtiehu@huawei.com> | 2021-08-17 18:50:54 +0800 |
---|---|---|
committer | Peilin Guo <guopeilin1@huawei.com> | 2021-08-17 18:58:15 +0800 |
commit | 9cfa9b44a589438d3c6920881c5619c76479dbaa (patch) | |
tree | 3e18cdcd30e4296a2e5b3680f37c6772f7d834f2 /llvm/lib/CodeGen/CodeGenPrepare.cpp | |
parent | 708cbda5771aecf84e93c4e7f5d6f78bbc92af6e (diff) | |
download | llvm-9cfa9b44a589438d3c6920881c5619c76479dbaa.zip llvm-9cfa9b44a589438d3c6920881c5619c76479dbaa.tar.gz llvm-9cfa9b44a589438d3c6920881c5619c76479dbaa.tar.bz2 |
[CodeGenPrepare] The instruction to be sunk should be inserted before its user in a block
In current implementation, the instruction to be sunk will be inserted before the target instruction without considering the def-use tree,
which may case Instruction does not dominate all uses error. We need to choose a suitable location to insert according to the use chain
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D107262
Diffstat (limited to 'llvm/lib/CodeGen/CodeGenPrepare.cpp')
-rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 77ce3d2f..50e5939 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -6950,16 +6950,26 @@ bool CodeGenPrepare::tryToSinkFreeOperands(Instruction *I) { BasicBlock *TargetBB = I->getParent(); bool Changed = false; SmallVector<Use *, 4> ToReplace; + Instruction *InsertPoint = I; + DenseMap<const Instruction *, unsigned long> InstOrdering; + unsigned long InstNumber = 0; + for (const auto &I : *TargetBB) + InstOrdering[&I] = InstNumber++; + for (Use *U : reverse(OpsToSink)) { auto *UI = cast<Instruction>(U->get()); - if (UI->getParent() == TargetBB || isa<PHINode>(UI)) + if (isa<PHINode>(UI)) + continue; + if (UI->getParent() == TargetBB) { + if (InstOrdering[UI] < InstOrdering[InsertPoint]) + InsertPoint = UI; continue; + } ToReplace.push_back(U); } SetVector<Instruction *> MaybeDead; DenseMap<Instruction *, Instruction *> NewInstructions; - Instruction *InsertPoint = I; for (Use *U : ToReplace) { auto *UI = cast<Instruction>(U->get()); Instruction *NI = UI->clone(); |