diff options
author | Florian Hahn <flo@fhahn.com> | 2025-06-06 12:38:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-06 12:38:30 +0100 |
commit | dde30a47313bf52fef02bbcb1de931a8d725659f (patch) | |
tree | fdcd96885d1e7bb59f86b2f946f1371dca65751e /llvm/lib/CodeGen/CodeGenPrepare.cpp | |
parent | 55e4c6d95dad7954e15af5da1672b7108f358e71 (diff) | |
download | llvm-dde30a47313bf52fef02bbcb1de931a8d725659f.zip llvm-dde30a47313bf52fef02bbcb1de931a8d725659f.tar.gz llvm-dde30a47313bf52fef02bbcb1de931a8d725659f.tar.bz2 |
[CGP] Bail out if (Base|Scaled)Reg does not dominate insert point. (#142949)
(Base|Scaled)Reg may not dominate the chosen insert point, if there are
multiple uses of the address. Bail out if that's the case, otherwise we
will generate invalid IR.
In some cases, we could probably adjust the insert point or hoist the
(Base|Scaled)Reg.
Fixes https://github.com/llvm/llvm-project/issues/142830.
PR: https://github.com/llvm/llvm-project/pull/142949
Diffstat (limited to 'llvm/lib/CodeGen/CodeGenPrepare.cpp')
-rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 822ed62..32348a8 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -5945,8 +5945,17 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // The current BB may be optimized multiple times, we can't guarantee the // reuse of Addr happens later, call findInsertPos to find an appropriate // insert position. - IRBuilder<> Builder(MemoryInst->getParent(), - findInsertPos(Addr, MemoryInst, SunkAddr)); + auto InsertPos = findInsertPos(Addr, MemoryInst, SunkAddr); + + // TODO: Adjust insert point considering (Base|Scaled)Reg if possible. + if (!SunkAddr) { + auto &DT = getDT(*MemoryInst->getFunction()); + if ((AddrMode.BaseReg && !DT.dominates(AddrMode.BaseReg, &*InsertPos)) || + (AddrMode.ScaledReg && !DT.dominates(AddrMode.ScaledReg, &*InsertPos))) + return Modified; + } + + IRBuilder<> Builder(MemoryInst->getParent(), InsertPos); if (SunkAddr) { LLVM_DEBUG(dbgs() << "CGP: Reusing nonlocal addrmode: " << AddrMode |