summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>2017-02-01 01:18:36 +0000
committerStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>2017-02-01 01:18:36 +0000
commit70c245e92dc7bad7588a542abc84a138a2eacc60 (patch)
tree5453b1c56a2e369013678b1c5404b3ab85a96a51 /llvm
parent7343b9f340decfe5287bc490df70d4b2cbca4628 (diff)
downloadbcm5719-llvm-70c245e92dc7bad7588a542abc84a138a2eacc60.tar.gz
bcm5719-llvm-70c245e92dc7bad7588a542abc84a138a2eacc60.zip
Fix regalloc assignment of overlapping registers
SplitEditor::defFromParent() can create a register copy. If register is a tuple of other registers and not all lanes are used a copy will be done on a full tuple regardless. Later register unit for an unused lane will be considered free and another overlapping register tuple can be assigned to a different value even though first register is live at that point. That is because interference only look at liveness info, while full register copy clobbers all lanes, even unused. This patch fixes copy to only cover used lanes. Differential Revision: https://reviews.llvm.org/D29105 llvm-svn: 293728
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/SplitKit.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp
index 1c6a84e5394..68999240355 100644
--- a/llvm/lib/CodeGen/SplitKit.cpp
+++ b/llvm/lib/CodeGen/SplitKit.cpp
@@ -522,6 +522,27 @@ VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
Def = LIS.getSlotIndexes()
->insertMachineInstrInMaps(*CopyMI, Late)
.getRegSlot();
+ if (LI->hasSubRanges()) {
+ LaneBitmask LM = LaneBitmask::getNone();
+ for (LiveInterval::SubRange &S : LI->subranges())
+ LM |= S.LaneMask;
+
+ if (MRI.getMaxLaneMaskForVReg(LI->reg) != LM) {
+ // Find subreg for the lane mask.
+ unsigned SubIdx = 0;
+ for (unsigned I = 1, E = TRI.getNumSubRegIndices(); I < E; ++I) {
+ if (TRI.getSubRegIndexLaneMask(I) == LM) {
+ SubIdx = I;
+ break;
+ }
+ }
+ if (SubIdx == 0)
+ report_fatal_error("Cannot find subreg index to cover all alive lanes");
+ CopyMI->getOperand(0).setSubReg(SubIdx);
+ CopyMI->getOperand(1).setSubReg(SubIdx);
+ CopyMI->getOperand(0).setIsUndef(true);
+ }
+ }
++NumCopies;
}
OpenPOWER on IntegriCloud