mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 16:29:20 +00:00
Don't use getPhysicalRegisterRegClass in PBQP. The existing checks that the
physical register can be allocated in the class of the virtual are sufficient. I think that the test for virtual registers is more strict than it needs to be, it should be possible to coalesce two virtual registers the class of one is a subclass of the other. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108118 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dfd3626b47
commit
cbeb3db8fd
@ -396,28 +396,23 @@ PBQPRegAlloc::CoalesceMap PBQPRegAlloc::findCoalesces() {
|
||||
if (srcRegIsPhysical && dstRegIsPhysical)
|
||||
continue;
|
||||
|
||||
// If it's a copy that includes a virtual register but the source and
|
||||
// destination classes differ then we can't coalesce, so continue with
|
||||
// the next instruction.
|
||||
const TargetRegisterClass *srcRegClass = srcRegIsPhysical ?
|
||||
tri->getPhysicalRegisterRegClass(srcReg) : mri->getRegClass(srcReg);
|
||||
|
||||
const TargetRegisterClass *dstRegClass = dstRegIsPhysical ?
|
||||
tri->getPhysicalRegisterRegClass(dstReg) : mri->getRegClass(dstReg);
|
||||
|
||||
if (srcRegClass != dstRegClass)
|
||||
// If it's a copy that includes two virtual register but the source and
|
||||
// destination classes differ then we can't coalesce.
|
||||
if (!srcRegIsPhysical && !dstRegIsPhysical &&
|
||||
mri->getRegClass(srcReg) != mri->getRegClass(dstReg))
|
||||
continue;
|
||||
|
||||
// We also need any physical regs to be allocable, coalescing with
|
||||
// a non-allocable register is invalid.
|
||||
if (srcRegIsPhysical) {
|
||||
// If one is physical and one is virtual, check that the physical is
|
||||
// allocatable in the class of the virtual.
|
||||
if (srcRegIsPhysical && !dstRegIsPhysical) {
|
||||
const TargetRegisterClass *dstRegClass = mri->getRegClass(dstReg);
|
||||
if (std::find(dstRegClass->allocation_order_begin(*mf),
|
||||
dstRegClass->allocation_order_end(*mf), srcReg) ==
|
||||
dstRegClass->allocation_order_end(*mf))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (dstRegIsPhysical) {
|
||||
if (!srcRegIsPhysical && dstRegIsPhysical) {
|
||||
const TargetRegisterClass *srcRegClass = mri->getRegClass(srcReg);
|
||||
if (std::find(srcRegClass->allocation_order_begin(*mf),
|
||||
srcRegClass->allocation_order_end(*mf), dstReg) ==
|
||||
srcRegClass->allocation_order_end(*mf))
|
||||
|
Loading…
Reference in New Issue
Block a user