diff options
| author | Matthias Braun <matze@braunis.de> | 2015-02-16 22:05:17 +0000 |
|---|---|---|
| committer | Matthias Braun <matze@braunis.de> | 2015-02-16 22:05:17 +0000 |
| commit | 15635c5f851211eaa1c33ec0aeaf136da0878e95 (patch) | |
| tree | 5e696bac9dac3dd3227c026ae2dab8a2ebba571b /llvm/lib/CodeGen | |
| parent | 1b901a4435190c9a7d8c46841c01d60d725d5b92 (diff) | |
| download | bcm5719-llvm-15635c5f851211eaa1c33ec0aeaf136da0878e95.tar.gz bcm5719-llvm-15635c5f851211eaa1c33ec0aeaf136da0878e95.zip | |
RegisterCoalescer: Don't rematerialize subregister definitions.
We cannot simply rematerialize instructions which only defining a
subregister, as the final value also depends on the previous
instructions.
This fixes test/CodeGen/R600/subreg-coalescer-bug.ll with subreg
liveness enabled.
llvm-svn: 229444
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/RegisterCoalescer.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp index edcd7b22d3c..a8afd48bdf5 100644 --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -815,6 +815,22 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP, return true; } +/// Returns true if @p MI defines the full vreg @p Reg, as opposed to just +/// defining a subregister. +static bool definesFullReg(const MachineInstr &MI, unsigned Reg) { + assert(!TargetRegisterInfo::isPhysicalRegister(Reg) && + "This code cannot handle physreg aliasing"); + for (const MachineOperand &Op : MI.operands()) { + if (!Op.isReg() || !Op.isDef() || Op.getReg() != Reg) + continue; + // Return true if we define the full register or don't care about the value + // inside other subregisters. + if (Op.getSubReg() == 0 || Op.isUndef()) + return true; + } + return false; +} + bool RegisterCoalescer::reMaterializeTrivialDef(CoalescerPair &CP, MachineInstr *CopyMI, bool &IsDefCopy) { @@ -843,6 +859,8 @@ bool RegisterCoalescer::reMaterializeTrivialDef(CoalescerPair &CP, return false; if (!TII->isTriviallyReMaterializable(DefMI, AA)) return false; + if (!definesFullReg(*DefMI, SrcReg)) + return false; bool SawStore = false; if (!DefMI->isSafeToMove(TII, AA, SawStore)) return false; |

