diff options
author | Sumanth Gundapaneni <sgundapa@codeaurora.org> | 2017-01-09 17:45:02 +0000 |
---|---|---|
committer | Sumanth Gundapaneni <sgundapa@codeaurora.org> | 2017-01-09 17:45:02 +0000 |
commit | 0ac1ce70ba5a70772ea432ffc20ec77968f15a24 (patch) | |
tree | 58b87f1f5bb841dfd79d9629ef9fde970c4610a9 | |
parent | ca6d868f14f529612773e592cd70bd1b7ca37ead (diff) | |
download | bcm5719-llvm-0ac1ce70ba5a70772ea432ffc20ec77968f15a24.tar.gz bcm5719-llvm-0ac1ce70ba5a70772ea432ffc20ec77968f15a24.zip |
In the below scenario, we must be able to skip the a DBG_VALUE instruction and
remove the dead store.
%vreg0<def> = L2_loadri_io <fi#15>, 0; mem:LD4[%dataF](align=4)
DBG_VALUE %vreg0, %noreg, !"dataF", <!184>; IntRegs:%vreg0
S2_storeri_io <fi#15>, 0, %vreg0; mem:ST4[%dataF]
In reality, this kind of stores are eliminated before Stack Slot Coloring pass,
possibly in instruction lowering
Differential Revision: https://reviews.llvm.org/D26616
llvm-svn: 291455
-rw-r--r-- | llvm/lib/CodeGen/StackSlotColoring.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/StackSlotColoring.cpp b/llvm/lib/CodeGen/StackSlotColoring.cpp index bae828a2263..234b2043a6a 100644 --- a/llvm/lib/CodeGen/StackSlotColoring.cpp +++ b/llvm/lib/CodeGen/StackSlotColoring.cpp @@ -381,7 +381,6 @@ bool StackSlotColoring::RemoveDeadStores(MachineBasicBlock* MBB) { I != E; ++I) { if (DCELimit != -1 && (int)NumDead >= DCELimit) break; - int FirstSS, SecondSS; if (TII->isStackSlotCopy(*I, FirstSS, SecondSS) && FirstSS == SecondSS && FirstSS != -1) { @@ -392,12 +391,18 @@ bool StackSlotColoring::RemoveDeadStores(MachineBasicBlock* MBB) { } MachineBasicBlock::iterator NextMI = std::next(I); - if (NextMI == MBB->end()) continue; + MachineBasicBlock::iterator ProbableLoadMI = I; unsigned LoadReg = 0; unsigned StoreReg = 0; if (!(LoadReg = TII->isLoadFromStackSlot(*I, FirstSS))) continue; + // Skip the ...pseudo debugging... instructions between a load and store. + while ((NextMI != E) && NextMI->isDebugValue()) { + ++NextMI; + ++I; + } + if (NextMI == E) continue; if (!(StoreReg = TII->isStoreToStackSlot(*NextMI, SecondSS))) continue; if (FirstSS != SecondSS || LoadReg != StoreReg || FirstSS == -1) continue; @@ -407,7 +412,7 @@ bool StackSlotColoring::RemoveDeadStores(MachineBasicBlock* MBB) { if (NextMI->findRegisterUseOperandIdx(LoadReg, true, nullptr) != -1) { ++NumDead; - toErase.push_back(&*I); + toErase.push_back(&*ProbableLoadMI); } toErase.push_back(&*NextMI); |