diff options
author | Matthias Braun <matze@braunis.de> | 2017-05-19 00:18:03 +0000 |
---|---|---|
committer | Matthias Braun <matze@braunis.de> | 2017-05-19 00:18:03 +0000 |
commit | d6e75ed93ed39e29a6a7e9241ea6cc6171808ae7 (patch) | |
tree | 23f58e1a2dd3cf68da84367f651ae2b64d7fa738 /llvm/lib | |
parent | 8700684aaa5ca4fccffb6481ccf3f4f655587892 (diff) | |
download | bcm5719-llvm-d6e75ed93ed39e29a6a7e9241ea6cc6171808ae7.tar.gz bcm5719-llvm-d6e75ed93ed39e29a6a7e9241ea6cc6171808ae7.zip |
LiveIntervalAnalysis: Fix missing case in pruneSubRegValues()
pruneSubRegValues() needs to remove subregister ranges starting at
instructions that later get removed by eraseInstrs(). It missed to check
one case in which eraseInstrs() would remove an instruction.
Fixes http://llvm.org/PR32688
llvm-svn: 303396
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/RegisterCoalescer.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp index 1803ea2b924..7b3a5d5c5ff 100644 --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -2666,11 +2666,17 @@ void JoinVals::pruneSubRegValues(LiveInterval &LI, LaneBitmask &ShrinkMask) { // Look for values being erased. bool DidPrune = false; for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) { - if (Vals[i].Resolution != CR_Erase) + // We should trigger in all cases in which eraseInstrs() does something. + // match what eraseInstrs() is doing, print a message so + if (Vals[i].Resolution != CR_Erase && + (Vals[i].Resolution != CR_Keep || !Vals[i].ErasableImplicitDef || + !Vals[i].Pruned)) continue; // Check subranges at the point where the copy will be removed. SlotIndex Def = LR.getValNumInfo(i)->def; + // Print message so mismatches with eraseInstrs() can be diagnosed. + DEBUG(dbgs() << "\t\tExpecting instruction removal at " << Def << '\n'); for (LiveInterval::SubRange &S : LI.subranges()) { LiveQueryResult Q = S.Query(Def); |