From 90605fcbe0cb46630279a92215a3103bf0dcc1bd Mon Sep 17 00:00:00 2001 From: gdk Date: Thu, 1 Aug 2019 23:43:59 -0300 Subject: [PATCH] Ensure that the selected register is valid on the hybrid allocator --- .../RegisterAllocators/HybridAllocator.cs | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/ARMeilleure/CodeGen/RegisterAllocators/HybridAllocator.cs b/ARMeilleure/CodeGen/RegisterAllocators/HybridAllocator.cs index a7a5ac20aa..f31325e679 100644 --- a/ARMeilleure/CodeGen/RegisterAllocators/HybridAllocator.cs +++ b/ARMeilleure/CodeGen/RegisterAllocators/HybridAllocator.cs @@ -162,29 +162,35 @@ namespace ARMeilleure.CodeGen.RegisterAllocators { int selectedReg = BitUtils.HighestBitSet(intFreeRegisters & ~regMasks.IntCallerSavedRegisters); - int mask = 1 << selectedReg; + if (selectedReg >= 0) + { + int mask = 1 << selectedReg; - intFreeRegisters &= ~mask; - intUsedRegisters |= mask; + intFreeRegisters &= ~mask; + intUsedRegisters |= mask; - info.PreAllocated = true; - info.Register = selectedReg; + info.PreAllocated = true; + info.Register = selectedReg; - intReservedCount++; + intReservedCount++; + } } else if (!info.Type.IsInteger() && vecReservedCount < 7) { int selectedReg = BitUtils.HighestBitSet(vecFreeRegisters & ~regMasks.VecCallerSavedRegisters); - int mask = 1 << selectedReg; + if (selectedReg >= 0) + { + int mask = 1 << selectedReg; - vecFreeRegisters &= ~mask; - vecUsedRegisters |= mask; + vecFreeRegisters &= ~mask; + vecUsedRegisters |= mask; - info.PreAllocated = true; - info.Register = selectedReg; + info.PreAllocated = true; + info.Register = selectedReg; - vecReservedCount++; + vecReservedCount++; + } } if (intReservedCount + vecReservedCount == 14)