summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-10-27 17:41:27 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-10-27 17:41:27 +0000
commit57143f7e7880d2359decf51486713ae9f5bd4283 (patch)
tree468396f398387fe88d1f28ac1e50d0661a3b7fc5 /llvm/lib/CodeGen
parentbd2c99b77cb69baab12bbbf2518555b9b006f6c2 (diff)
downloadbcm5719-llvm-57143f7e7880d2359decf51486713ae9f5bd4283.tar.gz
bcm5719-llvm-57143f7e7880d2359decf51486713ae9f5bd4283.zip
Never attempt to join an early-clobber def with a regular kill.
This fixes PR14194. llvm-svn: 166880
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/RegisterCoalescer.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp
index 2ca67d63257..75920744782 100644
--- a/llvm/lib/CodeGen/RegisterCoalescer.cpp
+++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp
@@ -1492,6 +1492,20 @@ JoinVals::analyzeValue(unsigned ValNo, JoinVals &Other) {
if ((V.WriteLanes & OtherV.ValidLanes) == 0)
return CR_Replace;
+ // If the other live range is killed by DefMI and the live ranges are still
+ // overlapping, it must be because we're looking at an early clobber def:
+ //
+ // %dst<def,early-clobber> = ASM %src<kill>
+ //
+ // In this case, it is illegal to merge the two live ranges since the early
+ // clobber def would clobber %src before it was read.
+ if (OtherLRQ.isKill()) {
+ // This case where the def doesn't overlap the kill is handled above.
+ assert(VNI->def.isEarlyClobber() &&
+ "Only early clobber defs can overlap a kill");
+ return CR_Impossible;
+ }
+
// VNI is clobbering live lanes in OtherVNI, but there is still the
// possibility that no instructions actually read the clobbered lanes.
// If we're clobbering all the lanes in OtherVNI, at least one must be read.
OpenPOWER on IntegriCloud