summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/TailDuplication.cpp
diff options
context:
space:
mode:
authorPete Cooper <peter_cooper@apple.com>2015-05-07 21:48:26 +0000
committerPete Cooper <peter_cooper@apple.com>2015-05-07 21:48:26 +0000
commitba593ad3f345272ed49a01075c223580c338f875 (patch)
tree607ac9154fb34c339b25b1f3a60ed06d6346c2e7 /llvm/lib/CodeGen/TailDuplication.cpp
parentd6291964fb067fd0d294b97a861487c7c60d3292 (diff)
downloadbcm5719-llvm-ba593ad3f345272ed49a01075c223580c338f875.tar.gz
bcm5719-llvm-ba593ad3f345272ed49a01075c223580c338f875.zip
Clear kill flags in tail duplication.
If we duplicate an instruction then we must also clear kill flags on any uses we rewrite. Otherwise we might be killing a register which was used in other BBs. For example, here the entry BB ended up with these instructions, the ADD having been tail duplicated. %vreg24<def> = t2ADDri %vreg10<kill>, 1, pred:14, pred:%noreg, opt:%noreg; GPRnopc:%vreg24 rGPR:%vreg10 %vreg22<def> = COPY %vreg10; GPR:%vreg22 rGPR:%vreg10 The copy here is inserted after the add and so needs vreg10 to be live. llvm-svn: 236782
Diffstat (limited to 'llvm/lib/CodeGen/TailDuplication.cpp')
-rw-r--r--llvm/lib/CodeGen/TailDuplication.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TailDuplication.cpp b/llvm/lib/CodeGen/TailDuplication.cpp
index 04b39922627..23f41c8dd4b 100644
--- a/llvm/lib/CodeGen/TailDuplication.cpp
+++ b/llvm/lib/CodeGen/TailDuplication.cpp
@@ -449,6 +449,9 @@ void TailDuplicatePass::DuplicateInstruction(MachineInstr *MI,
DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg);
if (VI != LocalVRMap.end()) {
MO.setReg(VI->second);
+ // Clear any kill flags from this operand. The new register could have
+ // uses after this one, so kills are not valid here.
+ MO.setIsKill(false);
MRI->constrainRegClass(VI->second, MRI->getRegClass(Reg));
}
}
OpenPOWER on IntegriCloud